我正在为后端创建一个NavigationBuilder
类。有了它,我应该能够添加导航项,然后获取html(类似于Symfony的FormBuilder)。在Twig扩展功能中使用。
我为导航项(例如导航链接,分隔线,标题等)创建了一个interface
和abstract
类,并且正在为这些特定项创建子类。
对于其中某些导航项(链接),我需要Symfony Router
或RequestStack
,并且我想将其注入到抽象类中,因此不必将其作为参数传递给我需要的每个子类的构造函数。
我尝试使用通过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”)。
答案 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的方法,可能不确定)。