Symfony Шаблон имён сервисов

Sephi

Новичок
Немного запутался, какие имена лучше давать сервисам? Считал, что нужно по шаблону nameService, но в документации к Symfony присутствует MessageGenerator (без всякого Service в названии), находил класс с названием CurrencyConverter. Присутствует какая-то договорённость насчёт названий для сервисов?
 

Sephi

Новичок
Я понимаю, что Symfony даёт много примеров, когда нету никакого Service в названии (можно посмотреть по команде php bin/console debug:autowiring ), но так и не могу понять, когда оно нужно, а когда допустимо обойтись. Предположим, у меня есть PostRepository, когда создаю сервис, тогда нету никаких идей, кроме PostService. Если хочется использовать отдельный класс для создания сообщения, тогда пусть будет PostCreator (нужен ли тут уже Service в названии?), а когда обычный PostService превращается в PostSearcher?
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
Post это слишком абстрактно, давай определимся что за посты, и что с этими постами происходит.
если просто записать показать, то PostRepository уже достаточно, она как раз этим занимается.
есть к примеру логика модерации постов?
 

AmdY

Пью пиво
Команда форума
Вроде никакой договорённости нет, но постфиксы использоваться удобно и не только для сервисов так делают повсеместно.

Хотя с точки зрения человеческой логики это странно, неестественно и MessageGenerator звучит лучше, чем MessageGeneratorService.
 

Sephi

Новичок
А что ты понимаешь под словом "сервис"?
У меня достаточно случаев, когда в класс нужно встроить TranslatorInterface, KernelInterface, какой-нибудь репозиторий, тогда тот сразу становится ещё одним сервисом (да, так просто). Для определения того, является ли файл допустимым изображением используется список расширений и mimetype из конфигурации, которая находится в базе данных (так надо, обязательно из базы данных, можно вообще отключить, тогда файлы не смогут определиться изображениями), получается ImageDetect так же становится сервисом.
Код:
class Console {
    private $kernel;

    public function __construct(KernelInterface $kernel) {
        $this->kernel = $kernel;
    }

    public function command($command, $arguments = array()) {
        $application = new Application($this->kernel);
        $application->setAutoExit(false);
        $input = new ArrayInput(array_merge(array('command' => $command), $arguments));
        // You can use NullOutput() if you don't need the output
        $output = new BufferedOutput();
        $application->run($input, $output);
    
        // return the output, don't use if you used NullOutput()
        return $output->fetch();
    }
}
Для примера. Стоит ли такое называть ConsoleService? Понятия не имею... Получается слишком запутано, PostService и Console находятся в одном каталоге.
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума
Для примера. Стоит ли такое называть ConsoleService? Понятия не имею... Получается слишком запутано, PostService и Console находятся в одном каталоге.
ИМХО
Post - это бизнес логика, тут можно использовать Service
Console - инфраструктурный слой, который используется в разных контекстах проекта, тут лучше не лепить постфикс.
 

fixxxer

К.О.
Партнер клуба
У меня достаточно случаев, когда в класс нужно встроить TranslatorInterface, KernelInterface, какой-нибудь репозиторий, тогда тот сразу становится ещё одним сервисом (да, так просто). Для определения того, является ли файл допустимым изображением используется список расширений и mimetype из конфигурации, которая находится в базе данных (так надо, обязательно из базы данных, можно вообще отключить, тогда файлы не смогут определиться изображениями), получается ImageDetect так же становится сервисом.
Код:
class Console {
    private $kernel;

    public function __construct(KernelInterface $kernel) {
        $this->kernel = $kernel;
    }

    public function command($command, $arguments = array()) {
        $application = new Application($this->kernel);
        $application->setAutoExit(false);
        $input = new ArrayInput(array_merge(array('command' => $command), $arguments));
        // You can use NullOutput() if you don't need the output
        $output = new BufferedOutput();
        $application->run($input, $output);
 
        // return the output, don't use if you used NullOutput()
        return $output->fetch();
    }
}
Для примера. Стоит ли такое называть ConsoleService? Понятия не имею... Получается слишком запутано, PostService и Console находятся в одном каталоге.
Ну раз ты не можешь дать определение, что такое сервис, наверное, не так просто?

Если все подряд сервисы, ещё можно сказать, что все подряд классы, ты же не называешь классы с суффиксом Class?

А если посмотреть в терминологию Сифмони в районе service container, то окажется, что сервис - это не класс, а объект.

ImageDetect не может получиться, потому что это не существительное. Может получиться ImageDetector, хотя судя по описанию это ImageValidator.

Я это все к чему. Есть первая буква в SOLID, которая про single responsibility. Если возникают затруднения с формулировкой этой single responsibility в виде существительного, то, скорее всего, этот принцип нарушается. И наименование типа BillingService часто означает свалку процедур, только вместо неймспейса класс, а вместо глобальных переменных DI в конструкторе. Такой явный маркер архитектурных проблем. Точно так же как всякие там Helper или Utils.
 
Последнее редактирование:

Sephi

Новичок
Ну раз ты не можешь дать определение, что такое сервис, наверное, не так просто?
Если бы у меня было 100% определение, тогда и эта тема не понадобилась.
А если посмотреть в терминологию Сифмони в районе service container, то окажется, что сервис - это не класс, а объект.
Ну да, там же один экземпляр используется, а не создаётся каждый раз новый объект.
ImageDetect не может получиться, потому что это не существительное.
Местами проблемы с английским.
Может получиться ImageDetector, хотя судя по описанию это ImageValidator.
Может быть, оно тупо определяет изображение или нет, а не размер оценивает или разрешение, нужно перед добавлением в БД определить является ли картинкой, чтобы информацию сохранить правильно (произвести дополнительные процедуры). Обычный exif_imagetype не подходит, не со всеми форматами изображений получается работать, так же нельзя указать стандартное image/* в mimetype, да и сам метод оценки в этом сервисе определяется через конфигурацию (по расширению/mimetype/exif/комбинация из нескольких способов).
 
Последнее редактирование:
Сверху