[英]Laravel constructor and method injection
我在构造器和控制器中的方法上设置注入时遇到问题。
我需要实现的是能够设置全局控制器变量,而无需在控制器方法上注入该变量。
从下面的路线;
Route::group(['prefix' => 'test/{five}'], function(){
Route::get('/index/{admin}', 'TestController@index');
});
我希望构造函数可以接收到五个,而该方法可以使用admin。 下面是我的控制器;
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方法上出现错误:
出现消息“传递给App \\ Http \\ Controllers \\ TestController :: index()的参数1必须是App \\ Models \\ Admin的实例,给出了字符串”引发的Symfony \\ Component \\ Debug \\ Exception \\ FatalThrowableError
下面的作品,但我不需要在该方法的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');
该错误是因为您无法通过路径传递模型。 它应该像/index/abc
或/index/123
。
您可以如下使用索引函数
public function index($admin,Request $request){}
这一定会对您有所帮助。
Route::group(['prefix' => 'test/{five}'], function () {
Route::get('/index/{admin}', function ($five, $admin) {
$app = app();
$ctr = $app->make('\App\Http\Controllers\TestController');
return $ctr->callAction("index", [$admin]);
});
});
从路由调用控制器的另一种方法。 您可以控制要从路由传递到控制器的内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.