Работа с именованными пространствами
Именованные пространства могут быть использованы для предотвращения столкновений имён классов; это означает, что если у вас есть два контроллера в приложении с одинаковым именем, можно использовать именованное пространство для их различения. Именные пространства также полезны для создания пакетов или модулей.
Настройка фреймворка
Использование именованных пространств имеет некоторые последствия при загрузке соответствующего контроллера. Для настройки поведения фреймворка для именованных пространств необходимо выполнить одну или все из следующих задач:
Используйте стратегию автозагрузки, которая учитывает именованные пространства, например, с помощью Phalcon\Loader:
$loader->registerNamespaces(
[
"Store\\Admin\\Controllers" => "../bundles/admin/controllers/",
"Store\\Admin\\Models" => "../bundles/admin/models/",
]
);
Укажите его в маршрутах как отдельный параметр в пути маршрута:
$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",
]
);
Если вы работаете только с одним и тем же именованным пространством для каждого контроллера в вашем приложении, вы можете определить стандартное именованное пространство в диспетчере. Сделав это, вам не нужно указывать полное имя класса в пути маршрутизатора:
use Phalcon\Mvc\Dispatcher;
// Registering a dispatcher
$di->set(
"dispatcher",
function () {
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace(
"Store\\Admin\\Controllers"
);
return $dispatcher;
}
);
Контроллеры в именованных пространствах
Следующий пример демонстрирует, как реализовать контроллер, использующий именованные пространства:
namespace Store\Admin\Controllers;
use Phalcon\Mvc\Controller;
class UsersController extends Controller
{
public function indexAction()
{
}
public function profileAction()
{
}
}
Модели в именованных пространствах
Обратите внимание на следующее при использовании моделей в именованных пространствах:
namespace Store\Models;
use Phalcon\Mvc\Model;
class Robots extends Model
{
}
Если модели имеют отношения, они также должны включать именованное пространство:
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 вы должны писать операторы, включая именованные пространства:
$phql = "SELECT r.* FROM Store\Models\Robots r JOIN Store\Models\Parts p";
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/namespaces.html