Внедрение нескольких параметров конструктора в 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\apps\wordpress\htdocs\wp-content\themes\chester-nanalab\mvc\controllers\index_controller.php:10: объект(PostService)[3005] C:\xampp\apps\wordpress\htdocs\wp -content\themes\chester-nanalab\mvc\controllers\index_controller.php:11: object(CategoryService)[3006] C:\xampp\apps\wordpress\htdocs\wp-content\themes\chester-nanalab\mvc\controllers \index_controller.php:15: объект(CategoryService)[3006] C:\xampp\apps\wordpress\htdocs\wp-content\themes\chester-nanalab\mvc\controllers\index_controller.php:16: объект(CategoryService)[ 3006]

так что:

Неустранимая ошибка: Uncaught Error: вызов неопределенного метода CategoryService::GetLastPostByCategory() в C:\xampp\apps\wordpress\htdocs\wp-content\themes\chester-nanalab\mvc\controllers\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\apps\wordpress\htdocs\wp-content\themes\chester-nanalab\mvc\controllers\index_controller.php:10: объект(PostService)[3005] C:\xampp\apps\wordpress\htdocs\wp -content\themes\chester-nanalab\mvc\controllers\index_controller.php:11: object(CategoryService)[3006] C:\xampp\apps\wordpress\htdocs\wp-content\themes\chester-nanalab\mvc\controllers \index_controller.php:17: объект(PostService)[3005] C:\xampp\apps\wordpress\htdocs\wp-content\themes\chester-nanalab\mvc\controllers\index_controller.php:18: объект(PostService)[ 3005]

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

(╯°□°)╯︵ ┻━┻? Это работает! Кто-нибудь может мне объяснить что случилось?

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


person alessandro    schedule 07.10.2017    source источник
comment
Вы звоните $this->$_categoryService = $categoryService; и $this->$_postservice = $postservice;, вы должны звонить $this->_categoryService и $this->_postservice   -  person matiaslauriti    schedule 08.10.2017
comment
спасибо @matiaslauriti, к сожалению, это всего лишь мой второй день на php, вы правы, пожалуйста, добавьте свой ответ, чтобы я мог его принять   -  person alessandro    schedule 08.10.2017


Ответы (1)


Проблема в том, что вы вызываете свойство объекта как $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 в нижнем регистре для любого магического метода.

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

person matiaslauriti    schedule 08.10.2017
comment
рад узнать что-то новое Матиас, большое спасибо! Всего наилучшего. - person alessandro; 08.10.2017
comment
Также обратите внимание, что $builder->addDefinitions(['config.php']) недопустимо, должно быть $builder->addDefinitions('config.php'). - person Matthieu Napoli; 08.10.2017
comment
@InferOn Я очень рад помочь, документация по PHP довольно обширна и хороша, так что не забудьте заглянуть туда, вы найдете что угодно: D - person matiaslauriti; 08.10.2017
comment
@MatthieuNapoli Спасибо, что указали на это. Я ничего не знаю о Wordpress, так что спасибо. - person matiaslauriti; 08.10.2017
comment
@MatthieuNapoli, вы правы, и спасибо за вашу работу над php-di - person alessandro; 08.10.2017