Не загружается многомодульный бэкэнд Phalcon 4 - PullRequest
1 голос
/ 18 января 2020

Я нахожусь в windows, используя php -7.4.1 Architecture-x64, phalcon - 4.0.2, psr - 0.7.0 и следуйте инструкциям из 'https://docs.phalcon.io/4.0/en/application', но Проблема в том, что он всегда отображает модуль внешнего интерфейса и его вид. Я не могу выяснить, что я делаю неправильно?

[Index.php]

use Phalcon\Mvc\Router;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;
$di = new FactoryDefault();
$di->set('router',function () {
        $router = new Router(false);
        $router->setDefaultModule('frontend');
        $router->add('/login',
            [
                'module'     => 'backend',
                'controller' => 'index',
                'action'     => 'index',
            ]
        );
        $router->add('/admin/products/:action',
            [
                'module'     => 'backend',
                'controller' => 'index',
                'action'     => 1,
            ]
        );

        return $router;
    }
);

$application = new Application($di);

$application->registerModules(
    [
        'frontend' => [
            'className' => \Multiple\Frontend\Module::class,
            'path'      => '../apps/frontend/Module.php',
        ],
        'backend'  => [
            'className' => \Multiple\Backend\Module::class,
            'path'      => '../apps/backend/Module.php',
        ],
    ]
);
try {
    $response = $application->handle($_SERVER["REQUEST_URI"]);
    $response->send();
} catch (\Exception $e) {
    echo $e->getMessage();
}

[Внутренний модуль]

<?php
namespace Multiple\Backend;
use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Di\DiInterface;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\ModuleDefinitionInterface;
class Module implements ModuleDefinitionInterface
{
    public function registerAutoloaders(DiInterface $di = null)
    {
        $loader = new Loader();
        $loader->registerNamespaces(
            [
                'Multiple\Backend\Controllers' => '../apps/backend/controllers/',
                'Multiple\Backend\Models'      => '../apps/backend/models/',
            ]
        );
        $loader->register();

    }
    public function registerServices(DiInterface $di)
    {
        $di->set('dispatcher',function () {
                $dispatcher = new Dispatcher();
                $dispatcher->setDefaultNamespace('Multiple\Backend\Controllers');
                return $dispatcher;
            }
        );
        $di->set('view',function () {
                $view = new View();
                $view->setViewsDir('../apps/backend/views/');
                return $view;
            }
        );
    }
}

[Контроллер индекса ]

<?php
namespace Multiple\Backend\Controllers;
use Phalcon\Mvc\Controller;
class IndexController extends Controller
{
    public function indexAction()
    {
        return '<h1>Back Controller!</h1>';
    }
}

Ответы [ 2 ]

1 голос
/ 18 января 2020

Вы также установили свои пространства имен в модуле внешнего интерфейса? Как вы сделали с registerAutoloaders в бэкэнде.

0 голосов
/ 19 января 2020

Убедитесь, что вы зарегистрировали свой новый модуль в

../app/bootstrap_web.php в строке 47, как показано ниже

$application->registerModules([
    'frontend' => ['className' => 'MyApp\Modules\Frontend\Module'],
    // <--- add your new module here   --->

]);

, и что ваш класс модуля также зарегистрирован в загрузчике по адресу ../app/config/loader.php вокруг строки 18, которая выглядит, как показано ниже

$loader->registerClasses([
'MyApp\Modules\Frontend\Module' => APP_PATH . '/modules/frontend/Module.php',
// <--- Add your new module class here --->
]);

Всегда следите за своими пространствами имен. Надеюсь, это поможет.

...