Laravel Virgin:将模型作为依赖项注入控制器

时间:2019-06-28 14:56:42

标签: php laravel-5 dependency-injection refactoring legacy-code

在我的模型的继承代码中,有一些严肃的逻辑,我想使用Laravel的依赖注入,以便将模型作为依赖项加载到控制器中,而不是使用Laravel提供的Facades。

这是一个示例控制器:

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

但是我不想使用Facade User,而是希望能够将其作为依赖项加载到控制器中:


namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;
user App\Models\User

class UserController extends Controller
{

     /**
     * @var User
     */
     private $user=null;

     public function __construct(User $user)
     {
       $this->user=$user;
     }


    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        return view('user.profile', ['user' => $this->user->findOrFail($id)]);
    }
}

之所以要这样做,是因为我来自Symfony Background,那里的依赖注入模式非常复杂。另外,依赖注入是单元测试的最佳伙伴,所以我希望能够统一我熟悉的依赖注入。

所以我想知道是否可以在控制器中存在逻辑的地方插入模型,而不是使用laravel提供的外观模式。

1 个答案:

答案 0 :(得分:2)

注册路线时,可以使用模型绑定:

// routes/web.php
Route::get('users/{user}', 'UserController@show');

然后在您的控制器中,您可以将方法更改为:

public function show(User $user)
{
    //
}

其中$user将是具有正确ID的App\User的实例。例如,如果url为/users/1,则$user将包含ID为App\User的{​​{1}}。

有关更多信息:https://laravel.com/docs/5.8/routing#route-model-binding