4

我正试图围绕依赖注入和 IoC 容器展开思考,我以我的 UserController 为例。我在其构造函数中定义了 UserController 所依赖的内容,然后使用 App::bind() 将这些对象绑定到它。如果我使用 Input::get() 外观/方法/事物,我是否没有利用我刚刚注入的 Request 对象?我应该改用以下代码吗,既然 Request 对象被注入或 doInput::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;
});

用户控制器

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

1 回答 1

10

如果您担心可测试性,那么您实际上应该只注入没有通过外观路由的实例,因为外观本身已经是可测试的(这意味着您可以在 L4 中模拟它们)。您不需要注入响应、哈希、视图环境、请求等。从外观上看,您只需要注入$user.

对于其他所有事情,我都会坚持使用静态外观。查看基类的swapand方法。您可以轻松地将底层实例替换为您自己的模拟对象,或者简单地开始模拟,例如.shouldReceiveFacadeView::shouldReceive()

希望这可以帮助。

于 2013-04-06T08:50:51.817 回答