2013-04-05 2 views
4

의존성 주입과 IoC 컨테이너 주위에서 머리를 감싸려고하고 있는데, 예를 들어 UserController를 사용하고 있습니다. UserController가 생성자에 의존하는 것을 정의한 다음 App :: bind()를 사용하여 해당 객체를 바인딩합니다. 만약 내가 Input :: get() facade/method/thing을 사용한다면 Request 객체를 사용하지 않을 것인가? 요청 객체가 삽입되었거나 동일한 요청 인스턴스로 doesInput :: get()이 해결되었으므로 이제 다음 코드를 사용해야합니까? 나는 정적 인 정면을 사용하고 싶지만 그들이 사출되지 않은 물체를 해결할 수는 없다.laravel - 의존성 주입과 IoC 컨테이너

$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'); 
} 

답변

10

당신은 당신이 정말로 단지 외관를 통해 라우팅되지 않는 경우를 주입 있어야 할 테스트 용이성 일이 걱정하는 경우 facades 자체는 이미 테스트가 가능하기 때문에 (L4에서 이것을 조롱 할 수 있음을 의미). 응답, 해셔, 환경보기, 요청 등을 주입 할 필요가 없습니다. 외모로 보면 $user 만 주입하면됩니다.

그 밖의 모든 것에 대해서는 정적 외관을 사용하는 데 전념해야합니다. Facade 클래스의 swapshouldReceive 메소드를 확인하십시오. 기본 객체를 자신의 조롱 된 객체로 쉽게 교체하거나 간단히 조롱 할 수 있습니다 (예 : View::shouldReceive()).

희망이 도움이됩니다.

+2

전역 상태, 결합을위한 정적 호출 (특히 프레임 워크에 대한) 및 종속성 해결을위한 서비스 로케이터로 인해 오브젝트 api의 거짓말 쟁이가되어 다음과 같이 facades를 통해 다음을 옹호합니다. – Jimbo

+1

@Jimbo 나는 당신이 Laravel과의 나의 불안감을 근본이라고 생각합니다. –