#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.