J'ai un projet Laravel qui nécessite un traitement pseudo-statique. Le projet utilise le propre composant de pagination de Laravel, qui utilisera Query pour transmettre le numéro de page dans votre URL, sans parvenir à répondre au pseudo. -exigences statiques.L'effet souhaitéL'effet que nous souhaitons pour le pseudo-statique ressemble à peu près à ceci :
/software/3dmax/created_at/page-1.html
/software/{category}/{order}/page-{page}.html
/software/3dmax/created_at/page-1.html?category=3dmax&order=created_at&page=2
dans le modèle, puis transmettrons le numéro de page de chaque page. La méthode paginate
paginate
sous IlluminateDatabaseConcernsBuildsQueries
. La méthode paginator
paginator
. IlluminatePaginationLengthAwarePaginator
IlluminatePaginationLengthAwarePaginator
dans IlluminatePaginationAbstractPaginator
pour construire les paramètres et l'URL de la requête. url
mkdir app/Pagination touch app/Pagination/LengthAwarePaginator.php
<?php namespace App\Pagination; use Illuminate\Support\Arr; use Illuminate\Support\Str; use Illuminate\Pagination\LengthAwarePaginator as BasePaginator; class LengthAwarePaginator extends BasePaginator { }
... public function url($page) { if ($page <= 0) { $page = 1; } $parameters = [$this->pageName => $page]; if (count($this->query) > 0) { $parameters = array_merge($this->query, $parameters); } //判断的参数是否在 路由中 需要绑定的数据 $params = \request()->route()->parameters(); if (!empty($params)) { foreach ($parameters as $key => $parameter) { if (isset($params[$key])) { $params[$key] = $parameter; unset($parameters[$key]); } } $path = route(\request()->route()->getAction('as'), $params); } else { $path = $this->path; } // 判断是否有参数 if (empty(Arr::query($parameters))) { return $path . $this->buildFragment(); } return $path . (Str::contains($this->path, '?') ? '&' : '?') . Arr::query($parameters) . $this->buildFragment(); } ...
dans , mais la méthode paginate
est définie sous paginate
Si nous devons la réécrire, ce sera très gênant. Un autre problème est que toutes nos paginations n'ont pas besoin d'être pseudo-statiques. par exemple, les données de notre centre utilisateur peuvent ne pas avoir besoin de données pseudo-statiques. Nous avons donc besoin de quelque chose qui peut être défini manuellement. Il y a une portée locale dans le modèle Larave. Nous pouvons écrire une méthode IlluminateDatabaseEloquentBuilder
Lorsque nous avons besoin d'utiliser une pagination statique, nous pouvons l'appeler avec staticPaginate
. Laravel La méthode Model->query()->staticPaginate();
intégrée est similaire. pageinage
Nous définissons généralement une classe de base du modèle dans le répertoire IlluminateDatabaseEloquentModel
, et tous les modèles. L'héritage de la classe de base Model n'est pas nécessaire, mais cela est plus pratique pour modifier le modèle ou ajouter des méthodes publiques. appModels
sous IlluminateDatabaseEloquentBuilder
et de modifier le pointeur de paginate
$this
... use Illuminate\Pagination\Paginator; # Laravel 自带的。 use Illuminate\Contracts\Pagination\LengthAwarePaginator; ... /** * 自定义静态分页 * @author kingofzihua * @param Builder $builder * @param int $perPage * @param array $columns * @param string $pageName * @param int|null $page * @return LengthAwarePaginator * * @throws \InvalidArgumentException */ public function scopeStaticPaginate($builder, $perPage = null, $columns = ['*'], $pageName = 'page', $page = null) { if (request('page')) { request()->offsetSet('page', request('page')); } $page = $page ?: Paginator::resolveCurrentPage($pageName); $perPage = $perPage ?: $builder->getModel()->getPerPage(); $results = ($total = $builder->toBase()->getCountForPagination()) ? $builder->forPage($page, $perPage)->get($columns) : $builder->getModel()->newCollection(); return $this->paginator($results, $total, $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); } ...
# 替换 use App\Pagination\LengthAwarePaginator; # --- use Illuminate\Contracts\Pagination\LengthAwarePaginator; // 注释 ... /** * * @param \Illuminate\Support\Collection $items * @param int $total * @param int $perPage * @param int $currentPage * @param array $options * @return LengthAwarePaginator */ protected function paginator($items, $total, $perPage, $currentPage, $options) { return Container::getInstance()->makeWith(LengthAwarePaginator::class, compact( 'items', 'total', 'perPage', 'currentPage', 'options' )); } ...
Model::query()->staticPaginate($pageSize);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!