Пространства имен с Phalcon

все мои контроллеры в пространстве имен MyAppControllers Итак, как рекомендовано в документации, я установил для него пространство имен по умолчанию:

$dispatcher->setDefaultNamespace('MyAppControllers');

но теперь мне нужно не только организовать мои контроллеры в папках, но и пространство имен и иметь дружественные URL-адреса, такие как:/features/featureX/ и /wizards/featureX/. Итак, из этого примера я получил MyAppControllersFeaturesFeaturesX и MyAppControllersWizardsFeaturesX.

Я считаю, что они не должны считаться модулями правильно? Это всего лишь некоторые пользовательские маршруты, но из документации по маршрутизации I не могу сказать как:

  • объявите маршрут, который определяет только пространство имен (e.g $router->add("/:namespace", ["namespace" => 1]);)
  • сделайте вышеуказанную стратегию маршрутизации используемой только для некоторых контроллеров. Например, LoginController, следует оставить в MyAppControllers пространство имен.

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

1 ответов


ну, через некоторое время с помощью Phalcon я могу сказать, что иногда это не так гибко, когда вы решите использовать другой подход, чем те, которые мы нашли в проектной документации. Одним из таких случаев является использование пространств имен.

несколько уровней пространства имен не очень хорошо обрабатываются платформой, однако она по-прежнему хорошо спроектирована и расширяема. Вы можете переопределить почти все, и с некоторой настройкой вы можете добиться любого поведения, которое хотите.

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

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

Phalcon vs пространства имен

OK, поэтому, если вы решили сохранить исходный код PHP, организованный в папках и пространствах имен, приготовьтесь настроить почти все основные функции, а также больше явный в ваших реализациях (i.e везде используйте полные пути классов).

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

но, несмотря на всю эту дополнительную работу впереди, я решил сохранить это дизайнерское решение; в конце концов, мы выбрали структуру MVC по какой-то причине, верно?! Мы хотим держать вещи организовано. Особенно в огромных проектах, где очень важно разбавить источник в нескольких пространствах имен / файлах для улучшения ремонтопригодности.


Структура Каталогов

во-первых, вы должны знать о структуре каталогов, которую я выбрал, чтобы понять, о чем я говорю ниже. Поверьте, я истратил немного!--36-->часа дней настройки этой структуры и чтение о структурах, рекомендованных другими фреймворками MVC и ведь моя личная рекомендация очень проста: выбирайте менее проблемную! Как правило, это означает более развязанный / фрагментированный.

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

Directory structure of the project root

четкое понимание структуры каталога / пространства имен удаляет значительное количество догадок при реализации новых материалов и помогает вам написать развязанный код невольно. Если вы "отходы" какое-то время думать об этом в начале, это означает, менее болезненным переделывает для вас в будущем.


Загрузчика Класс

вы заметили source/ папка и ее содержимое организовано более или менее как стандарты PSR требования?! Причина этого в том, что "Фэлкон" по загрузчика класс соответствует PSR-0;

поэтому в основном мне просто нужно зарегистрировать только source/ папка в загрузчик:

$phLoader = new PhLoader();
// Considering the public folder as your current __DIR__
$phLoader->registerDirs(['../source/']);
$phLoader->register();

...и вуаля! Вы просто ссылаетесь на класс (используя полный путь, когда это необходимо), и внутренние реализации PHP и Phalcon найдут его. Например, чтобы зарегистрировать один из моих компонентов в контейнере DI:

// At the first time the service 'foo' is needed
// Phalcon will read the file at 'source/MyApp/Components/Foo.php'
// and then call Foo's constructor
$di->set('foo', 'MyApp\Components\Foo'); 

маршрутизатор и контроллеры

если все контроллеры находятся в одном пространстве имен/папки вы можете просто сделать это:

$router->setDefaultNamespace('MyApp\Controllers');

приятно!

но что, если у вас есть контроллер под MyApp\Controllers\Foo\BarController?!

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

ATTOW нет обходного пути, чтобы сделать маршрутизатор для поиска контроллеров в" более глубоких " пространствах имен. Мое решение до сих пор-отключить поведение маршрутизации по умолчанию и добавить вручную четыре общие схемы for каждое пространство имен бранч.

под "четырьмя общими шаблонами" я подразумеваю следующие маршруты:

:namespace/index/index когда определено только пространство имен

:namespace/:controller/index/ когда определено только пространство имен и имя контроллера

:namespace/:controller/:action/ когда пространство имен, контроллер и имя действия определены

:namespace/:controller/:action/:params когда все определено и включает параметры

включить эти маршруты для всех пространств имен Я заменил :namespace regex заполнитель с другим regex, который соответствует всем возможным пространствам имен и реализован "конвертер", который переводит маршрут в правильное пространство имен (i.e "/ foo / bar / baz"--> ['namespace' => 'MyApp\Controllers\Foo', 'controller' => 'bar', 'action' => 'baz']).

чтобы проиллюстрировать, о чем я говорю, вот пользовательский маршрутизатор, который я написал некоторое время назад и использует это метод: https://gist.github.com/snolflake/9797835


модели

вы должны следовать, что документы говорят. Это означает, что каждый раз, когда вы ссылаетесь на модель на PHQL (или определения отношений) нужно всегда использовать полный путь к классу.

вид

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

namespace MyApp\Controllers\Foo;

class BarController
{
    public function bazAction()
    {
        // The path is relative to the views dir you've set before
        $this->view->pick('configurations/subscriptions/index.volt')
        ...

С удовольствием вы можете использовать событие beforeExecuteRoute чтобы автоматически выбрать представление на основе ваших собственных соглашений.

вывод

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

между тем я просто надеюсь, что следующие версии включают в себя более удобные для пространства имен функции.