2012-02-10 2 views
0

Я пытаюсь передать настройки ACL из каталога модели в плагин ACL в bootstrap.Zend framework 1.11: модель доступа в bootstrap

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_Model_Acl_Acl в модуле Auth. Есть ли способ инициализировать структуру MVC в бутстрапе? Или, может быть, есть лучший способ сохранить настройки ACL?

EDIT - больше информаций:

Bootstrap:

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

зарегистрировавшихся вы путь Petra_Plugin с автозагрузчиком? –

+0

Плагин регистрации работает нормально, я получаю форму ошибки 'new Auth_Model_Acl_Acl()' – Adam

ответ

4

В значительной степени зависит от того, где хранится класс Auth_Model_Acl_Acl.

Если он находится на пути включения, возможно, в library/Auth/Model/Acl/Acl.php, вам просто нужно зарегистрировать пространство имен с автозагрузчиком. В configs/application.ini, просто добавьте:

autoloadernamespaces[] = "Auth_" 

Если класс находится в модуле, называемом аутентификации, так что он находится в файле application/modules/auth/model/Acl/Acl.php, то вам просто необходимо, чтобы убедиться, что вы правильно инициировали модули, как правило, с следующее configs/application.ini:

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

Это запустит плагин ресурсов приложения модуль, который в свою очередь, регистрирует module-autololoader, которые должны правильно карту для вашего класса Acl.

Однако, если этот класс хочет проживать где-то еще - например, в корне приложения или в другом модуле - тогда вам нужно настроить некоторые другие сопоставления resource autoloader.

+0

Класс находится в модели Auth, и когда я создаю объект Auth_Model_Acl_Acl в контроллере, все работает нормально. Модули также работают без любая проблема. Я переместил модули config в bootstrap, но это не помогает. – Adam

+2

В вашем методе '_initPlugins()' включите вызов '$ this-> bootstrap ('modules');' перед регистрацией ваших плагинов. должен инициировать автозагрузчик ресурсов на уровне модуля, который вам нужен для класса 'Auth_Model_Acl_Acl'. –

+0

Спасибо, что отлично работает :) – Adam

0

Попробуйте это, убедитесь, что выуже бутстрапированная дб и 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())); 

} 

EDIT: хорошо, как я делаю это в моих приложений из моего 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 настройки

+0

Это тоже не работает :( – Adam

0

В моем проекте я сделал все модели доступны с линией ниже в application.ini:

includePaths.models = APPLICATION_PATH "/models/DbTable" 
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» ,Это не действительные ресурсы. Автозагрузчик вернет false в строке 177 класса «Zend_Loader_Autoloader_Resource».

Следующая будет автоматически загружать ваш класс модели:

 
     $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; 
    } 
//.............. 
} 

Надеется, что это помогает

Update

В вашем приложении application.ini у вас есть appnamespace = «Приложение». Автоматическая загрузка модели класса «Default_Model_MockupsElementsTypes» из APPLICATION_PATH «/ моделей не получится, так как автоматический загрузчик ищет классов, начиная с„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; 
    } 
//.............. 
} 
+0

Спасибо за подробный ответ, но проблема заключается в том, что автозагрузчик может найти любую модель, даже модели, хранящиеся в каталоге '/ models ', без какого-либо подкаталога, и не только в модуле auth, но и в каждом из них.В каждом примере, который я видел в Интернете, он работает отлично, я загрузил несколько из них, и я не могу найти никаких различий в моем загрузочном блоке. zend вызывает фатальную ошибку: Fatal error: Class 'Default_Model_MockupsElementsTypes' не найден в C: \ Program Files (x86) \ Zend \ Apache2 \ htdocs \ Mobile_Mockup \ mobile_mockup_1_0 \ application \ Bootstrap.php в строке 21 (тест класса) – Adam

+0

@Adam Я добавил дополнительные сведения к ответу. – satrun77

0

Я написал 3-часть учебника на моем блоге, который делает именно то, что вы хотите, и вы будете иметь легкий контроль над ресурсами на сайте Его хранятся в XML,. и вам просто нужно предоставить «где», чтобы получить текущую информацию о роли пользователя.

попробуйте прочитать их:

http://wolfulus.wordpress.com/

Скажите, что вы думаете, и любые предложения приветствуются тоже.

1

У меня были проблемы с поддержкой модуля в Zend Framework. У вас есть бутстрап для каждого из ваших модулей? Это может быть пустым, например:

<?php 
class Auth_Bootstrap extends Zend_Application_Module_Bootstrap {} 

Файл должен быть Application/модули/авториз/Bootstrap.php

Смежные вопросы