【问题标题】:Pimcore and Dependency InjectionPimcore 和依赖注入
【发布时间】:2017-04-02 09:07:54
【问题描述】:

我想在 Pimcore 中使用依赖注入。幸运的是,自 Pimcore 4.x 以来,这是开箱即用的。

但我必须承认我无法让它发挥作用。我读过这些网站:DIDIDI

以及 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()但没有成功。

有什么想法吗?谢谢你,祝你有美好的一天!

【问题讨论】:

    标签: pimcore php-di


    【解决方案1】:

    你应该看看Plugin Developer Guide

     <!-- 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>
    

    因此您可以通过配置将插件命名空间添加到自动加载器,无需自己编写代码。

    【讨论】: