Zend框架1.11:在bootstrap中访问模型

时间:2012-02-10 15:30:38

标签: php zend-framework

我正在尝试将ACL设置从model目录传递到bootstrap中的ACL插件。

    public function _initPlugins()
        {

        $frontController = Zend_Controller_Front::getInstance();
        $frontController->registerPlugin(new Petra_Plugin_Layout_MultiLayout());
        $frontController->registerPlugin(new Petra_Plugin_Controller_AclCheck(new Auth_Model_Acl_Acl()));   

        }

但是自动加载器在Auth模块中找不到类Auth_Model_Acl_Acl。有没有办法在bootstrap中初始化MVC结构?或者可能有更好的方法来存储ACL设置?

编辑 - 更多信息:

自举:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

private $view;

public function _initProperties()
{
    $this->bootstrap("layout");
    $layout = $this->getResource('layout');
    $this->view = $layout->getView();
}


public function _initAutoload()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace("Petra_");

            // Added recently - not helping :(
    $moduleLoader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH . '/modules'

            ));

    $test = new Auth_Model_Acl_Acl();
    return $moduleLoader;


}

public function _initPlugins()
{

    $frontController = Zend_Controller_Front::getInstance();
    $frontController->registerPlugin(new Petra_Plugin_Layout_MultiLayout());

}





}

的application.ini:

enter code here

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.params.displayExceptions = 0

resources.modules = ""
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

目录结构:

/Application
    /Config
        application.ini  
    /layouts
        default.phtml
    /modules
        /admin
            ...
        /auth
            /controllers
                ...
            /models
                /Acl
                    Acl.php
            /views
                ...
boostrtrap.php

6 个答案:

答案 0 :(得分:4)

这在很大程度上取决于Auth_Model_Acl_Acl类的存储位置。

如果它位于包含路径上,可能在library/Auth/Model/Acl/Acl.php中,那么您只需要使用自动加载器注册命名空间。在configs/application.ini中,只需添加:

autoloadernamespaces[] = "Auth_"

如果类位于名为auth的模块中,以便它驻留在文件application/modules/auth/model/Acl/Acl.php中,那么您只需要确保已正确启动模块,通常在{{1}中使用以下内容: }:

configs/application.ini

这将启动模块应用程序资源插件,该插件又会注册一个module-autololoader,它应该正确映射到您的Acl类。

但是,如果这个类想要驻留在其他地方 - 比如在应用程序根目录或其他模块中 - 那么你必须设置一些其他的resource autoloader映射。

答案 1 :(得分:1)

您可以定义资源自动加载器'Zend_Application_Module_Autoloader'来查找没有命名空间的类以及目录APPLICATION_PATH。 '/模块的

自动加载器有一系列资源:

array(8) {
  ["Model_DbTable"]=>
  string(74) "/path/to/application/modules/models/DbTable"
  ["Model_Mapper"]=>
  string(74) "/path/to/application/modules/models/mappers"
  ["Form"]=>
  string(65) "/path/to/application/modules/forms"
  ["Model"]=>
  string(66) "/path/to/application/modules/models"
............
}

资源自动加载器将此类'Auth_Model_Acl_Acl'发现为'Auth'或'Auth_Model'或'Auth_Model_Acl'或Auth_Model_Acl_Acl'的资源。这些不是有效的资源。自动加载器将在第177行'Zend_Loader_Autoloader_Resource'返回false。

以下内容将自动加载您的模型类:

        $moduleLoader = new Zend_Application_Module_Autoloader(array(
                    'namespace' => 'Auth',
                    'basePath' => APPLICATION_PATH . '/modules/auth'
                ));

解决方案(创建自定义自动加载器): 在自动装带器后添加以下内容。您可以将'Petra_Autoloader'更改为您想要的任何其他课程。

$autoloader->pushAutoloader(new Petra_Autoloader, '');

创建一个实现Zend_Loader_Autoloader_Interface

的类
class Petra_Autoloader implements Zend_Loader_Autoloader_Interface{

    public function autoload($class)
    {
        // your implementation to load the class

    }
}

bootstrap.php中

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

//............
    public function _initAutoload() {

        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->registerNamespace("Petra_");

        $autoloader->pushAutoloader(new Petra_Autoloader, '');

        $test = new Auth_Model_Acl_Acl();
        return $moduleLoader;
    }
//..............
}

希望这有帮助

<强>更新

在你的application.ini中,你有appnamespace =“Application”。从APPLICATION_PATH“/ models”自动加载模型类'Default_Model_MockupsElementsTypes'将失败,因为自动加载器正在查找以'Application'开头的类。类名'Application_Model_MockupsElementsTypes'。

在我的测试机上,我有这个并且它工作正常:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

//............
    public function _initAutoload() {

        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->registerNamespace("Petra_");

        $autoloader->pushAutoloader(new Petra_Autoloader, '');

        $test2 = new Application_Model_DbTable_Guestbook; // classes loaded with the autoloader
        $test = new Auth_Model_Acl_Acl();
        return $moduleLoader;
    }
//..............
}

答案 2 :(得分:1)

我在Zend Framework中遇到了模块支持的问题。你有每个模块的引导程序吗?它可以是空白的,例如:

<?php
class Auth_Bootstrap extends Zend_Application_Module_Bootstrap {}

该文件应为Application / modules / auth / Bootstrap.php

答案 3 :(得分:0)

试试这个,确保你已经引导了db和frontController

public function _initPlugins()
{
    $this->bootstrap('db');
    $this->bootstrap('frontController');
    $frontController = $this->getResource('frontController');

    $frontController->registerPlugin(new Petra_Plugin_Layout_MultiLayout());
    $frontController->registerPlugin(new Petra_Plugin_Controller_AclCheck(new Auth_Model_Acl_Acl()));   

}

编辑: 好吧,我在我的应用程序中如何做到这一点来自我的INI文件:

[production]
;   PHP SETTINGS
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
phpSettings.session.auto_start = 0

; SET UP DEFAULT RESOURCES
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/modules/default/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.layout.layoutPath = APPLICATION_PATH "/modules/default/layouts/scripts"
resources.layout.layout = "layout"
resources.layout.viewSuffix = php
resources.layout.pluginClass = "Perinatal_Controller_Plugin_LayoutSwitcher"
resources.frontController.controllerDirectory = APPLICATION_PATH "/modules/default/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.plugins.acl = "Perinatal_Controller_Plugin_Acl"
resources.frontController.plugins.themer = "Perinatal_Controller_Plugin_Themer"
resources.frontController.plugins.mail = "Perinatal_Controller_Plugin_Mail"
...

这是我加载主题布局邮件和acl设置的地方

答案 4 :(得分:0)

在我的项目中,我使用application.ini中的以下行创建了所有模型:

includePaths.models = APPLICATION_PATH "/models/DbTable"

答案 5 :(得分:0)

我在我的博客上写了一个由3部分组成的教程,它完全符合您的要求,您可以轻松控制网站上的资源。它以XML格式存储,您只需提供“where”即可获取当前用户角色信息。

尝试阅读:

http://wolfulus.wordpress.com/

告诉我你的想法,也欢迎任何建议。