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

Создание основы

Использование пространств имен имеет некоторые последствия при загрузке соответствующего контроллера. Для настройки поведения фреймворка в пространствах имен Необходимо выполнить одну или все из следующих задач:

Используйте стратегию автоматической загрузки, учитывающую пространства имен, например 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',
    ]
);

Прохождение его в рамках маршрута:

<?php

$router->add(
    '/:namespace/admin/users/my-profile',
    [
        'namespace'  => 1,
        'controller' => 'Users',
        'action'     => 'profile',
    ]
);

Если вы работаете только с тем же пространством имен для каждого контроллера в вашем приложении, то вы можете определить пространство имен по умолчанию в Dispatcher, делая это, вам не нужно указывать полное имя класса в пути маршрутизатора:

<?php

use Phalcon\Mvc\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',
            'Store\Models\Parts',
            'robots_id',
            [
                'alias' => 'parts',
            ]
        );
    }
}

В PHQL необходимо писать операторы, включая пространства имен:

<?php

$phql = 'SELECT r.* FROM Store\Models\Robots r JOIN Store\Models\Parts p';