Laravel Virgin:在控制器中注入一个模型作为依赖
Laravel Virgin: Inject a Model In Controller as Dependency
在我继承的模型代码中有一些严肃的逻辑,我想使用 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 背景,其中依赖注入模式严重错误。另外Dependency Injection是Unit Test的最佳伙伴,所以我希望能够将我熟悉的Dependency Injection单元化
所以我想知道我是否可以在控制器中存在逻辑的地方注入模型,而不是使用 laravel 提供的外观模式。
注册路由时,可以使用模型绑定:
// routes/web.php
Route::get('users/{user}', 'UserController@show');
然后在您的控制器中,您可以将方法更改为:
public function show(User $user)
{
//
}
其中 $user
将是具有正确 ID 的 App\User
的实例。例如,如果 url 是 /users/1
,则 $user
将包含 ID 为 1
.
的 App\User
更多信息:https://laravel.com/docs/5.8/routing#route-model-binding
在我继承的模型代码中有一些严肃的逻辑,我想使用 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 背景,其中依赖注入模式严重错误。另外Dependency Injection是Unit Test的最佳伙伴,所以我希望能够将我熟悉的Dependency Injection单元化
所以我想知道我是否可以在控制器中存在逻辑的地方注入模型,而不是使用 laravel 提供的外观模式。
注册路由时,可以使用模型绑定:
// routes/web.php
Route::get('users/{user}', 'UserController@show');
然后在您的控制器中,您可以将方法更改为:
public function show(User $user)
{
//
}
其中 $user
将是具有正确 ID 的 App\User
的实例。例如,如果 url 是 /users/1
,则 $user
将包含 ID 为 1
.
App\User
更多信息:https://laravel.com/docs/5.8/routing#route-model-binding