Я только начал использовать PHP-DI
и это здорово, однако я не могу решить одну проблему.
Вот мои определения услуг
<?php
return [
'services.report'=> DI\autowire( '\CRM\Report\Service\ReportService' ),
'\CRM\Report\Service\ReportServiceContract' => DI\get ( 'services.report' )
];
И мой класс определяется следующим образом
class ReportService implements ReportServiceContract {
private $repository;
/**
* ReportService constructor.
* @Inject("repositories.report_tasks")
*
* @param $repository
*/
public function __construct( $repository ) {
$this->repository = $repository;
var_dump( $this->repository->getReportTaskById( 1 )->getDateSubmitted() );
}
}
Имея эту конфигурацию, я получаю следующую ошибку
Запись «services.report» не может быть разрешена: параметр $ репозиторий
__construct () не имеет определенного или предполагаемого значения
Полное определение:
Объект (
class = \ CRM \ Report \ Service \ ReportService
ленивый = ложный
__construct (
$ repository = # НЕ УКАЗАНО #
)
)
Я попытался отладить источники, и заметил, что даже AnnotationReader
Экземпляр не создан.
Но при использовании следующего определения
<?php
return [
'services.report' => DI\autowire( '\CRM\Report\Service\ReportService' )->constructorParameter('repository',DI\get('repositories.report_tasks')),
'\CRM\Report\Service\ReportServiceContract' => DI\get ( 'services.report' )
];
Все отлично работает
Что не так с моей конфигурацией?
Чтобы использовать аннотации, их нужно включить (по умолчанию они отключены): http://php-di.org/doc/annotations.html#installation
Аннотации по умолчанию отключены. Чтобы использовать их, сначала необходимо установить Учение Аннотации библиотека с использованием Composer:
composer require doctrine/annotations
Затем вам нужно настроить
ContainerBuilder
использовать их:$containerBuilder->useAnnotations(true);
Других решений пока нет …