007 Пространства имен
Работа с пространствами имен
Пространства имен могут использоваться, чтобы избежать конфликтов имен классов; это означает, что если у вас есть два контроллера в приложении с одинаковым именем, пространство имен можно использовать для их различения. Пространства имен также полезны для создания пакетов или модулей.
Настройка фреймворка
Использование пространств имен имеет некоторые последствия при загрузке соответствующего контроллера. Чтобы настроить поведение платформы для пространств имен, необходимо выполнить одну или все из следующих задач:
Используйте стратегию автозагрузки, которая учитывает пространства имен, например, с Phalcon\Loader:
<?php $loader->registerNamespaces( [ 'Store\Admin\Controllers' => '../bundles/admin/controllers/', 'Store\Admin\Models' => '../bundles/admin/models/', ] );
Укажите его в маршрутах как отдельный параметр в путях маршрута:
<?php $router->add( '/admin/users/my-profile', [ 'namespace' => 'Store\Admin', 'controller' => 'Users', 'action' => 'profile', ] );
Проходя это как часть маршрута:
$router->add( '/:namespace/admin/users/my-profile', [ 'namespace' => 1, 'controller' => 'Users', 'action' => 'profile', ] );
Если вы работаете только с одним и тем же пространством имен для каждого контроллера в вашем приложении, то вы можете определить пространство имен по умолчанию в Диспетчере, выполнив это, вам не нужно указывать полное имя класса в пути к маршрутизатору:
<?php use Phalcon\Mvc\Dispatcher; // Registering a dispatcher $di->set( 'dispatcher', function () { $dispatcher = new Dispatcher(); $dispatcher->setDefaultNamespace( 'Store\Admin\Controllers' ); return $dispatcher; } );
Контроллеры в пространствах имен
В следующем примере показано, как реализовать контроллер, использующий пространства имен:
<?php namespace Store\Admin\Controllers; use Phalcon\Mvc\Controller; class UsersController extends Controller { public function indexAction() { } public function profileAction() { } }
Модели в пространствах имен
При использовании моделей в пространствах имен учитывайте следующее:
<?php namespace Store\Models; use Phalcon\Mvc\Model; class Robots extends Model { }
Если модели имеют отношения, они также должны включать пространство имен:
<?php namespace Store\Models; use Phalcon\Mvc\Model; class Robots extends Model { public function initialize() { $this->hasMany( 'id', Parts::class, 'robots_id', [ 'alias' => 'parts', ] ); } }
В PHQL вы должны написать операторы, включающие пространства имен:
<?php $phql = 'SELECT r.* FROM Store\Models\Robots r JOIN Store\Models\Parts p';