Laravel-injection de dépendance et le conteneur IoC

j'essaie d'enrouler ma tête autour de l'injection de dépendance et du conteneur IoC et j'utilise mon UserController comme exemple. Je suis en train de définir ce dont dépend le Controller UserController dans son constructeur et puis je lie ces objets à celui-ci en utilisant App::bind(). Si j'utilise L'entrée:: get () facade / method / thing Je ne profite pas de l'objet Request que je viens d'injecter dedans? Devrais-je utiliser le code suivant à la place, maintenant que l'objet Request est injecté ou doesInput:: get() résoudre à la même instance de demande? J'aimerais utiliser les façades statiques mais pas s'ils se résolvent à des objets non injectés.

$this->request->get('email');

injection de dépendance

<?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,
    IlluminateHttpRequest $request,
    IlluminateViewEnvironment $view,
    IlluminateValidationFactory $validator,
    IlluminateHashingBcryptHasher $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');
}
4
demandé sur David 2013-04-05 05:55:04

1 réponses

si vous êtes inquiet au sujet de la testabilité, alors vous ne devriez vraiment injecter que des instances qui ne sont pas acheminées à travers une façade, car les façades elles-mêmes sont déjà testables (ce qui signifie que vous pouvez vous moquer de celles-ci en L4). Vous ne devriez pas avoir besoin d'injecter la réponse, le hasher, l'environnement de vue, la demande, etc. À première vue, vous n'avez qu'à injecter le $user .

pour le reste, je m'en tiens à la façade statique. Découvrez l' swap et shouldReceive méthodes sur la base Facade classe. Vous pouvez facilement changer l'instance sous-jacente avec votre propre objet moqué ou tout simplement commencer à vous moquer avec, par exemple, View::shouldReceive() .

Espérons que cette aide.

10
répondu Jason Lewis 2013-04-06 08:50:51