Я знаю, что есть еще несколько тем по этому вопросу, но не они, похоже, соответствуют моим потребностям.
Что у меня есть
У меня 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 ...... }
Ваш код подключения маршрутизатора останется таким же. Пожалуйста, спросите, не сработало ли оно для вас.