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

Как решит проблемму 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);
        */
    }

}
  • Вопрос задан
  • 1113 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
KorsaR-ZN
@KorsaR-ZN
Какая версии фрейма?
А вообще такая ошибка возникает, когда у тебя в DI контейнере роутер не правильно зарегистрирован, например класс не существует.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы