Laravel绑定:call()方法的使用方式及示例问询
如何使用Laravel容器的
call()方法及示例 嘿,我来帮你把Laravel容器里的call()方法讲明白~这个方法的核心作用就是帮你自动注入依赖,不管你要调用的是闭包、类的方法,甚至是全局函数,它都能帮你搞定参数里的依赖项,不用手动去实例化。
先结合你给出的方法定义,我们分几种常用场景来看示例:
1. 调用带依赖的闭包
这是最常见的用法之一,你可以直接把需要依赖注入的闭包传给call(),Laravel会自动从容器里解析出类型提示的依赖:
// 比如我们需要用到User模型和邮件服务 $this->app->call(function(App\Models\User $user, Illuminate\Contracts\Mail\Mailer $mailer) { // 直接使用自动注入的实例 $mailer->send( 'emails.welcome', ['user' => $user], fn($message) => $message->to($user->email) ); });
这里的User和Mailer不需要你手动new,容器会帮你处理好。
2. 调用类的方法
你可以调用某个类的特定方法,同样支持依赖注入,有两种写法:
写法一:传入实例和方法名
// 先定义一个服务类 class UserService { public function sendWelcomeEmail(App\Models\User $user, Illuminate\Contracts\Mail\Mailer $mailer) { $mailer->send( 'emails.welcome', ['user' => $user], fn($message) => $message->to($user->email) ); } } // 调用这个方法,手动传入实例 $this->app->call( [new UserService, 'sendWelcomeEmail'], ['user' => App\Models\User::find(1)] // 自定义参数(非依赖项) );
写法二:直接传入类名和方法名(容器自动实例化类)
// 让容器自动实例化UserService,然后调用方法 $this->app->call( 'App\Services\UserService@sendWelcomeEmail', ['user' => App\Models\User::find(1)] );
3. 混合自定义参数与依赖注入
如果你的方法里既有类型提示的依赖,又有普通参数,可以把普通参数放在第二个数组里:
$this->app->call(function($greeting, App\Models\User $user) { echo "{$greeting}, {$user->name}!"; }, ['greeting' => 'Welcome back']); // 输出:Welcome back, John!
这里$greeting是我们手动传的,$user则由容器自动注入。
4. 使用defaultMethod参数
当你只传类名,不想写方法名时,可以用第三个参数指定默认调用的方法:
class GreetingService { public function sayHello($name) { return "Hello, {$name}!"; } } // 调用类的默认方法sayHello $result = $this->app->call( 'App\Services\GreetingService', ['name' => 'Adam'], 'sayHello' ); echo $result; // 输出:Hello, Adam!
关于你猜想的用法
你写的$this->app->call('how_to_use_this_params')是可行的——如果how_to_use_this_params是一个全局函数的话。不过大部分场景下,我们用call()来处理带依赖的逻辑,这样才能发挥它自动注入的优势~
内容的提问来源于stack exchange,提问作者Adam Kozlowski
相关产品推荐
相关产品推荐

