Zend框架1.11:引导程序中的访问模型


Zend framework 1.11 : access model in bootstrap

我正在尝试将ACL设置从模型目录传递到引导程序中的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。有什么方法可以在引导程序中初始化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

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

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

autoloadernamespaces[] = "Auth_"

如果类驻留在一个名为auth的模块中,因此它驻留在文件application/modules/auth/model/Acl/Acl.php中,那么您只需要确保正确启动了模块,通常在configs/application.ini:中使用以下内容

 resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
 resources.modules[] = 

这将启动模块应用程序资源插件,该插件反过来注册一个模块自动着色器,该自动着色器应该为您的Acl类正确映射。

但是,如果这个类想驻留在其他地方,比如应用程序根目录或其他模块中,那么就必须设置一些其他资源自动加载器映射。

您定义了一个资源自动加载器'Zend_Application_Module_autoloader'来从目录Application_PATH中查找没有命名空间的类。'/模块

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

阵列(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_Mode"、"Auth_Model_Acl"或"Auth_Model_Acl"的资源找到。这些不是有效的资源。自动加载器将在第177行返回false class"Zend_Loader_autoloader_Source"。

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

$moduleLoader=新的Zend_Application_Module_Autoloader(数组("namespace"=>"Auth",'basePath'=>APPLICATION_PATH。'/模块/auth));

解决方案(创建自定义自动加载器):在自动加载器之后添加以下内容。您可以将"Petra_Autoloader"更改为所需的任何其他类。

$autoloader->pushAutoloader(新Petra_autoloader,'');

创建一个实现Zend_Loader_Autoloader_Interface 的类

类Petra_Autoloader实现Zend_Loader_Autoloader_Interface{公共函数自动加载($class){//加载类的实现}}

引导程序.php

类引导程序扩展Zend_Application_Bootstrap_Bootstrap{//。。。。。。。。。。。。公共函数_initAutoload(){$autoloader=Zend_Loader_autoloader::getInstance();$autoloader->registerNamespace("Petra_");$autoloader->pushAutoloader(新Petra_autoloader,'');$test=新的Auth_Model_Acl_Acl();return$moduleLoader;}//。。。。。。。。。。。。。。}

希望这能帮助

更新

在application.ini中,您有appnamespace="application"。从APPLICATION_PATH"/models"自动加载模型类"Default_model_MockupsElementsTypes"将失败,因为自动加载程序正在查找以"APPLICATION"开头的类。类名为"APPLICATION_model_MokupsElementsTypes"。

在我的测试机中,我有这个,它运行良好:

类引导程序扩展Zend_Application_Bootstrap_Bootstrap{//。。。。。。。。。。。。公共函数_initAutoload(){$autoloader=Zend_Loader_autoloader::getInstance();$autoloader->registerNamespace("Petra_");$autoloader->pushAutoloader(新Petra_autoloader,'');$test2=新的Application_Model_DbTable_Guestbook;//使用自动加载器加载的类$test=新的Auth_Model_Acl_Acl();return$moduleLoader;}//。。。。。。。。。。。。。。}

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

<?php
class Auth_Bootstrap extends Zend_Application_Module_Bootstrap {}

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

尝试此操作,确保您已经启动了数据库和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设置的地方

在我的项目中,我在application.ini中用下面的行提供了所有模型:

includePaths.models = APPLICATION_PATH "/models/DbTable"

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

试着在上阅读

http://wolfulus.wordpress.com/

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