У меня есть довольно большой проект, который мне нужно запрограммировать. Я использовал код CodeIgniter, но поскольку они перестали поддерживать фреймворк, я решил переключиться на другой. Я выбрал структуру Phalcon. Структура папки приложения, которую я хочу реализовать, следующая:
Это всего лишь пример структуры папок приложения. В этом проекте будет достаточно много папок и подпапок, чтобы сделать его управляемым.
По моему мнению, мне нужно зарегистрировать все пространства имен в загрузчике для каждой подпапки, чтобы 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; });
Это также будет очень большим, если мне нужно вручную настроить маршрутизатор для каждой подпапки и пространства имен.
Поэтому у меня есть следующие вопросы:
Я исследовал документацию Phalcon, но не смог найти способ сделать это.
Любая помощь и предложения очень ценятся.
благодаря
Объявление. 1. Вы можете изменить свои пространства имен, чтобы быть более PSR-0 (на мой взгляд), поэтому я бы сделал:
Вы можете зарегистрировать один 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-адрес контроллерам, которые также имеют некоторые пространства имен.