Extending the IndexController with a BaseController in Zend

前端 未结 4 1567
眼角桃花
眼角桃花 2021-02-08 15:17

I\'m trying to extend my controllers with a global base controller as such:

class BaseController extends Zend_Controller_Action {
 // common controller actions
          


        
相关标签:
4条回答
  • 2021-02-08 15:24

    Even more quicker solution (and conceptually more correct) is NOT to create base controllers at all:)

    You have common action? Use action helpers. You have some functionality that must be autorun? Use controller plugins.

    By design ZF controllers were made as flexible as possible, and limiting yourself by inheritance (and coupling it brings) is just not the best possible strategy.

    0 讨论(0)
  • 2021-02-08 15:35

    Autoloader

    Setup the autoloader and register your library which should be besides the Zend library with the autoloader like so (in your bootstrap.php after setting the include path):

    //AutoLoad loads classes automatically if they are used
    require_once 'Zend/Loader/Autoloader.php';
    $loader = Zend_Loader_Autoloader::getInstance();
    $loader->registerNamespace('Mylibrary_');
    

    Zend naming conventions

    Then you should rename your BaseController as follows

    /Zend (folder)
    /Mylibrary (folder)
        /Controller (folder)
            Action.php <-- this is your basecontroller file
    

    which contains:

    class Mylibrary_Controller_Action extends Zend_Controller_Action
    {
    }
    

    and your normal controllers in the controller folder:

    class IndexController extends Mylibrary_Controller_Action
    {
    }
    

    so basically when you want to extend the framework you keep a parallel structure in your own library.

    0 讨论(0)
  • 2021-02-08 15:39

    the quick solution that does not take advantage of the autoloader functionality is to require_once '/path/to/BaseController.php' in the index-controller file.

    If you have set-up autocontroller, then it can not find it, so you should consider checking what's wrong. Try the previous approach and inform on results.

    0 讨论(0)
  • 2021-02-08 15:46

    I would separate it into your own library, i.e. create the file library/YourApp/Controller/Action.php, and consequently name it YourApp_Controller_Action extends Zend_Controller_Action. From there you could place controllers where they should be and let them extend YourApp_Controller_Action in favor of Zend_Controller_Action.

    To find the file you should rely on the autoloader to look not just inside of library/Zend, but also in library/YourApp. I.e. look for the set_include_path in your bootstrap.

    With this technique you should keep in mind that your custom "basecontroller" might get bloated with methods that not all of your controllers needs to inherit.

    0 讨论(0)
提交回复
热议问题