Задать вопрос

Как решит проблемму Phalcon Router Service router cannot be resolved, при мультимодульной структуре проекта?

Привет!
Хотел написать модульнный сайтик на Phalcon.
Набросал каркас, все работает кроме Router'а.

Вот такая структура

  • app
    • Cache
    • Config
    • Core
    • Modules
      • index
        • Conrollers
        • Models
        • Views
        • Module.php
        • Routes.php

    • Plugins
    • Views
    • Boorstrap.php

  • public
    • index.php


В каждом модуле есть Routes.php в его метод "init" передается параметром экземпляр обьекта BaseRoute который наследуется от Phalcon\Mvc\Router.
По началу выкидывало ошибку только в том случае когда я пытался добавить группу маршрутов, сейчас ошибку выбивает каждый раз если существует фаил Routes.php в папке модуля.
Вот текст ошибки:
Fatal error:  Uncaught exception 'Phalcon\Di\Exception' with message 'Service 'router' cannot be resolved' in C:\OpenServer\domains\Vtransfer.app\app\Boorstrap.php:262
Stack trace:
#0 [internal function]: Phalcon\Di\Service->resolve(NULL, Object(Phalcon\Di\FactoryDefault))
#1 [internal function]: Phalcon\Di->get('router', NULL)
#2 [internal function]: Phalcon\Di->getShared('router')
#3 C:\OpenServer\domains\Vtransfer.app\app\Boorstrap.php(262): Phalcon\Di->offsetGet('router')
#4 C:\OpenServer\domains\Vtransfer.app\app\Boorstrap.php(113): VTransfer\Bootstrap->dispatch(Object(Phalcon\Di\FactoryDefault))
#5 C:\OpenServer\domains\Vtransfer.app\public\index.php(20): VTransfer\Bootstrap->run()
#6 {main}
  thrown in C:\OpenServer\domains\Vtransfer.app\app\Boorstrap.php on line 262


на 262 строке функция которая вызывается при старте:
private function dispatch($di)
    {
        $router = $di['router'];

        $router->handle();

        $view = $di['view'];

        $dispatcher = $di['dispatcher'];

        $response = $di['response'];

        $dispatcher->setModuleName($router->getModuleName());
        $dispatcher->setControllerName($router->getControllerName());
        $dispatcher->setActionName($router->getActionName());
        $dispatcher->setParams($router->getParams());

        $moduleName = $this->camelize($router->getModuleName());

        $ModuleClassName = $moduleName . '\Module';

        if (class_exists($ModuleClassName))
        {
            $module = new $ModuleClassName;
            $module->registerAutoloaders();
            $module->registerServices($di);
        }

        $view->start();

        if (true)
        {
            $debug = new \Phalcon\Debug();
            $debug->listen();

            $dispatcher->dispatch();
        }
        else
        {
            try {
                $dispatcher->dispatch();
            } catch (\Phalcon\Exception $e) {
                // Errors catching

                $view->setViewsDir(__DIR__ . '/modules/Index/views/');
                $view->setPartialsDir('');
                $view->e = $e;

                if ($e instanceof \Phalcon\Mvc\Dispatcher\Exception) {
                    $response->setHeader(404, 'Not Found');
                    $view->partial('error/error404');
                } else {
                    $response->setHeader(503, 'Service Unavailable');
                    $view->partial('error/error503');
                }
                $response->sendHeaders();
                echo $response->getContent();
                return;

            }
        }

        $view->render(
            $dispatcher->getControllerName(),
            $dispatcher->getActionName(),
            $dispatcher->getParams()
        );

        $view->finish();

        $response = $di['response'];

        $response->sendHeaders();

        echo $response->getContent();
    }

Вот BaseRouter:
use Phalcon\Mvc\Router;

class BaseRouter extends Router
{

    public function __construct()
    {
        parent::__construct();

        $this->setDefaultModule('index');
        $this->setDefaultController('index');
        $this->setDefaultAction('index');

        $this->add('/:module/:controller/:action/:params', array(
            'module' => 1,
            'controller' => 2,
            'action' => 3,
            'params' => 4
        ))->setName('default');

        $this->add('/:module/:controller', array(
            'module' => 1,
            'controller' => 2,
            'action' => 'index',
        ))->setName('default_action');

        $this->add('/:module', array(
            'module' => 1,
            'controller' => 'index',
            'action' => 'index',
        ))->setName('default_controller');


        $this->removeExtraSlashes(true);
    }

    /**
     * @param $group \Phalcon\Mvc\Router\Group
     */
    public function addGroup($group)
    {
        $this->mount($group);
    }
}


А вот Routes.php который в папке с модулем:
use Phalcon\Mvc\Router\Group as Group;

class Routes
{

    /**
     * @param $router \Phalcon\Mvc\Router
     * @return mixed
     */
    public function init($router)
    {
        /*
        $index = new Group(array(
            'module' => 'admin',
            'controller' => 'index'
        ));

        $index->setPrefix('/admin');

        $index->add('/admin', array(
            'controller' => 'index',
            'action' => 'index'
        ));

        $index->add('/save', array(
            'controller' => 'users'
            'action' => 'save'
        ));

        $index->add('/edit/user/{id}', array(
            'controller' => 'users'
            'action' => 'edit'
        ));

        // Добавление группы в общие правила маршрутизации
        $router->mount($index);
        */
    }

}
  • Вопрос задан
  • 1121 просмотр
Подписаться 2 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
KorsaR-ZN
@KorsaR-ZN
Какая версии фрейма?
А вообще такая ошибка возникает, когда у тебя в DI контейнере роутер не правильно зарегистрирован, например класс не существует.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽