Я пытаюсь обернуть голову вокруг инъекции зависимостей и контейнера IoC, и я использую мой UserController в качестве примера. Я определяю, что зависит от UserController в его конструкторе, а затем привязываю к нему эти объекты, используя App :: bind (). Если я использую Input :: get () facade / method / thing, я не воспользовался объектом Request, который я просто ввел в него? Должен ли я использовать следующий код вместо этого, теперь, когда объект запроса вводится или hasInput :: get () разрешается к тому же экземпляру запроса? Я хотел бы использовать статические фасады, но не если они разрешают неинжектированные объекты.
$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'); }
Если вы беспокоитесь о тестируемости, то вам действительно нужно только вводить экземпляры, которые не прокладываются через фасад, поскольку сами фасады уже можно тестировать (что означает, что вы можете имитировать их в L4). Вам не нужно вводить ответ, хешер, среду просмотра, запрос и т. Д. По его мнению вам нужно всего лишь вводить $user
.
Для всего остального я просто придерживаюсь использования статического фасада. Ознакомьтесь с методами swap
и shouldReceive
на базе класса Facade
. Вы можете легко поменять исходный экземпляр своим собственным издеваемым объектом или просто начать насмехаться, например, View::shouldReceive()
.
Надеюсь это поможет.