分页链接一般是这样:list?page=1,很多人想把这种样式的url美化一下,弄成这样:list/page/1,由于框架本身不支持所以需要自己去修改相关代码实现
以TP6为例,打开框架的分页基础类Paginator.php,找到url方法,原始方法是这样
protected function url(int $page): string
{
if ($page <= 0) {
$page = 1;
}
if (strpos($this->options['path'], '[PAGE]') === false) {
$parameters = [$this->options['var_page'] => $page];
$path = $this->options['path'];
} else {
$parameters = [];
$path = str_replace('[PAGE]', $page, $this->options['path']);
}
if (count($this->options['query']) > 0) {
$parameters = array_merge($this->options['query'], $parameters);
}
$url = $path;
if (!empty($parameters)) {
$url .= '?' . http_build_query($parameters, '', '&');
}
return $url . $this->buildFragment();
}
对该方法部分代码进行修改,实现美化分页url效果
protected function url(int $page)
{
if ($page <= 0) {
$page = 1;
}
if (strpos($this->options['path'], '[PAGE]') === false) {
$parameters = [$this->options['var_page'] => $page];
$path = $this->options['path'];
} else {
$parameters = [];
$path = str_replace('[PAGE]', $page, $this->options['path']);
}
if (count($this->options['query']) > 0) {
$parameters = array_merge($this->options['query'], $parameters);
}
$url = $path=='/'?'':$path;
$suffix=pathinfo($url,PATHINFO_EXTENSION);
$suffix=$suffix?'.'.$suffix:'';
$url=str_replace($suffix,"",$url);
if (!empty($parameters)) {
if(isset(request()->param()[$this->options['var_page']])){
$url=preg_replace("(".$this->options['var_page']."/\d+)",$this->options['var_page'].'/'.$page,request()->url());
}else{
$str='';
foreach ($parameters as $k=>$v){
$str.='/'.$k.'/'.$v;
}
$url.=$str.$suffix;
}
}
return $url . $this->buildFragment();
}
该方法适用于TP5,TP6,曾使用在我自己的网站没有发现问题,如有bug或更简单的方法欢迎指正。