ZF. Выполнение кода для всех контроллеров

fire-one

Новичок
ZF. Выполнение кода для всех контроллеров

Добрый день.

Во-первых, куда задавать вопросы по Zend Framework ? В этот раздел ?

Ну и, во -вторых, сам вопрос.
Для всех контроллеров у меня есть определенные данные которые приходится выполнять в каждом контроллере. Вот пример:
PHP:
    protected $db;
    protected $wall_table;
    
    public function init(){
        $this->db->main = Zend_Registry::get('main_dbAdapter');
        $this->db->local = Zend_Registry::get('local_dbAdapter');
        $this->wall_table = new wall;
    }
Куда можно вынести этот код чтобы не выполнять каждый раз одно и то же.
Спасибо
 

fire-one

Новичок
iceman, ну наверняка же в ZF есть готовые решения для этого
если я так все отдельными файлами делать буду - я скоро свой собственный фреймворк буду инклюдить :D
 

Gas

может по одной?
Сделай базовый контроллер в котором будет эта инициализация и от него наследуйся.
 

fire-one

Новичок
Gas, эм. можно мне пальцем тыкнуть где базовый контроллер делать ?
 

dimagolov

Новичок
fire-one, ну ты же наследуешь от кого-то свои контроллеры? Вот и сделай в иерархии звено, которое бы выполняло эти общие для всех контроллеров действия.
 

iceman

говнокодер
Your_Base_Controller extend Zend_Controller {}
Your_Controller extend Your_Base_Controller {}

м.б. так?
 

Духовность™

Продвинутый новичок
и в базовом контроллере будет таскаться все это дело. даже тогда, когда это не нужно.
 

iceman

говнокодер
а зачем его считать базовым, так где не надо - не наследовать...
 

KolyaA

Новичок
У меня подобный же вопрос назрел.

Есть куча разных моих функций, которые используются в разных контроллерах. Я сделал то, что предложил Гас: сделал

class MoyController extends Zend_Controller_Action

от которого наследуют все остальные контроллеры, например:

class IndexController extends MoyController.

В общем всё работает, но обуревают сомнения - праильно ли это. Например, всё таскается когда и ненужно, как сказал Триумвират. Может простой include лучше? Как более правильно с точки зрения построения ZF? Кто как делает?
 

tf

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

Духовность™

Продвинутый новичок
а трудно сделать несколько суб базовых контроллееров под свои нужды?
Когда мы в один базовый/суб класс пихаем какой-то код, например

PHP:
class base 
{
    public function __construct(){
        $this->main = Zend_Registry::get('main_dbAdapter');
        $this->local = Zend_Registry::get('local_dbAdapter');
    }
то этот базовый класс становится базовым для всех контроллеров, в которых НУЖНЫ экземпляры $this->main, $this->local. Что будет, когда нам понадобится в другом классе ещё и экземпляр $this->other? Правильно, мы напишем класс с дублирующим кодом:

PHP:
class base2 
{
    public function __construct(){
        $this->main = Zend_Registry::get('main_dbAdapter');
        $this->local = Zend_Registry::get('local_dbAdapter');
        [b]$this->other = Zend_Registry::get('Other');[/b]
    }
ценности от подобного кодинга - ноль. Ибо на практике все выльется в громоздкую конструкцию base-контроллеров.

Поэтому я ЗА компонентный подход.
 

korchasa

LIMB infected
Автор оригинала: triumvirat
то этот базовый класс становится базовым для всех контроллеров, в которых НУЖНЫ экземпляры $this->main, $this->local. Что будет, когда
нам понадобится в другом классе ещё и экземпляр $this->other? Правильно, мы напишем класс с дублирующим кодом:

ценности от подобного кодинга - ноль. Ибо на практике все выльется в громоздкую конструкцию base-контроллеров.

Поэтому я ЗА компонентный подход.
Проблемы будут не в этом случае
PHP:
class base2 extends base
{
    public function __construct(){
        parent::__construct();
        $this->other = Zend_Registry::get('Other');
    }
А в случае, если нам main и other, но не нужен local. Но и это решаемо, через замену наследования делегированием.

Какие компоненты ты имеешь ввиду?
 

tf

крылья рулят
вот если большая, надо думать каким образом выделить несколько главных
а потом в экшенах писать вызовы только того, чего тебе надо
PHP:
private init() {
    $this->initA();
    $this->initB();
}
 

AmdY

Пью пиво
Команда форума
а я не понимаю зачем забивать неймспэйс сомнительными переменными, которые как и говорил triumvirat могут не понадобиться.
почему не делать
PHP:
    public function indexAction(){ 
        $list = Zend_Registry::get('main_dbAdapter')->runMethod(); 
        $wall_table = new Wall();
    }
а лучше через наследование превратить Zend_Registry в Service_Locator с ленивой инициализацией. Любители 100% покрытия тестами могут начинать бросать камни :(
PHP:
    public function indexAction(){ 
        $list = Service_Locator::getMainDbAdapter()->runMethod(); 
    }
 
Сверху