[英]Call to a parent class member from child without calling constructor dependencies
I have my base controller and my content controller extending it like below, and I'm getting a Call to a member function error() on null
so my question is:我有我的基本控制器和我的内容控制器像下面一样扩展它,我Call to a member function error() on null
收到Call to a member function error() on null
的Call to a member function error() on null
所以我的问题是:
Do I have to call the parent constructor?我必须调用父构造函数吗?
If "yes" then is it better to have a service because the parent controller has some injected dependencies that I don't want to inject myself by calling the parent constructor如果“是”,那么最好提供服务,因为父控制器有一些注入的依赖项,我不想通过调用父构造函数来注入自己
use Psr\Log\LoggerInterface;
class BaseController extends AbstractController
{
/** @var LoggerInterface */
protected $logger;
/**
* BaseController constructor.
*/
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
}
class ContentController extends BaseController
{
private $contentRepository;
private $breadcrumbService;
public function __construct(
ContentRepository $contentRepository,
BreadcrumbInterface $breadcrumbService
) {
$this->contentRepository = $contentRepository;
$this->breadcrumbService = $breadcrumbService;
}
public function contentPage(...)
{
try {
....
} catch (\Throwable $exception) {
$this->logger->error(...);
throw $exception;
}
}
You do not need to call the constructor.您不需要调用构造函数。 But you do need to set the $logger
property if you want to use it.但是如果你想使用它,你确实需要设置$logger
属性。
class ContentController extends BaseController
{
private $contentRepository;
private $breadcrumbService;
public function __construct(
LoggerInterface $logger,
ContentRepository $contentRepository,
BreadcrumbInterface $breadcrumbService
) {
$this->contentRepository = $contentRepository;
$this->breadcrumbService = $breadcrumbService;
$this->logger = $logger;
}
}
With the above you no longer need to call parent::__construct()
.有了上面的内容,您不再需要调用parent::__construct()
。 But it's simply good practice, painless and harmless:但这只是一种很好的做法,无痛无害:
Just do:做就是了:
public function __construct(
LoggerInterface $logger,
ContentRepository $contentRepository,
BreadcrumbInterface $breadcrumbService
) {
$this->contentRepository = $contentRepository;
$this->breadcrumbService = $breadcrumbService;
parent::__construct($logger);
}
But if the only purpose of BaseController
is to provide some logging methods, it's probably better to simply inject the logger service in ContentController
and use it directly.但是如果BaseController
的唯一目的是提供一些日志记录方法,那么在ContentController
简单地注入记录器服务并直接使用它可能会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.