我正在使用 Laravel 4 构建一个 CMS,并且我有一个用于管理页面的基本管理控制器,如下所示:
class AdminController extends BaseController {
public function __construct(UserAuthInterface $auth, MessagesInterface $message, ModuleManagerInterface $module)
{
$this->auth = $auth;
$this->user = $this->auth->adminLoggedIn();
$this->message = $message;
$this->module = $module;
}
}
我使用 Laravel 的 IOC 容器将类依赖项注入到构造函数中。然后,我有各种控制器类来控制组成 CMS 的不同模块,并且每个类都扩展管理类。例如:
class UsersController extends AdminController {
public function home()
{
if (!$this->user)
{
return Redirect::route('admin.login');
}
$messages = $this->message->getMessages();
return View::make('users::home', compact('messages'));
}
}
现在这工作得很好,但是当我向UsersController
班级。例如:
class UsersController extends AdminController {
public function __construct(UsersManager $user)
{
$this->users = $users;
}
public function home()
{
if (!$this->user)
{
return Redirect::route('admin.login');
}
$messages = $this->message->getMessages();
return View::make('users::home', compact('messages'));
}
}
由于子类现在有一个构造函数,这意味着父类的构造函数不会被调用,因此子类所依赖的东西,例如this->user
不再有效,从而导致错误。我可以通过调用管理控制器的构造函数parent::__construct()
但是,由于我需要传递类依赖项,因此我需要在子构造函数中设置这些依赖项,从而产生如下所示的结果:
class UsersController extends AdminController {
public function __construct(UsersManager $user, UserAuthInterface $auth, MessagesInterface $message, ModuleManagerInterface $module)
{
parent::__construct($auth, $messages, $module);
$this->users = $users;
}
// Same as before
}
现在,就其功能而言,它工作得很好;然而,在我看来,必须在每个具有构造函数的子类中包含父级的依赖项似乎不是很有效。看起来也相当凌乱。 Laravel 是否提供了解决此问题的方法,或者 PHP 是否支持一种调用父构造函数和子构造函数而无需调用的方法parent::__construct()
来自孩子?
我知道这是一个很长的问题,因为什么实际上不是问题,但更多的是我对效率的强迫症,但我很欣赏任何想法和/或解决方案。
提前致谢!