PHP traits中的依赖注入

5

特征与依赖注入是否能够配合使用?请考虑以下代码:

特征类

namespace Frame\Slick\Block;
use Frame\Slider\Slick\Block\Data as Helper

trait Slick
{
   protected $_slickHelper;
   public function __construct(Helper $slickHelper) 
   {
     $this->_slickHelper = $slickHelper;
   }
}

使用trait的类

namespace Frame\Slick\Block;

class Product ListProduct implements BlockInterface 
{
   use Slick;
   public function testTrait()
   {
      return $this->_slickHelper->getHelloWorld();
   }
}

这个似乎总是返回null,我非常确定所有内容都被正确地包含了。Trait真的支持依赖注入吗?


你使用哪个框架?这实际上取决于依赖注入在其中是如何实现的。 - apokryfos
我正在使用Magento 2。 - André Ferraz
哪个是在Zend Framework 3之上的平台。 - André Ferraz
3个回答

7

是的,它们是从 trait 代码复制到编译级别的。考虑以下代码。它按预期工作并回显正确的值。你的问题在其他地方。

<?php
class Dependency
{
    public function foo()
    {
        return 'test';
    }
}

trait Slick
{
   protected $dep;

   public function __construct(Dependency $dep) 
   {
       $this->dep = $dep;
   }
}

class Product 
{
   use Slick;

   public function testTrait()
   {
      return $this->dep->foo();
   }
}

echo (new Product(new Dependency()))->testTrait();

代码将输出'test'。 演示链接

但是你根本没有进行依赖注入。 - André Ferraz
1
我已经使用对象进行了编辑,它可以使用对象完成相同的操作。顺便说一下,字符串变量也是依赖项。 - Robert
@VentzyKunev 只需添加 as,然后重载构造函数并调用别名方法,它也将正常工作。 - Robert

1

一个正确实现的框架应该能够对trait构造函数进行依赖注入。通常使用反射来确定适合注入的参数。考虑以下示例:

<?php 

class D {}

trait T {

    public function __construct(D $d) { }


}

class A {

use T;

}


$cls = new ReflectionClass("A");

$ctor = $cls->getConstructor();

print_r($ctor->getParameters()[0]->getClass());

输出:

ReflectionClass Object
(
    [name] => D
)

这表示框架可以使用反射来确定是否注入依赖项,构造函数在trait中的事实并不重要。
如果Magento没有发生这种情况,我建议您将其移动到他们的建议线程(如果有的话)。
我还建议您通过他们的依赖注入文档了解Magento中依赖注入的工作原理。

0

不要使用构造函数!

trait SomeTrait
{

    /**
     * @var ParameterBagInterface
     */
    protected $envParams;

    /**
     * @required
     *
     * @param ParameterBagInterface $envParams
     */
    public function setFormFactory(ParameterBagInterface $envParams)
    {
        $this->envParams = $envParams;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接