php - Laravel 构造函数和方法注入
问题描述
我在控制器中的构造函数和方法上设置注入时遇到问题。
我需要实现的是能够设置全局控制器变量,而无需在控制器方法上注入相同的变量。
从下面的路线;
Route::group(['prefix' => 'test/{five}'], function(){
Route::get('/index/{admin}', 'TestController@index');
});
我希望构造函数接收五个,而管理员对该方法可用。下面是我的控制器;
class TestController extends Controller
{
private $five;
public function __construct(PrimaryFive $five, Request $request)
{
$this->five = $five;
}
public function index(Admin $admin, Request $request)
{
dd($request->segments(), $admin);
return 'We are here: ';
}
...
当我运行我正在考虑使用的上述内容时,我在 index 方法上遇到错误:
Symfony\Component\Debug\Exception\FatalThrowableError 抛出消息“传递给 App\Http\Controllers\TestController::index() 的参数 1 必须是 App\Models\Admin 的实例,给定字符串”
下面的作品,但我不需要该方法的 PrimaryFive 注入。
class TestController extends Controller
{
private $five;
public function __construct(PrimaryFive $five, Request $request)
{
$this->five = $five;
}
public function index(PrimaryFive $five, Admin $admin, Request $request)
{
dd($request->segments(), $five, $admin);
return 'We are here: ';
}
...
有没有办法可以使用模型(有效)设置构造函数注入并设置方法注入,而无需在构造函数中注入模型集?
解决方案
一种方法是使用控制器中间件:
public function __construct()
{
$this->middleware(function (Request $request, $next) {
$this->five = PrimaryFive::findOrFail($request->route('five'));
$request->route()->forgetParameter('five');
return $next($request);
});
}
以上假设PrimaryFive
是一个 Eloquent 模型。
这将意味着$this->five
为控制器设置,但是,因为我们正在使用forgetParameter()
它将不再传递给您的控制器方法。
如果您特定使用Route::model() 或 Route::bind()来解析您的five
段,那么您可以直接从$request->route('five')
即检索实例:
$this->five = $request->route('five');
推荐阅读
- c++11 - 模板参数扣除/替换失败错误,同时迭代两个映射时
- jquery - 将参数名称传递给 DropDownList 内部
- c# - 在我的 .aspx 页面上循环访问 SQL Server 结果
- python - 遍历字符串的字符
- python - Calculating Difference from two different lists in Python
- corda - 需要帮助修复错误 IOUContractNull 附件找不到
- postgresql - PostgreSQL:尽管有索引,但顺序扫描
- javascript - 将 mongoDB 视图的结果发送到另一个集合( INSERT....SELECT from SQL )
- selenium - WebUiBuiltInKeywords.findWebElement() 不工作,WebElementNotFoundException
- javascript - 从 momentJS 持续时间获取时间计算