问下laravel为啥我不能再类后面加上方法名?
情况是这样的,我在一个控制器里面
$request->offsetSet(‘id’,3);
$service = app(‘App\Services\TestService’)($request);
然后再TestService里面的构造函数
public function __construct(Request $request)
{
echo $request->input(‘id’,’0’);
}
本来希望能打印出3的,但是给我一个报错
Function name must be a string,为啥呢?
你app(‘xxx’)拿到的就是一個實例了 Request已經依賴注入進去了
你要傳額外不能依賴注入的參數是用app函數的第二個參數
而且Request本來就是單例 不需要你傳入也能拿到拿到需要的 在service裡面不應該直接傳入Request 或者直接在裡面去request()去值 這樣耦合度比較高
说两个问题:
1、如果你是想改变 request 里面 id 的值,可以用下面的方式。
2、你原文的
$service = app(‘App\Services\TestService’)($request);
这里,你这个方法使用方式实际就是错的,你这样写,如果 TestService 有__invoke
方法,那么可能会调用,而看你这里的意图实际上是想给构造函数用的,那这样就是错误的,你应该像下面这样写,才是会作为参数传递给构造函数。但是,如果你写了上面的
request()->merge
后,其实它会直接修改request
对象,所以你就不需要再传递了,直接写就好了。可以dump()一下就知道app(className) 返回的是什么了。这个是laravel ioc的一个helper函数。可以了解下ioc
这个写法有点抽象了。。。。