Pimcore и внедрение зависимостей

Я хочу использовать внедрение зависимостей в Pimcore. К счастью, это возможно из коробки, начиная с Pimcore 4.x.

Но я должен признать, что я не могу заставить его работать. Я читал эти сайты: DI, DI, DI

а также документацию php-di, так как Pimcore использует его.

Теперь у меня есть плагин, простой поиск, который я хочу внедрить в один из моих контроллеров.

Структура плагинов выглядит так:

plugins
  - MyPlugin
    - lib
      - MyPlugin
        - Models
          Search.php
    - static
    - plugin.xml

Я хочу внедрить класс внутри Search.php в свой контроллер.

# plugins/MyPlugin/lib/MyPlugin/Models/Search.php
class MyPlugin_Models_Search

У самого класса нет пространства имен, но оно определено в plugin.xml.

# plugins/MyPlugin/plugin.xml
<pluginNamespace>MyPlugin</pluginNamespace>

Я скопировал di.example.php в website/config/di.php и это называется, я это проверил.

Мои определения выглядят так:

# website/config/di.php
<?php

return [
  'MyPlugin' => DI\object()->property('myPlugin', DI\get('MyPlugin_Models_Search')),
  # 'myPlugin' => \DI\object()->constructor(DI\get('MyPlugin_Models_Search'))
  # 'myPlugin' => new MyPlugin_Models_Search() // crashes everything :)
  # 'MyPlugin_Models_Search' => new MyPlugin_Models_Search()
  # many more ...
];

Мой контроллер:

# website/controllers/FooController.php
<?php

use Website\Controller\Action;

class FooController extends Action
{

  public $myPlugin;

  # this won't work: Declaration of FooController::__construct() must be
  # compatible with Zend_Controller_Action_Interface::__construct(
  # Zend_Controller_Request_Abstract $request, Zend_Controller_Response_
  # Abstract $response, array $invokeArgs = Array)
  public function __construct($plugin) {

    $this->myPlugin = $plugin;

  }

  public function FooAction() { var_dump($this->myPlugin); }

}

Я даже пытался установить определение непосредственно в pimcore/lib/Pimcore.php в function getDiContainer(), но безуспешно.

Любые идеи? Спасибо и хорошего дня!


person user3180943    schedule 18.11.2016    source источник


Ответы (1)


Вам следует ознакомиться с Руководством разработчика плагинов:

 <!-- include paths relative to plugin-directory -->
<pluginIncludePaths>
<path>/ExtensionExample/path1</path>
<path>/ExtensionExample/path2</path>
</pluginIncludePaths>
<!-- namespaces to register with autoloader-->
<pluginNamespaces>
<namespace>ExtensionExample</namespace>
<namespace>Resource</namespace>
</pluginNamespaces>

Таким образом, вы можете добавить свое пространство имен плагинов в автозагрузчик через конфигурацию, вам не нужно кодировать это самостоятельно.

person campino2k    schedule 05.12.2016
comment
Кстати: никогда не было необходимости изменять файлы DI для установки плагинов. - person campino2k; 05.12.2016
comment
Вы можете взглянуть на некоторые другие общедоступные плагины, такие как Member github.com/ pimcore-extensions/member/blob/master/plugin.xml - person campino2k; 05.12.2016