Расширить контроллер из контроллера в другой модуль? - PullRequest
6 голосов
/ 05 мая 2011

У меня есть этот модуль под названием «olo», который обрабатывает все наши онлайн-заказы.

Теперь я создал новый модуль под названием «olosec», потому что я хочу сделать другую версию с небольшим измененным потоком и некоторыми другими изменениями в некоторых контроллерах.

Можно ли расширить контроллер в 'olosec' с контроллером в 'olo'?

На данный момент я пробовал

class Olosec_CartController extends Olo_CartController

Что выдает ошибку типа

Warning: include_once(Olo/CartController.php): failed to open stream: 
No such file or directory in /httpdocs/library/Zend/Loader.php on line 146 Warning:
include_once(): Failed opening 'Olo/CartController.php' for inclusion.
bla bla bla (include path) bla bla bla

Моя структура каталогов выглядит примерно так (спасибо tree \F \A и EditPlus ++ )

+---application
|   +---views
|   |   +---scripts
|   |   +---layouts
|   |   |   +---default
|   |   |   +---admin
|   |   +---languages
|   |   +---helpers
|   +---modules
|   |   +---admin
|   |   +---mobile
|   |   +---olo
|   |   |   +---controllers
|   |       |       IndexController.php
|   |       |       MenuController.php
|   |       |       CartController.php
|   |       |       OrderlistController.php
|   |   |   |
|   |   |   +---models
|   |   |   \---views
|   |   |       +---helpers
|   |   |       \---scripts
|   |   |           +---index
|   |   |           +---menu
|   |   |           +---cart
|   |   |           \---orderlist
|   |   \---olosec
|   |       +---controllers
|   |       |       IndexController.php
|   |       |       MenuController.php
|   |       |       CartController.php
|   |       |       OrderlistController.php
|   |       |
|   |       +---models
|   |       \---views
|   |           +---helpers
|   |           \---scripts
|   |               +---index
|   |               +---menu
|   |               +---cart
|   |               \---orderlist
|   +---models
|   +---controllers
|   \---configs
+---library
+---public
|   +---cli
|   \---default
+---tests
\---data

Обновление

Я использовал этот "мерзкий" взлом, который работает

require_once( APPLICATION_PATH . '/modules/olo/controllers/CartController.php');

Обновление @ Ракеш

У меня есть это в моей начальной загрузке ..

function _initAutoloader() {
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);
    return $autoloader;
}

В моем приложении .ini

autoloadernamespaces.0 = "Zend"
autoloadernamespaces.1 = "My"
autoloadernamespaces.2 = "Something"

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Если вы создали экземпляр класса из Zend Autoloader, ошибка должна исчезнуть.

В вашем файле bootstrap.php должен быть следующий код:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
       'namespace' => '',
       'basePath'  => APPLICATION_PATH . '/modules',
    ));
    return $autoloader;
}

В общем случае контроллеры загружаются через Zend_Controller_Dispatcher, вы должны использовать Zend_Application_Module_Autoloader для создания экземпляра класса из других контроллеров.

1 голос
/ 05 мая 2011

Почему бы не иметь пользовательскую папку библиотеки для общих классов

application/
    library/    < for common classes

Если вы используете некоторые классы не только в одном контроллере, но и во многих местах вашего проекта, это хороший подход.

Вам просто нужно добавить эту новую папку application/library/ в include path в вашем файле Boostrap.

Другой подход - иметь помощника действий.Но, как я описал, папка общих классов должна быть хорошим решением.Однако я нашел некоторые интересные ресурсы, большинство из которых посвящены кросс-модульному кодированию, но они могут помочь вам в любом случае http://zend -framework-community.634137.n4.nabble.com / Code-re-use-through-modules-td668554.html и Как использовать одни и те же модели в разных модулях в Zend Framework?


Позвольте мне описать другой подход

class BasicController extends Zend_Controller_Action
{
    public static $variable = '';

    public function init()
    {
        self::$variable = 'assign value';
    }
}

class HomeController extends BasicController
{
    public function indexAction()
    {
        $bioVar = parrent::$variable;
    }
}

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

...