繁体   English   中英

Laravel Virgin:在控制器中注入一个模型作为依赖

[英]Laravel Virgin: Inject a Model In Controller as Dependency

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

所以这是一个示例控制器:

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 背景,其中依赖注入模式被严重破坏。 另外依赖注入是单元测试最好的伙伴,所以我希望能够将我熟悉的依赖注入统一化。

所以我想知道我是否可以在Controllers中注入逻辑存在的模型,而不是使用laravel提供的Facade Pattern。

当你注册你的路由时,你可以使用模型绑定:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM