Динамические URL-адреса CakePHP (2.0)

#php #cakephp #url-routing

#php #cakephp #url-маршрутизация

Вопрос:

В настоящее время я изучаю CakePHP 2.0 и хочу преобразовать старые проекты 1.3 в 2.0. Я собираюсь начать с нуля, потому что в проектах много кода, который мог бы быть намного лучше.

Одна из таких вещей — динамические URL-адреса, многоязычные проекты и даже изменение URL-адресов на выбранный язык. Например:

Английский: /pages/new-article голландский: /paginas/nieuw-artikel

Оба будут идти в PagesController::display();

Примечание: URL-адреса могут быть намного длиннее, страницы могут иметь подстраницы, и они также будут добавлены к URL-адресу. Например: /pages/new-article/article-subpage

Теперь, как я делал это раньше, нужно иметь маршрут для всего, что ведет к определенному действию. Например, * собирается PagesController::index();

Однако это, похоже, замедляет работу приложений и вместе с этим создает множество проблем.

Итак, мой вопрос к вам: есть ли более простой способ сделать это?

Я не хочу ничего жестко кодировать, я должен иметь возможность изменять /pages/article /page/article без необходимости изменения кода.

Примечание: Если вы знаете способ сделать это в 1.2 или 1.3, это тоже было бы здорово, 2.0 не так уж и отличается.

Ответ №1:

Ну, я понял это, по-видимому, CakePHP 1.3 и 2.0 позволяют создавать пользовательские классы маршрутов. Это в документации здесь: http://book.cakephp.org/2.0/en/development/routing.html ?выделить= маршрут #пользовательские классы маршрутов

Итак, в основном, что вам нужно сделать, это создать файл APP/Lib/Routing/Route/UrlRoute.php со следующим содержимым:

 class UrlRoute extends CakeRoute{

    public function parse($url){
        $params = parent::parse($url);

        # Here you get the controller and action from a database.

        // tmp
        $params['controller'] = 'pages';
        $params['action'] = 'index';

        return $params;
    }
}
 

И в вашем APP/Config/routes.php вы указываете следующее:

 App::import('Lib', 'Routing/Route/UrlRoute');
Router::connect('/*', array('controller' => 'tests', 'action' => 'index'), array('routeClass' => 'UrlRoute'));
 

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