Псевдоним контроллера CakePHP

Я знаю, что есть еще несколько тем по этому вопросу, но не они, похоже, соответствуют моим потребностям.

Что у меня есть

  • example.com/log/
  • LogsController.php

У меня LogsController вместо LogController (множественное число), потому что CakePHP хочет, чтобы у вас были контроллеры во множественном числе.

Но, как вы можете знать / заметить, example.com/log/ никогда не будет использовать LogsController из-за недостающих 's' в URL- LogsController .

Теперь я хочу, чтобы /log/* перенаправлялся в /logs/* . Работает отлично с помощью следующего кода:

 Router::connect ('/log/*', array('controller'=>'logs')); 

Но, когда я пытаюсь получить доступ к example.com/log/actions/foo/bar он не работает. Поэтому после некоторого Googeling я нашел это:

 Router::connect ('/log/:action/*', array('controller'=>'logs')); 

Прекрасно работает. Но теперь, когда я снова пытаюсь получить доступ к example.com/log/, он говорит:

Ошибка: LogController не найден.

Вопрос Итак, мой вопрос: как настроить псевдоним для моего URL-адреса, чтобы /log/ использовал LogsController вместо того, чтобы пытаться использовать LogController .

У меня есть еще несколько контроллеров, где я хотел бы изменить это, например, flight => FlightsController , profile => ProfilesController .


Посмотрите на этот вопрос . Речь идет о том же предмете, но немного отличается. Это может помочь вам каким-то образом.

Хорошо, с помощью некоторых других людей в IRC и тому подобное. Я узнал следующее.

Сочетание

 Router::connect('/flight/:action/*', array('controller'=>'flights')); Router::connect('/flight/*', array('controller'=>'flights')); 

делает трюк. Я пробовал это раньше, но в другом порядке, например:

 Router::connect('/flight/*', array('controller'=>'flights')); Router::connect('/flight/:action/*', array('controller'=>'flights')); 

который не работает.

Итак, первые 2 строки кода в этом сообщении решили для меня. Другой парень сказал мне, что решение Аруна Джаина не является надлежащим решением, потому что оно также меняет названия в ядре. Это вызовет проблемы с FormsHelper и такими классами. Поэтому я думаю, что я предпочту код в этом сообщении, так как это просто псевдоним вместо основной смены скрипта. Все равно, спасибо за помощь.

Чтобы сделать это с помощью маршрутизации, правильный подход заключен в следующем.

 Router::connect('/flight', array('controller'=>'flights','action'=>'index')); Router::connect('/flight/:action/*', array('controller'=>'flights')); 

Это сообщает маршрутизатору, что, когда действие найдено в URL-адресе, чтобы использовать его, но он не содержит никаких параметров, то по умолчанию используется действие индекса.

У меня есть немного другое мнение по этому поводу. Множественное число чаще является более точным способом работы с вещами, но в случаях, когда множественное число просто неверно, я добавляю исключение в класс Inflector (/ lib / Cake / Utility / Inflector).

В вашем примере я бы добавил log в этот список uninflected слов. Это означает, что системный торт не добавляет 's'. У вас будет свой LogController будет отображаться в папке «Просмотр Log » и т. Д. …

РЕДАКТИРОВАТЬ

Я столкнулся с гораздо более аккуратным способом сделать это из app/config/bootstrap.php

 Inflector::rules( 'plural', array( 'uninflected' => array('log') ) ); 

Это добавило бы log в uninflected list без необходимости изменять файлы в Core, чтобы упростить обновление версии.

Вы можете просто сделать это, используя следующее:

 class LogsController extends AppController { public $name = 'Log'; ..... YOUR REMAINING CODE ...... } 

Ваш код подключения маршрутизатора останется таким же. Пожалуйста, спросите, не сработало ли оно для вас.