Как использовать элементы маршрута вместо аргументов строки запроса для разбиения на страницы в CakePHP 4.x?

URL-адреса разбивки на страницы моего веб-сайта работали так, но перестали работать, когда я обновился до 4.x, например: 1-я страница: mywebsite.com/new - 2-я страница: mywebsite.com/new/page/2 и т. д. Я сделал это с помощью следующий код:

//routes.php        
$routes->connect('/new/page/:page',
        ['controller' => 'Articles', 'action' => 'latest'], [
        'pass' => [
            'page'
        ],
        'page' => '\d+'
    ]);
$routes->connect('/new', ['controller' => 'Articles', 'action' => 'latest']);

то в моем представлении/элементе разбиения на страницы у меня есть следующее:

//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 и т. д.

может кто-нибудь указать мне в правильном направлении?


person ndru    schedule 02.03.2020    source источник


Ответы (1)


Я бы посоветовал вам рассмотреть возможность изменения схемы URL-адреса, чтобы использовать стиль аргумента запроса. Использование элементов маршрута/URI просто означает дополнительную работу, чтобы функции пагинатора работали должным образом. Кроме того, все аргументы (SEO, удобочитаемость и т. д.), выдвинутые в пользу использования «красивых URL» для разбивки на страницы, которые были так популярны в те дни, оказались не чем иным, как болтовней.

При этом вам придется использовать настраиваемый/расширенный помощник разбивки на страницы, чтобы изменить способ генерации URL-адресов, поскольку по умолчанию помощник явно устанавливает параметр page (и все другие параметры, связанные с разбиением на страницы) в качестве аргументов строки запроса. У вас есть контроль над всеми сгенерированными URL-адресами, если вы переопределяете \Cake\View\Helper\PaginatorHelper::generateUrlParams().

Быстрый и грязный пример:

// 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;
    }
}

Это переместит значение параметра page в массив URL-адресов из конфигурации строки запроса в обычный параметр URL-адреса, т.е.

['controller' => 'Articles', 'action' => 'latest', '?' => ['page' => 1, /* ... */]]

в

['controller' => 'Articles', 'action' => 'latest', 1, '?' => [/* ... */]]

Но опять же, я настоятельно рекомендую рассмотреть возможность переключения на схему URL строки запроса.

Смотрите также

person ndm    schedule 17.03.2020