__invoke в Symfony

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

class AddKeyword
{
    /**
     * @var KeywordRepository
     */
    private $keywordRepository;

    public function __construct(KeywordRepository $keywordRepository)
    {
        $this->keywordRepository = $keywordRepository;
    }

    public function __invoke(string $name): Keyword
    {
        $entity = $this->keywordRepository->findOneByName($name);

        if ($entity)
            return $entity;

        $entity = Keyword::create(KeywordId::create(), $name);
        $this->keywordRepository->save($entity);

        return $entity;
    }
}

Но для использования этого класса я должен разрешить DI. Как это сделать?

Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
759
1

Ответы 1

Не уверен в том, чего вы хотите достичь, но если вы хотите добавить/получить ключевое слово везде в своей кодовой базе, у вас есть 2 варианта:

  • Использовать автопроводку
  • Объявите свой класс как сервис и получите его из контейнера.

Symfony поощряет DI с помощью автоматического связывания.

namespace App\Controller;

use App\AddKeyword;

class DefaultController
{
    public function __construct(Addkeyword $keyword) {
        $keyword('keyword');
    }

}

Да, это работает. Но если я сделаю это таким образом, ``` public function __construct(AddKeyword $addKeywordService) { $this->addKeywordService = $addKeywordService; } публичная функция __invoke(ScanKeywordPositionsCommand $command) { $keyword = $this->addKeywordService($command->keyword); } ``` Попытка вызвать неопределенный метод с именем "addKeywordService" класса "App\Domain\Keyword\Command\Scan\ScanKeywordPositionsHandler‌​"

akor 09.03.2019 13:47

Извините за некрасивый комментарий. Я не мог понять, как правильно разместить код форматирования в комментарии :(

akor 09.03.2019 13:58

Ну, это не проблема Symfony, а проблема реализации PHP, когда. Вы не можете вызвать вложенную функцию __invoke, если вы сохраняете первый объект как свойство второго. Протестируйте этот код в phpsandbox, вы увидите: codeshare.io/G8kmOe. Также вам следует избегать использования магической функции PHP, она может сбивать с толку, ее сложно поддерживать из-за накладных расходов и она не очень хорошо поддерживается IDE. Они могут быть мощными, но им нужно действительно хорошее понимание их полезности, интерпретаций и ограничений.

GuillaumeL 11.03.2019 22:25

Другие вопросы по теме