Я пытаюсь использовать 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]
(╯ ° □ °) ╯︵ ┻━┻? Оно работает!
Может кто-нибудь объяснить мне, что происходит?
Заранее спасибо.
Проблема в том, что вы вызываете свойство объекта как $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
в нижнем регистре для любого магический метод.
Вы можете получить больше информации о классах и объектах Вот.
Других решений пока нет …