Symfony 4依赖注入:在代码中创建对象时注入对象

时间:2019-04-19 20:18:13

标签: php symfony dependency-injection

我正在为后端创建一个NavigationBuilder类。有了它,我应该能够添加导航项,然后获取html(类似于Symfony的FormBuilder)。在Twig扩展功能中使用。

我为导航项(例如导航链接,分隔线,标题等)创建了一个interfaceabstract类,并且正在为这些特定项创建子类。

对于其中某些导航项(链接),我需要Symfony RouterRequestStack,并且我想将其注入到抽象类中,因此不必将其作为参数传递给我需要的每个子类的构造函数。

我尝试使用通过setter方法注入它的方法,因为我认为Symfony会在创建新对象时自动执行此操作,但是显然并非如此。

NavigationItem类:

namespace App\...\Navigation;

use App\...\NavigationItemInterface;
use Symfony\...\UrlGeneratorInterface;
use Symfony\...\Request;

abstract class NavigationItem implements NavigationItemInterface {

  private $router;
  private $request;

  final public function setRouter(UrlGeneratorInterface $router): self {
    $this->router = $router;
    return $this;
  }

  final public function setRequest(Request $request): self {
    $this->request = $request;
    return $this;
  }

  final public function matchesCurrentRoute(String $route): Bool {
    return $this->getRequest()->get('_route') == $route;
  }

  /** ... **/
}

我的service.yaml文件:

App\...\NavigationItem:
        class: App\...\NavigationItem
        calls:
            - method: setRequest
              arguments:
                - '@request_stack'
            - method: setRouter
              arguments:
                - '@router'

我认为它可以像这样工作:

$builder = new NavigationBuilder();
$builder
  ->addItem( new HeaderItem('A Heading') ) // No need for injection
  ->addItem( new LinkItem('Title', 'route') ) // NEED for injection
->build(); // Returns html

我收到此错误代码:

在呈现模板的过程中引发了异常(“注意:未定义的属性:App ... \ DashboardItem :: $ router”)。

1 个答案:

答案 0 :(得分:0)

如果仅将类本身声明为private的属性,但没有子类可以使用该属性(直接)。声明为protected(在抽象类中讨论router属性),请参见:https://www.php.net/manual/en/language.oop5.visibility.php

显然,这不是唯一的问题,我想您将依赖注入与自动装配混淆了。依赖注入仅意味着,对象不会创建其自身的依赖关系,而是通过参数(在构造函数,setter或特定调用中)从外部/调用者那里获得。

自动装配可以通过从容器中获取对象来实现symfony(不过,by default you always get the same object。但是有define a factory or the option to always retrieve a new object的方法,可能不确定)。