Phalcon Router и Loader для создания структуры подпапок. Как настроить?

У меня есть довольно большой проект, который мне нужно запрограммировать. Я использовал код CodeIgniter, но поскольку они перестали поддерживать фреймворк, я решил переключиться на другой. Я выбрал структуру Phalcon. Структура папки приложения, которую я хочу реализовать, следующая:

  • приложение/
    • контроллеры /
      • админ /
        • пользователей /
          • UsersController.php
          • UserGroupsController.php
        • панель приборов/
        • система /
        • another_subfolder /
          • AnotherSubFolderController.php
      • производство /
        • настроек / SettingsController.php
        • панель приборов/
        • течь/
        • another_subfolder /
          • AnotherSubFolderController.php
      • website1 /
        • клиенты /
          • CustomersController.php
          • CompaniesController.php
        • another_subfolder …. /
    • модели /
      • sub_folder_structure / // То же, что и контроллеры

Это всего лишь пример структуры папок приложения. В этом проекте будет достаточно много папок и подпапок, чтобы сделать его управляемым.

По моему мнению, мне нужно зарегистрировать все пространства имен в загрузчике для каждой подпапки, чтобы Phalcon знал, где искать и загружать класс.

//Register an autoloader $loader = new \Phalcon\Loader(); $loader->registerNamespaces(array( // Main 'Controllers' =>'app/controllers/', 'Models' =>'app/models/', // Admin Routing 'Controllers\Admin'=>'app/controllers/admin', 'Models\Admin'=>'app/models/admin', 'Controllers\Admin'=>'app/controllers/admin', 'Models\Admin'=>'app/models/admin', 'Controllers\Admin\Users'=>'app/controllers/admin/users', 'Models\Admin\Users'=>'app/models/admin/users' ))->register(); 

Погрузчик будет выглядеть довольно большим.

Затем мне нужно настроить маршрутизатор, чтобы запросы перенаправлялись на правый контроллер. Прямо сейчас у меня есть следующее:

 // Setup Router $di->set('router', function(){ $router = new \Phalcon\Mvc\Router(false); $router->removeExtraSlashes(true); $router->add('/', array( 'namespace' => 'Controllers', 'controller' => "login" )); $router->add('/:controller/:action/', array( 'namespace' => 'Controllers', 'controller' => 1, 'action' =>2 )); $router->add('/admin/:controller/:action/', array( 'namespace' => 'Controllers\Admin', 'controller' => 1, 'action' =>2 )); $router->add('/admin/users/:controller/:action/', array( 'namespace' => 'Controllers\Admin\Users', 'controller' => 1, 'action' =>2 )); return $router; }); 

Это также будет очень большим, если мне нужно вручную настроить маршрутизатор для каждой подпапки и пространства имен.

Поэтому у меня есть следующие вопросы:

  1. Есть ли способ сделать загрузчик красивее и меньше? По мере того как он будет расти.
  2. Как настроить маршрутизатор так, чтобы мне не нужно вводить все пространства имен и комбинации подпапок? Есть ли способ уменьшить его? Может быть изменен диспетчер или любой другой класс? Или есть способ, которым я могу установить переменную пути в маршрутизаторе на место контроллера?

Я исследовал документацию Phalcon, но не смог найти способ сделать это.

Любая помощь и предложения очень ценятся.

благодаря

Объявление. 1. Вы можете изменить свои пространства имен, чтобы быть более PSR-0 (на мой взгляд), поэтому я бы сделал:

  • приложение
    • контроллеры
      • Администратор
        • пользователей
          • UsersController.php

Вы можете зарегистрировать один Admin пространства имен или любой другой. Затем вам нужно зарегистрировать только самое большое пространство имен для работы (имейте в виду, что ваш UsersController должен иметь namespace Admin\Users\UsersController; для работы). Автозагрузчик Thena должен иметь только:

  $loader ->registerDirs( array( // It's taken from my config so path may be different __DIR__ . '/../../app/controllers/' // other namespaces here (like for models) ) ); 

Я использую registerDirs поэтому я только указываю загрузчик в папку, в которой существует некоторое пространство имен.

Объявление. 2.

Для этого вы можете использовать группы маршрутов, чтобы вы могли передать пространство имен в качестве параметра для конфигурационного массива конструктора, а затем выполнить повторяющуюся задачу в одном месте. Затем просто создайте новые экземпляры с разными параметрами;

 $router->addGroup(new MahGroup(array('namespace' => 'Mah\\Controller')); 

Таким образом, внутри класса MahGroup может быть:

 class MahGroup extends Phalcon\Mvc\Router\Group { public function _construct($config = array()) { $this->setPrefix('/' . $config['perfix']); $router->add('/:controller/:action/', array( 'namespace' => $config['namespace'], 'controller' => 1, 'action' => 2 )); // etc... } } 

И затем настройка маршрутов:

 $router->addGroup( new MahGroup(array('prefix' => 'mah-namespace', 'namespace' => 'Mah\\Namespace' )) ); $router->addGroup( new MahGroup(array('prefix' => 'mah-other-namespace', 'namespace' => 'Mah\\Other\\Namespace' )) ); 

Но приведенные примеры для второго вопроса – вот что можно сделать. Обычно я создаю класс Group для каждого пространства имен, а затем объявляю некоторые маршруты, которые использует мое приложение, поскольку я не использую английские имена для маршрутов, и мне нужно переписывать польский URL-адрес контроллерам, которые также имеют некоторые пространства имен.