Путь к Zend-контроллеру с субдиректориями - PullRequest
2 голосов
/ 28 июня 2011

Я использую Zend Framework 1.11.x

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

controller
 --- MemberController.php

вместо

controller
 --Member
    ---MemberController.php

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

$ это-гиперссылка (массив (контроллер => 'член' ....)

он не может найти контроллер для создания URL

Как мне сопоставить этот подкаталог? Должен ли я поместить каждый путь к подкаталогу в application.ini?

Если так, есть ли способ сделать это в общем, чтобы я мог просто поместить (который у меня есть) базовый путь в application.ini?

спасибо

Ответы [ 4 ]

2 голосов
/ 29 июня 2011

, если вы планируете группировать контроллеры вместе, вам может быть лучше использовать стандартную модульную структуру zend:

В начальной загрузке вы добавите каталог для каждого модуля:

 $frontController = Zend_Controller_Front::getInstance();

 $frontController->setControllerDirectory(array(
   'default' => APPLICATION_PATH . '/controllers',
  'blog'    => APPLICATION_PATH . '/blog/controllers'
  'api'    =>   APPLICATION_PATH . '/api/controllers'

));

Легко управлять и обслуживать, потому что модули автономны и отделены друг от друга.http://framework.zend.com/manual/en/zend.controller.modular.html

1 голос
/ 02 февраля 2012

Я только что имел дело с этим вопросом, но столкнулся с несколькими проблемами. Ответ Дэвида Вайнрауба приводит к большему количеству информации, в которой есть комментарий, а затем к странице, которая имеет кредит, который имеет основной / простой способ сделать это.

Чтобы избежать всех этих споров и добавить некоторые заметки о 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(){
    ...
}

Надеюсь, это немного поможет. Я только что прошел этот процесс устранения неполадок, и это то, что я обнаружил и решил проблемы, которые у меня были.

Ура!

1 голос
/ 29 июня 2011
0 голосов
/ 29 апреля 2014

Когда вы помещаете контроллер в подкаталог, вам следует изменить имя класса контроллера с добавлением FOLDER_NAME и _.

В вашем случае имя класса члена контроллера изменится на

Member_MemberController

Тогда URL для доступа к этому контроллеру будет

SITE_PATH/Member_Member
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...