2

Возможно ли настроить следующее поведение в application.ini?Zend Framework: Ресурсы загрузочного модуля в config.ini?

<?php 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initAdminModuleAutoloader() 
    { 

    $this->_resourceLoader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'Admin', 
     'basePath' => APPLICATION_PATH . '/modules/admin', 
    )); 
     $this->_resourceLoader->addResourceTypes(array(
      'model' => array(
       'namespace' => 'Model', 
       'path'  => 'models' 
      ) 
     )); 
} 

} 
?> 

Если да, можете ли вы, пожалуйста, показать нам пример?

Спасибо.

+0

Был пример полезен? Вы видели это? – Travis

+0

есть такой же вопрос. Трэвис ваш ответ не отвечает на вопрос. – sanders

ответ

2

Вот несколько указателей. Сначала вы должны иметь следующую строку в файле application.ini.

resources.modules.admin = "enabled" 

Это позволит убедиться, что следующая функция в Zend_Application_Resource_Modules работает

public function init() 
{ 
    $bootstrap = $this->getBootstrap(); 
    $bootstrap->bootstrap('FrontController'); 
    $front = $bootstrap->getResource('FrontController'); 

    $modules = $front->getControllerDirectory(); 
    $default = $front->getDefaultModule(); 
    $curBootstrapClass = get_class($bootstrap); 
    foreach ($modules as $module => $moduleDirectory) { 
     $bootstrapClass = $this->_formatModuleName($module) . '_Bootstrap'; 
     if (!class_exists($bootstrapClass, false)) { 
      $bootstrapPath = dirname($moduleDirectory) . '/Bootstrap.php'; 
      if (file_exists($bootstrapPath)) { 
       $eMsgTpl = 'Bootstrap file found for module "%s" but bootstrap class "%s" not found'; 
       include_once $bootstrapPath; 
       if (($default != $module) 
        && !class_exists($bootstrapClass, false) 
       ) { 
        throw new Zend_Application_Resource_Exception(sprintf(
         $eMsgTpl, $module, $bootstrapClass 
        )); 
       } elseif ($default == $module) { 
        if (!class_exists($bootstrapClass, false)) { 
         $bootstrapClass = 'Bootstrap'; 
         if (!class_exists($bootstrapClass, false)) { 
          throw new Zend_Application_Resource_Exception(sprintf(
           $eMsgTpl, $module, $bootstrapClass 
          )); 
         } 
        } 
       } 
      } else { 
       continue; 
      } 
     } 

     if ($bootstrapClass == $curBootstrapClass) { 
      // If the found bootstrap class matches the one calling this 
      // resource, don't re-execute. 
      continue; 
     } 

     $moduleBootstrap = new $bootstrapClass($bootstrap); 
     $moduleBootstrap->bootstrap(); 
     $this->_bootstraps[$module] = $moduleBootstrap; 
    } 

    return $this->_bootstraps; 
} 

В приведенной выше функции вашего модуля начальной загрузки называется. Вы должны иметь файл модуля начальной загрузки в/приложений/модулей/администратора под названием Bootstrap.php со следующим кодом в нем:

class Admin_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 


} 

Я собираюсь пропустить несколько шагов, но если проследить через классы наследования это приведет к следующей вызываемой функции в Zend_Application_Module_Autoloader

public function initDefaultResourceTypes() 
{ 
    $basePath = $this->getBasePath(); 
    $this->addResourceTypes(array(
     'dbtable' => array(
      'namespace' => 'Model_DbTable', 
      'path'  => 'models/DbTable', 
     ), 
     'mappers' => array(
      'namespace' => 'Model_Mapper', 
      'path'  => 'models/mappers', 
     ), 
     'form' => array(
      'namespace' => 'Form', 
      'path'  => 'forms', 
     ), 
     'model' => array(
      'namespace' => 'Model', 
      'path'  => 'models', 
     ), 
     'plugin' => array(
      'namespace' => 'Plugin', 
      'path'  => 'plugins', 
     ), 
     'service' => array(
      'namespace' => 'Service', 
      'path'  => 'services', 
     ), 
     'viewhelper' => array(
      'namespace' => 'View_Helper', 
      'path'  => 'views/helpers', 
     ), 
     'viewfilter' => array(
      'namespace' => 'View_Filter', 
      'path'  => 'views/filters', 
     ), 
    )); 
    $this->setDefaultResourceType('model'); 
} 

Все вышеперечисленные типы ресурсов будут покрыты по умолчанию для каждого модуля, который вы будете следовать этому шаблону для. Любые другие, которые вам нужны, должны быть настроены в файле начальной загрузки.

+0

Спасибо, Трэвис. Это хороший подход! я думал о чем-то простым, как это: resources.frontcontroller.namespaces.viewfilter.ns = «View_Filter» resources.frontcontroller.namespaces.viewfilter.path = «просмотров/фильтры» Я полагаю, такой конфигурации пока недоступен для Zend_Application. Может быть, в ближайшем будущем .... – olagato

+0

Ну, это довольно просто. Вам нужно всего лишь линия resources.modules.admin = «включен» и пустой файл начальной загрузки. Zend_Application заботится обо всем остальном. Я просто просматривал реальный код Zend для вас, который устанавливает это по умолчанию. – Travis

0

Я использую Zend Framework версии 1.10.4 с конфигурацией проекта по умолчанию. Я активировать все модули в моих application.ini с помощью следующей строки:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 

Ее важно, что у вас есть Bootstrap.php в директории модуля. Без этого мои модели не были загружены правильно. URL-адрес вашего браузера, похоже, чувствителен к регистру. Например: http://example.com/Admin/controller/action

Так, он должен работать ...

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

  • Нет связанных вопросов^_^