Я только что имел дело с этим вопросом, но столкнулся с несколькими проблемами. Ответ Дэвида Вайнрауба приводит к большему количеству информации, в которой есть комментарий, а затем к странице, которая имеет кредит, который имеет основной / простой способ сделать это.
Чтобы избежать всех этих споров и добавить некоторые заметки о Windows против Linux, вот что я выучил.
Я хочу просто упорядочить некоторые административные контроллеры / действия в подкаталоге в моем каталоге контроллеров, например:
/application/controllers/
/application/controllers/admin/MyActionController.php
Я не хотел связываться с Модулями. Это не большой проект, который будет иметь все виды модулей, я просто хочу немного лучше организовать файлы администратора.
Во-первых, моей машиной для разработки является Win7 с Apache. Наши машины для постановки / производства - Linux (на основе Debian).
Самое простое решение - просто создать собственный маршрут (я расскажу о маршруте чуть ниже, чтобы узнать, что он делает для тех, кто с ними не знаком). Я делаю это в начальной загрузке как таковой:
->addRoute('AdminRoute',
new Zend_Controller_Router_Route('/admin/:action/*', array('controller'=>'Admin_Index', 'action'=>'index'))
)
Примечание
- 'controller' => 'Admin_Index' использует заглавные буквы. Хотя в этом примере это работает, я обнаружил, что это неправильное понимание того, как правильно объявлять имена контроллеров маршрутизатора. Мой следующий пример объяснит это.
Я бы тогда имел этот файл в этом каталоге:
/application/controllers/Admin/IndexController.php
и для файла Controller потребуется имя класса, например:
class Admin_IndexController extends Zend_Controller_Action
{
...
}
Это довольно просто.
Вот некоторые проблемы, с которыми я столкнулся. Windows и Linux известны наличием проблем с учетом регистра. Я полагаю, что Windows рассматривает вещи как нечувствительные к регистру, а Linux - с учетом регистра.
Кроме того, хотя в приведенном выше примере используется класс Admin Controller, называемый «index», у меня фактически было имя класса Camel-Case, например «AdminIndexController.php».
Это работало в Windows, но вызывало проблемы в Linux. Я все еще не уверен на 100%, где это происходит, но прошел и отладил-вывел некоторые процессы стандартного маршрутизатора и обнаружил, что для настройки настраиваемого маршрутизатора при настройке маршрутов требовался определенный формат.
Я полагаю, что при объявлении вашего контроллера в стандартном маршрутизаторе вы используете соглашение об именовании URL для синтаксического анализа вместо соглашения об именах классов ZF. Другими словами, может показаться, что маршрутизатор нечувствителен к регистру, поэтому верблюжья оболочка неправильно сообщает маршрутизатору, где найти маршрутизатор. Вместо этого мне нужно было использовать тире (я уже использовал подчеркивание).
Итак, если вы хотите иметь файл с таким именем:
/application/controllers/Admin/FooIndexController.php
Вы должны объявить свой пользовательский маршрутизатор следующим образом:
->addRoute('AdminRoute',
new Zend_Controller_Router_Route('/admin/:action/*', array('controller'=>'admin_foo-index', 'action'=>'index'))
)
и имя вашего класса контроллера будет:
class Admin_FooIndexController extends Zend_Controller_Action
{
...
}
Пользовательский маршрутизатор
Чтобы объяснить клиентский маршрутизатор, в основном говорится, что для любого URL, начинающегося с:
"/admin/"
Используйте определенный контроллер и действие. Я установил контроллер по умолчанию на «admin_index» или «admin_foo-index» в следующем примере.
Часть контроллера ": action /" похожа на переменную, которая сообщает ZF, что что-то должно быть, есть часть URL. Однако мы можем дать ему значение по умолчанию, если оно оставлено пустым. Вроде как аргументы по умолчанию в функциях программирования.
В этом случае я устанавливаю 'action' => 'index'. По умолчанию он будет использовать действие «index», если ни одно из них не объявлено.
Если указано значение, оно будет использовать это значение. Так что, если кто-то использует URL (при условии, что мы используем второй пример выше):
/admin/users/
Маршрутизатор будет использовать контроллер / действие
/application/controllers/Admin/FooIndexController.php
...
/* inside controller*/
function usersAction(){
...
}
Надеюсь, это немного поможет. Я только что прошел этот процесс устранения неполадок, и это то, что я обнаружил и решил проблемы, которые у меня были.
Ура!