Модуль не загружается в мультимодуль Phalcon

У меня проблема с загрузкой module.php в мультимодуле.

Здесь структура каталогов для моего приложения

это 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;
});
}
}

Я думаю, что я написал «как» phalcon multi module на их сайте, но module.php не загружен, почему?

Ошибка говорит Module \'Administrator\' isn\'t registered in the application container

Пожалуйста, объясни мне это!

0

Решение

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');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]