Маршрутизация контроллера Zend Framework к модулю

Поэтому я изо всех сил старался усвоить как можно больше о Zend Framework, который для меня довольно нов, прошло около двух недель с момента моих первых попыток, и пока у меня все хорошо.

Однако я столкнулся с небольшой проблемой, которую просто не могу понять.

Итак, дело в том, что у меня есть стандартный проект Zend Framework с несколькими модулями. Нравится :

- Project
- - Application
- - - configs
- - - controllers
- - - - IndexController
- - - - WMSController
- - - forms
- - - layouts
- - - models
- - - modules
- - - - content
- - - - - controllers
- - - - - - IndexController
- - - - - models
- - - - - views
- - - - - Bootstrap
- - - views
- - - bootstrap
- - public

etc..

Теперь у меня есть простая тестовая ссылка, установленная в представлении для WMSController, которая должна направить кого-то, щелкнувшего ее, к IndexController модуля содержимого.

<a href="wms/content"> test link to content module</a>

Теперь, как вы, вероятно, видите, эта ссылка НЕ ​​будет работать, поскольку она указывает на localhost/wms/content, который будет действием содержимого в WMSController, которого в данный момент не существует.

Теперь я хочу сделать так, чтобы wms/content действительно указывал на IndexController модуля контента. Почему? Ну, я просто не хочу, чтобы пользователь вводил localhost/content, чтобы получить доступ к модулю контента, который является частью WMS. Я хочу заставить их сначала пройти через контроллер WMS.

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

Я хочу, чтобы URL-адрес указывал на конкретное действие в конкретном контроллере в конкретном модуле.

ПРИМЕЧАНИЕ. Все остальные контроллеры и представления по-прежнему являются сгенерированными по умолчанию версиями, и в них еще не внесено никаких изменений!

Если бы кто-нибудь мог показать мне пример кода того, как это делается, я был бы очень признателен!


person Björn    schedule 18.04.2012    source источник
comment
Использовать маршрутизатор?   -  person prodigitalson    schedule 18.04.2012
comment
Аналогичная проблема. stackoverflow.com/questions/9372055/ Просмотрите ответ, я думаю, это модуль mod_rewrite для apache.   -  person Weltschmerz    schedule 18.04.2012


Ответы (2)


Если я правильно понимаю, вы просто хотите, чтобы /wms/content указывало на модуль content контроллер Index действие индекс. Это тот случай, когда простой маршрутизатор будет работать (по крайней мере, пока вы не захотите получить более сложный)

В вашем application.ini добавьте следующие строки:

resources.router.routes.content.route = "wms/content"
resources.router.routes.content.defaults.module = "content" 
resources.router.routes.content.defaults.controller = "index"
resources.router.routes.content.defaults.action = "index"

это самый простой способ построить собственный маршрут.
*Примечание:*4-й параметр слева — это имя маршрута, поэтому, если вы используете его с методом, который позволяет использовать имена маршрутов (например, помощник url()) можно просто использовать название маршрута.
$this->url(array(), 'content');

Вот как вы будете использовать именованный маршрут, лично я, вероятно, подумал бы о переименовании моего модуля wms (если это возможно и целесообразно) и просто перенаправить туда из контроллера индекса по умолчанию. Потому что, как только вы начнете с именованных и настраиваемых маршрутов, будет трудно бросить...

person RockyFord    schedule 19.04.2012

Из вашего вопроса, что вы

хотите заставить их сначала пройти через контроллер WMS

Вы можете сделать одну вещь. Что бы вы ни хотели делать в WMSController всякий раз, когда пользователь вводит localhost/content/**, вы можете поместить его в родительский класс для ВСЕХ КОНТРОЛЛЕРОВ В МОДУЛЕ: «КОНТЕНТ». Таким образом, вы можете что-то проверять/выполнять операции каждый раз, когда на этот контроллер приходит запрос (независимо от того, хотел ли пользователь перейти к другому модулю).

класс Content_AnyController расширяет MyControllers_Controller_Action_Admin{ .... }

где

class Reviewmo_Controller_Action extends Zend_Controller_Action{ 
    public function init(){
    //Things you want to do each time
    }

}

Это то, чего я думаю, вы хотите достичь, потому что, если вы хотите просто перенаправить на ContentAction WMSController, вы можете просто перенаправить на этот контроллер.

person ShayanK    schedule 18.04.2012