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