Laravel фасад и жестко связанные контроллеры
Мне трудно понять, как я могу сделать это лучше всего. Я понимаю, как фасад работает как синтаксический сахар для представления четкого статического стиля компоновки кода, сохраняя при этом код свободным и тестируемым.
Однако у меня есть следующая проблема. Всякий раз, когда у меня есть контроллер, контроллер зависит от загрузки классов. Давайте возьмем входной класс в качестве примера. Каждый контроллер является контейнером IoC, так что на самом деле это хорошо. Потому что, если я хотел бы изменить входной класс с другим классом. Мне просто нужно создать новый класс, который реализует правильный интерфейс. Однако это означает, что КАЖДЫЙ контроллер в моем приложении зависит от одного и того же класса ввода. Я правильно понимаю?
Итак, я прочитал эту очень хорошую статью: http://www.nathandavison.com/posts/view/16/using-dependency-injection-and-ioc-in-laravel-4-controllers
Короче говоря, он предлагает использовать внедрение зависимостей (DI) в ваших контроллерах. НАПРИМЕР
class UsersController extends BaseController
{
protected $response;
protected $request;
protected $validator;
protected $hasher;
protected $user;
public function __construct(
Response $response,
\Illuminate\Http\Request $request,
\Illuminate\Validation\Factory $validator,
\Illuminate\Hashing\BcryptHasher $hasher,
User $user
) {
$this->response = $response;
$this->request = $request;
$this->validator = $validator;
$this->hasher = $hasher;
$this->user = $user;
}
public function getIndex()
{
return $this->response->make('Hello World!');
}
}
а также
$app->bind('UsersController', function($app) {
$controller = new UsersController(
new Response,
$app->make('request'),
$app->make('validator'),
$app->make('hash'),
new User
);
return $controller;
});
Это имеет смысл, но это не было философией структуры, потому что она обходит фасад... Я хотел бы услышать мнения об этом подходе. Это хорошая практика или нет?
1 ответ
Я думаю, что вы следовали тому же учебнику, что и другой парень, на вопрос которого я только что ответил. Вместо того, чтобы повторяться, смотрите мой ответ на его вопрос.