我正在使用 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()
的方法?
我知道这是一个长问题,实际上不是一个问题,只是我对效率有点强迫症,但我感激任何想法和/或解决方案。
提前致谢!
Request
对象,而不是在每个控制器中重新执行它。这样我就可以在基础控制器中设置一些东西(比如用户),而不必诉诸门面。在PHP中可能吗?通过反射在Laravel中实现这个功能是否可行?我还不知道足够多关于反射的知识来回答这个问题。谢谢。 - Andrew Brown