Zend Framework 1.11: модель доступа в начальной загрузке - PullRequest
0 голосов
/ 10 февраля 2012

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

РЕДАКТИРОВАТЬ - больше информации:

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

Ответы [ 6 ]

4 голосов
/ 10 февраля 2012

Это во многом зависит от того, где хранится класс Auth_Model_Acl_Acl.

Если он находится на пути включения, возможно, в 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[] = 

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

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

1 голос
/ 13 февраля 2012

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

<?php
class Auth_Bootstrap extends Zend_Application_Module_Bootstrap {}

Файл должен быть Application / modules / auth / Bootstrap.php

1 голос
/ 13 февраля 2012

Вы определяете автозагрузчик ресурсов 'Zend_Application_Module_Autoloader' для поиска классов без пространства имен и из каталога APPLICATION_PATH.'/ modules'

Автозагрузчик имеет массив ресурсов:

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

Надеждаэто помогает

Обновление

В вашем application.ini у вас есть appnamespace = "Приложение".Автоматическая загрузка класса модели «Default_Model_MockupsElementsTypes» из APPLICATION_PATH «/ models» завершится неудачно, поскольку автозагрузчик ищет классы, начинающиеся с «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 голосов
/ 13 февраля 2012

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

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

http://wolfulus.wordpress.com/

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

0 голосов
/ 10 февраля 2012

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

includePaths.models = APPLICATION_PATH "/models/DbTable"
0 голосов
/ 10 февраля 2012

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

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...