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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4

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

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

7个月前 评论

说两个问题:

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);
7个月前 评论

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

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

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

6个月前 评论

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