Я хочу разделить свою кодовую базу на простые классы для конкретных целей, например:
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. Как это сделать?
Заранее спасибо.




Не уверен в том, чего вы хотите достичь, но если вы хотите добавить/получить ключевое слово везде в своей кодовой базе, у вас есть 2 варианта:
Symfony поощряет DI с помощью автоматического связывания.
namespace App\Controller;
use App\AddKeyword;
class DefaultController
{
public function __construct(Addkeyword $keyword) {
$keyword('keyword');
}
}
Извините за некрасивый комментарий. Я не мог понять, как правильно разместить код форматирования в комментарии :(
Ну, это не проблема Symfony, а проблема реализации PHP, когда. Вы не можете вызвать вложенную функцию __invoke, если вы сохраняете первый объект как свойство второго. Протестируйте этот код в phpsandbox, вы увидите: codeshare.io/G8kmOe. Также вам следует избегать использования магической функции PHP, она может сбивать с толку, ее сложно поддерживать из-за накладных расходов и она не очень хорошо поддерживается IDE. Они могут быть мощными, но им нужно действительно хорошее понимание их полезности, интерпретаций и ограничений.
Да, это работает. Но если я сделаю это таким образом, ``` public function __construct(AddKeyword $addKeywordService) { $this->addKeywordService = $addKeywordService; } публичная функция __invoke(ScanKeywordPositionsCommand $command) { $keyword = $this->addKeywordService($command->keyword); } ``` Попытка вызвать неопределенный метод с именем "addKeywordService" класса "App\Domain\Keyword\Command\Scan\ScanKeywordPositionsHandler"