laravel - внедрение зависимостей и контейнер IoC
Я пытаюсь обернуть голову вокруг внедрения зависимостей и контейнера IoC, и я использую свой UserController в качестве примера. Я определяю, от чего зависит UserController в своем конструкторе, а затем привязываю эти объекты к нему с помощью App::bind(). Если я использую Input / get() фасад / метод / вещь, не использую ли я объект Request, который я только что внедрил в него? Должен ли я использовать следующий код вместо этого, теперь, когда объект Request внедрен или InInput::get() разрешает тот же экземпляр Request? Я хотел бы использовать статические фасады, но не в том случае, если они разрешают неинъецированные объекты.
$this->request->get('email');
Внедрение зависимости
<?php
App::bind('UserController', function() {
$controller = new UserController(
new Response,
App::make('request'),
App::make('view'),
App::make('validator'),
App::make('hash'),
new User
);
return $controller;
});
UserController
<?php
class UserController extends BaseController {
protected $response;
protected $request;
protected $validator;
protected $hasher;
protected $user;
protected $view;
public function __construct(
Response $response,
\Illuminate\Http\Request $request,
\Illuminate\View\Environment $view,
\Illuminate\Validation\Factory $validator,
\Illuminate\Hashing\BcryptHasher $hasher,
User $user
){
$this->response = $response;
$this->request = $request;
$this->view = $view;
$this->validator = $validator;
$this->hasher = $hasher;
$this->user = $user;
}
public function index()
{
//should i use this?
$email = Input::get('email');
//or this?
$email = $this->request->get('email');
//should i use this?
return $this->view->make('users.login');
//or this?
return View::make('users.login');
}
1 ответ
Если вы беспокоитесь о тестируемости, вам следует вводить только те экземпляры, которые не проходят через фасад, так как сами фасады уже поддаются тестированию (то есть вы можете их высмеивать в L4). Вам не нужно вводить ответ, хеш, среду просмотра, запрос и т. Д. Похоже, вам нужно только внедрить $user
,
Для всего остального я бы просто использовал статический фасад. Проверьте swap
а также shouldReceive
методы на базе Facade
учебный класс. Вы можете легко поменять базовый экземпляр на свой собственный объект или просто начать, например, View::shouldReceive()
,
Надеюсь это поможет.