php di — множественная инъекция с параметрическим параметром в php-di

Я пытаюсь использовать PHP-DI, но мне не совсем удалось.
В моем простом сканарио, контроллер, в Тема WordPress, нужен PostService и CategoryService, внедренный в конструктор:

class IndexController extends ChesterBaseController {
private $_postservice;
private $_categoryService;
public function __construct(PostService $postservice, CategoryService $categoryService){
var_dump($postservice);
var_dump($categoryService);
parent::__CONSTRUCT();
$this->$_categoryService = $categoryService;
$this->$_postservice = $postservice;
var_dump($this->$_postservice);
var_dump($this->$_categoryService);

}
public function Index(){
$firstRowPost = $this->$_postservice->GetLastPostByCategory('video');
// ...
echo $this->renderPage('index', $vm);
}
}

Это моя точка входа для контейнера в Index.php:

require_once 'vendor/autoload.php';
require_once dirname(__FILE__).'/mvc/controllers/index_controller.php';
require_once dirname(__FILE__).'/mvc/services/categoryService.php';
require_once dirname(__FILE__).'/mvc/services/postService.php';
use DI\Container;
use DI\ContainerBuilder;

$builder = new DI\ContainerBuilder();
$builder->addDefinitions(['config.php']);
$container = $builder->build();
$indexController = $container->get('IndexController');
$indexController->Index();

И ‘config.php’, который содержит определения:

return [
'PostService' => \DI\object('PostService'),
'CategoryService' => \DI\object('CategoryService'),
'IndexController' => \DI\object()->constructor(DI\get('PostService'),DI\get('CategoryService'))
];

Это результат выполнения:

C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 10:
Объект (PostService) [3005] C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 11:
Объект (CategoryService) [3006] C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 15:
Объект (CategoryService) [3006] C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 16:
Объект (CategoryService) [3006]

так что:

Неустранимая ошибка: необработанная ошибка: вызов неопределенного метода
CategoryService :: GetLastPostByCategory () в
C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ \ MVC контроллеры \ index_controller.php
на линии 19

ლ (ಠ 益 ಠ ლ) ╯

но, если я изменю порядок назначений:

public function __construct(PostService $postservice,CategoryService $categoryService){
var_dump($postservice);
var_dump($categoryService);
parent::__CONSTRUCT();
$this->$_categoryService = $categoryService;
$this->$_postservice = $postservice;
var_dump($this->$_postservice);
var_dump($this->$_categoryService);
}

Я могу читать:

C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 10:
Объект (PostService) [3005] C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 11:
Объект (CategoryService) [3006] C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 17:
Объект (PostService) [3005] C: \ XAMPP \ приложения \ WordPress \ HTDOCS \ сор-контента \ Themes \ Chester-nanalab \ MVC \ Контроллеры \ index_controller.php: 18:
Объект (PostService) [3005]

введите описание изображения здесь

(╯ ° □ °) ╯︵ ┻━┻? Оно работает!
Может кто-нибудь объяснить мне, что происходит?

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

2

Решение

Проблема в том, что вы вызываете свойство объекта как $this->$property, Свойства доступны так $this->property но определено VISIBILITY $property;

Итак, вы должны изменить свой код на это

class IndexController extends ChesterBaseController {
private $_postservice;
private $_categoryService;
public function __construct(PostService $postservice, CategoryService $categoryService){
var_dump($postservice);
var_dump($categoryService);
parent::__construct();
$this->_categoryService = $categoryService;
$this->_postservice = $postservice;
var_dump($this->_postservice);
var_dump($this->_categoryService);

}
public function Index(){
$firstRowPost = $this->_postservice->GetLastPostByCategory('video');
// ...
echo $this->renderPage('index', $vm);
}
}

За parent это отличается, потому что вы используете static аксессор (вы не получаете свойство как статическое, но это способ сделать это) parent::$property,

И помните, это __construct в нижнем регистре для любого магический метод.

Вы можете получить больше информации о классах и объектах Вот.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]