我在控制器上的构造函数和方法上设置注入时遇到问题。
我需要实现的是能够设置全局控制器变量,而无需在控制器方法上注入该变量。
从下面的路线;
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
是一个雄辩的模型。
这将意味着$this->five
已经为控制器设置了,但是,由于我们正在使用forgetParameter()
它,因此将不再传递给您的控制器方法。
如果您专门使用Route :: model()或Route :: bind()来解析您的five
细分,则可以直接从$request->route('five')
即以下例检索实例:
$this->five = $request->route('five');
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句