Service Provider / DI идентификаторы - как назвать их в PHP? - PullRequest
0 голосов
/ 12 июня 2019

Сложные PHP-приложения имеют сотни сервисов. Каждый сервис связан с идентификатором сервиса, обычно это строка, выбранная разработчиком. Например, repository.users.sqlite является экземпляром класса UserRepository, настроенным для работы с пользователями таблицей, по умолчанию sqlite экземпляром.

Какое соглашение о присвоении имен для такой строки?

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

Я вижу некоторые варианты, но ни один не идеален:

  • используйте строку (что-то вроде repository.users.sqlite) и копируйте / вставляйте ее везде
$di['users.service'] = new UsersService($di['repository.users.sqlite']);
  • создайте константу для хранения идентификатора службы где-нибудь в классе поставщика услуг и используйте ее:
const USERS_REPOSITORY_SQLLITE = 'repository.users.sqlite'; 
const USERS_SERVICE = 'users.service';

$di[self::USERS_SERVICE] = new UsersService($di[self::USERS_REPOSITORY_SQLITE]);
  • использовать встроенные константы класса PHP (UserRepository::class) в качестве подхода к присвоению имен для идентификаторов сервисов. Таким образом, нет необходимости создавать постоянную или запоминать что-то. Также в этом случае работает завершение кода в среде IDE.
$di[UsersService::class] = new UsersService($di[UsersRepository::class]); // default sqlite implementation is used here

Какое соглашение об именах для идентификаторов службы DI вы используете и почему?

1 Ответ

0 голосов
/ 12 июня 2019

Если фреймворки не заставляют вас использовать строковые идентификаторы, как это делает Symphony, я предпочитаю использовать :: class константу, причина:

  • Готовая встроенная константа.Не нужно думать об именах и значениях идентификаторов.
  • Константа класса уже содержит всю информацию для идентификации класса: пространство имен, модуль и имя.
  • Хотя в IDE легче найти примененияэтого класса в определениях контейнеров.

За некоторым исключением, когда повторяется одно и то же конкретное определение сервиса, я использую в качестве идентификатора: MyClass :: name.':: customIdentifier' ;

Кстати: я уже много лет работал с Symphony DI, но я все еще предпочитаю этот способ, о котором упоминал (которым я сейчас пользуюсь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...