首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Phalcon多模块中未加载模块

Phalcon多模块中未加载模块
EN

Stack Overflow用户
提问于 2017-02-06 00:47:08
回答 1查看 678关注 0票数 0

我有一个在多模块中加载module.php的问题。

这就是Cores\Application

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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;
        });
    }
}

我想我在他们的网站上写了"like“phalcon多模块,但是module.php没有加载,为什么?

错误显示为Module \'Administrator\' isn\'t registered in the application container

请给我解释一下!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-06 03:31:37

您不需要使用\RecursiveDirectoryIterator。

代码语言:javascript
复制
$objects = new \IteratorIterator(new \RecursiveDirectoryIterator($modulesDir));

您只需要第一级的文件夹

代码语言:javascript
复制
$objects = new \IteratorIterator($modulesDir);

斜杠/反斜杠的错误,主要错误是数组的结构。检查文章https://docs.phalconphp.com/en/3.0.1/reference/applications.html#multi-module中的结构

代码语言:javascript
复制
$dir[] = [
    $ojb->getFilename() => [
         'className' => 'Modules' . DS . $ojb->getFilename() . DS . 'Module',
         'path'      => $ojb->getPath() .  '/' . $ojb->getFilename() . '/Module.php'
    ]
];

必须是

代码语言:javascript
复制
$dir[$ojb->getFilename()] = [
     'className' => 'Modules\\' . $ojb->getFilename() . '\\Module',
     'path'      => $ojb->getPath() .  DS . $ojb->getFilename() . DS . 'Module.php'
];

在路由中模块名称有误

代码语言:javascript
复制
$router->add('/:controller/:action', [
    'module'     => 'Modules\Administrator',
    'controller' => 1,
    'action'     => 2,
])->setName('Administrator');

必须是

代码语言:javascript
复制
$router->add('/:controller/:action', [
    'module'     => 'Administrator',
    'controller' => 1,
    'action'     => 2,
])->setName('Administrator');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42054647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档