首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CakePHP 4.x中使用路由元素而不是查询字符串参数进行分页?

如何在CakePHP 4.x中使用路由元素而不是查询字符串参数进行分页?
EN

Stack Overflow用户
提问于 2020-03-02 17:25:37
回答 1查看 187关注 0票数 1

我的网站分页urls是这样工作的,但是当我升级到4.x时,它就停止工作了--例如:1页:mywebsite.com/new-2 page: mywebsite.com/new/page/2等等。我这样做的代码如下:

代码语言:javascript
复制
//routes.php        
$routes->connect('/new/page/:page',
        ['controller' => 'Articles', 'action' => 'latest'], [
        'pass' => [
            'page'
        ],
        'page' => '\d+'
    ]);
$routes->connect('/new', ['controller' => 'Articles', 'action' => 'latest']);

然后,在我的视图/分页元素中,我有以下内容:

代码语言:javascript
复制
//view   
$this->Paginator->options(['url' => ['controller' => 'Articles', 'action' => 'latest']]);

当直接访问它们时,URL mywebsite.com/new/page/2、3等仍然有效,但是通过视图中的分页器创建的链接是mywebsite.com/new?page=2、3等,而它们应该是mywebsite.com/new/page/2、3等等。

有人能给我指明正确的方向吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-17 13:22:27

我建议您考虑可能更改URL模式以使用查询参数样式。使用路由/URI元素只意味着要使分页器特性正常工作需要做更多的工作。此外,所有的参数(SEO,可读性,等等)的使用“漂亮的URL”的分页,是如此流行的在过去,原来是什么都是热空气。

尽管如此,您必须使用自定义/扩展分页器助手来更改URL的生成方式,因为默认情况下,助手将显式地将page参数(和所有其他分页相关参数)设置为查询字符串参数。如果覆盖\Cake\View\Helper\PaginatorHelper::generateUrlParams(),则可以控制所有生成的URL。

一个快速而肮脏的例子:

代码语言:javascript
复制
// src/View/Helper/PaginatorHelper.php

/*
Load in `AppView::initialize()` via:

$this->loadHelper('Paginator', [
    'className' => \App\View\Helper\PaginatorHelper::class
]);
*/

declare(strict_types=1);

namespace App\View\Helper;

class PaginatorHelper extends \Cake\View\Helper\PaginatorHelper
{
    public function generateUrlParams(array $options = [], ?string $model = null, array $url = []): array
    {
        $params = parent::generateUrlParams($options, $model, $url);

        if (isset($params['?']['page'])) {
            $params[0] = $params['?']['page'];
            unset($params['?']['page']);
        } else {
            $params[0] = 1;
        }

        return $params;
    }
}

,这将移动到URL数组中的page参数值,从查询字符串配置转移到常规的URL参数(即转

代码语言:javascript
复制
['controller' => 'Articles', 'action' => 'latest', '?' => ['page' => 1, /* ... */]]

转到

代码语言:javascript
复制
['controller' => 'Articles', 'action' => 'latest', 1, '?' => [/* ... */]]

但是,我再次强烈建议考虑切换到查询字符串URL模式。

另请参阅

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60493813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档