问下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,为啥呢?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

你app(‘xxx’)拿到的就是一個實例了 Request已經依賴注入進去了
你要傳額外不能依賴注入的參數是用app函數的第二個參數

而且Request本來就是單例 不需要你傳入也能拿到拿到需要的 在service裡面不應該直接傳入Request 或者直接在裡面去request()去值 這樣耦合度比較高

6个月前 评论

说两个问题:

1、如果你是想改变 request 里面 id 的值,可以用下面的方式。

request()->merge(['id' => 3]);

2、你原文的 $service = app(‘App\Services\TestService’)($request); 这里,你这个方法使用方式实际就是错的,你这样写,如果 TestService 有 __invoke 方法,那么可能会调用,而看你这里的意图实际上是想给构造函数用的,那这样就是错误的,你应该像下面这样写,才是会作为参数传递给构造函数。

$service = app(‘App\Services\TestService, ['request' => $request]);

但是,如果你写了上面的 request()->merge 后,其实它会直接修改 request 对象,所以你就不需要再传递了,直接写就好了。

$service = app(‘App\Services\TestService);
6个月前 评论

可以dump()一下就知道app(className) 返回的是什么了。这个是laravel ioc的一个helper函数。可以了解下ioc

6个月前 评论
陈先生
$service = app(‘App\Services\TestService)($request);

这个写法有点抽象了。。。。

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!