我正在尝试将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/
告诉我你的想法,任何建议都欢迎。