2012-01-11 1 views
0

У меня есть проект Zend с большим количеством контроллеров и действий с использованием методаКак избежать повторения строк в методах перенаправления Zend?

$this->_redirect('/controller_name/action_name'); 

перенаправление на другие действия, после обработки данных. Я заметил, что это создает множество «магических строк», которые наносят ущерб принципу DRY: если я изменю контроллер или имя действия, мне придется изменить этот код перенаправления во всех действиях, которые его используют. Я хотел бы знать, есть ли лучший способ в Zend, чтобы избежать этого. Я думал о создании констант для всех контроллеров и названий действий, например:

$this->_redirect(HOME_CONTROLLER_INDEX); 

Но я думаю, что этот подход не очень хорошо. Есть ли лучшее решение?

+0

Не могли бы вы объяснить, почему вы не хотите использовать 'Определить()'? Это кажется довольно хорошей идеей. – jprofitt

+0

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

+0

Если не определяет, то некоторые расширяются, я бы сказал. Расширьте либо контроллер (не рекомендуется), либо создайте помощник действий (вам придется переписать много ваших текущих перенаправлений), которые будут принимать строковый ключ (например, «HOME_CONTROLLER_INDEX'), а затем использовать его внутреннюю таблицу поиска, чтобы увидеть, какой URL-адрес это должно быть перенаправлено. Вам нужно будет только поддерживать и обновлять таблицу поиска. – bububaba

ответ

1

Вы можете использовать Const вместо

class DefaultController extends Zend_Controller_Action { 
    const IndexAction = '/controller/action/'; 

    ... 
    $this->_redirect(DefaultController::IndexAction); 
} 

Или SplEnum. См.: http://www.php.net/manual/de/class.splenum.php

+0

Это работает хорошо, но мне пришлось поставить директиву 'includePaths.controllers' в application.ini. – Karlisson

1

Ваш вариант определения константы будет жизнеспособным, если вы не планируете изменять свой маршрутизатор (поскольку вы используете «скомпилированный» URL-адрес).

$this->_redirect('/controller/action'); 

В противном случае, вы можете рассчитывать на несколько частных методов, которые требуют помощника в redirector действий.

public function redirectControllerAction() 
{ 
    $this->_helper->redirector('action', 'controller'); 
} 

Таким образом, вы можете иметь все ваши переназначения локализованы в вашем controllers.

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

Вы также можете использовать метод контроллера для отправки сообщения своему пользователю с помощью флэш-мессенджера без особых усилий.

public function redirectControllerAction() 
{ 
    $this->_helper->flashMessenger('You have been redirected to a better location'); 
    $this->_helper->redirector('action', 'controller'); 
} 
0

Для имени контроллера назначения, вы можете добавить этот статический метод:

public static function getName() { return __CLASS__; } 

(Вам нужно добавить код, чтобы удалить суффикс контроллера и вызвать Zend_Filter_Word_xxx выполнять сгибание)

и используйте это следующим образом:

$this->_redirect('/'.DefaultController::getName().'/action_name'); 
Смежные вопросы