Я создаю CMS, используя Laravel 4, и у меня есть базовый администратор для страниц администратора, который выглядит примерно так:
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;
}
}
Im, используя Laravel IOC-контейнер для ввода зависимостей классов в конструктор. Затем у меня есть разные классы контроллеров, которые управляют различными модулями, составляющими CMS, и каждый класс расширяет класс admin. Например:
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()
из дочернего элемента?
Я знаю, что это длинный вопрос для того, что действительно не проблема, но больше я просто хочу узнать об эффективности, но я ценю любые идеи и/или решения.
Спасибо заранее!