CakePHP (2.0) Динамические URL - PullRequest
1 голос
/ 01 ноября 2011

В настоящее время я изучаю 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 Ответ

5 голосов
/ 01 ноября 2011

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

Итак, в основном вам нужно создать файл 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.

...