2017-02-05 177 views
0

加载我有在多模块加载module.php的问题。模块不在多尔康多模块

Here Directory structure for my app

这个Cores\Application

<?php 
namespace Cores; 

use \Phalcon\Di\FactoryDefault, 
    \Phalcon\Loader, 
    //\Phalcon\Registry, 
    \Phalcon\Mvc\Router, 
    \Phalcon\Mvc\Application as PhalconApplication, 
    \Phalcon\Mvc\Events\Manager as EventsManager; 

class Application extends PhalconApplication 
{ 
    protected $_config; 

    public function __construct() 
    { 
     $di = new FactoryDefault(); 

     $this->_config = Config::factory(); 
     parent::__construct($di); 
    } 

    private function __initModule() 
    { 
     $modulesDir = $this->_config->Config->application->modulesDir; 
     $dir = []; 

     /** 
     * Faster way to load directory to find Modules 
     */ 
     $objects = new \IteratorIterator(new \RecursiveDirectoryIterator($modulesDir)); 
     foreach($objects as $key => $ojb){ 
      if ($ojb->getFilename() != '.' AND $ojb->getFilename() != '..') { 
       $dir[] = [ 
        $ojb->getFilename() => [ 
         'className' => 'Modules' . DS . $ojb->getFilename() . DS . 'Module', 
         'path'  => $ojb->getPath() . '/' . $ojb->getFilename() . '/Module.php' 
        ] 
       ]; 
      } 
     } 

     parent::registerModules($dir); 
    } 

    private function __initRoute() 
    { 
     $di = $this->getDI(); 
     $loader = new loader(); 
     $loader 
      ->registerDirs([BASEPATH . 'App/Libraries/']) 
      ->register(); 

     $di->set('router', function() { 
      $router = new Router(); 

      $router->setDefaultModule('Administrator'); 

      $router->add('/:controller/:action', [ 
       'module'  => 'Modules\Administrator', 
       'controller' => 1, 
       'action'  => 2, 
      ])->setName('Administrator'); 

      return $router; 
     }); 
    } 

    public function run() 
    { 
     $this->__initModule(); 
     $this->__initRoute(); 
     //echo '<pre>'.var_export($this->getModules(), true).'</pre>'; 
     try { 
      echo $this->handle()->getContent(); 
     } catch (\Exception $err) { 
      echo '<pre>'.var_export($err, true).'</pre>'; 
     } 
    } 
} 

,这是Modules\Administrator module.php

<?php 
namespace Modules\Administrator 

use \Phalcon\Loader, 
    \Phalcon\Mvc\View, 
    \Phalcon\DiInterface, 
    \Phalcon\Mvc\Dispatcher, 
    \Phalcon\Mvc\ModuleDefinitionInterface; 

class Module implements ModuleDefinitionInterface 
{ 
    /** 
    * Register a specific autoloader for the module 
    */ 
    public registerAutoloaders(DiInterface $di = null) 
    { 
     $loader = new Loader(); 

     $loader->registerNamespaces(
      [ 
       'Modules\\Administrator\\Controllers' => APP_PATH . '/Modules/Administrator/Controllers', 
       'Moduels\\Administrator\\Models' => APP_PATH . '/Modules/Administrator/Models' 
      ] 
     ); 

     $loader->register(); 
    } 

    /** 
    * Register specific services for the module 
    */ 
    public registerServices(DiInterface $di = null) 
    { 
     $di->set('dispatcher', function() { 
      $dispatcher = new Dispatcher(); 

      $dispatcher->setDefaultNamespaces('Modules\\Administrator\\Controllers'); 

      return $dispatcher; 
     }); 

     $di->set('view', function() { 
      $view = new View(); 

      $view->setViewsDir(APP_PATH . 'Administrator/Views/'); 

      return $view; 
     }); 
    } 
} 

我想我是写 “喜欢” 在他们的网站上尔康多模块,但module.php没有加载,为什么?

的ERR说Module \'Administrator\' isn\'t registered in the application container

请给我讲解一下!

回答

1

1. 你不并不需要使用\ RecursiveDirectoryIterator。

$objects = new \IteratorIterator(new \RecursiveDirectoryIterator($modulesDir)); 

需要的文件夹仅从第一电平

$objects = new \IteratorIterator($modulesDir); 

2. 错误以斜线/反斜线和主要误差是阵列的结构。检查文章https://docs.phalconphp.com/en/3.0.1/reference/applications.html#multi-module

$dir[] = [ 
    $ojb->getFilename() => [ 
     'className' => 'Modules' . DS . $ojb->getFilename() . DS . 'Module', 
     'path'  => $ojb->getPath() . '/' . $ojb->getFilename() . '/Module.php' 
    ] 
]; 

结构必须

$dir[$ojb->getFilename()] = [ 
    'className' => 'Modules\\' . $ojb->getFilename() . '\\Module', 
    'path'  => $ojb->getPath() . DS . $ojb->getFilename() . DS . 'Module.php' 
]; 

3. 在路线错误的模块名称

$router->add('/:controller/:action', [ 
    'module'  => 'Modules\Administrator', 
    'controller' => 1, 
    'action'  => 2, 
])->setName('Administrator'); 

必须

$router->add('/:controller/:action', [ 
    'module'  => 'Administrator', 
    'controller' => 1, 
    'action'  => 2, 
])->setName('Administrator'); 
+0

谢谢哥哥。错误消失了。但我仍然无法看到我的世界你好字符串。 phtml存在于视图目录中,但未显示。为什么?稍后我会将其标记为答案。干杯:) – Cecep

+0

对不起哥哥。我的错误。我得到了答复。 false是模块中的视图目录。感谢你的回答。它真的帮助我。 :d – Cecep