首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文|Laravel命令行调用控制器方法,你会几个?

3分钟短文|Laravel命令行调用控制器方法,你会几个?

作者头像
程序员小助手
发布2020-08-26 21:57:38
1.7K0
发布2020-08-26 21:57:38
举报
文章被收录于专栏:程序员小助手程序员小助手

引言

有时候为了不重写代码,避免冗余无用重复的代码在程序内到处都是。我们总是想方设法 把写过的逻辑拿过来使用。

今天要说的就是在laravel中,能不能在命令行中调用控制器的方法, 怎么去实现?

学习时间

为了快速测试控制器方法可不可行,我们有时候会想,能不能像这样在命令行直接访问某个控制器路由的方法。

php index.php --uri=controller/method/var1/var2

要知道国内号称用途最广的thinkphp都已经这样用了,laravel可落后乎?当然不可。

于是我们想,既然laravel提供了artisan的命令行调用,何不先做一个命令,然后在命令内使用程序方法 调用控制器呢。说来就动手开写。

首先创建一个命令类。

php artisan make:command CallRoute

系统都是按照模板生成的 CallRoute.php 文件,我们只捡特殊的部分贴出来。首先定义命令格式和传入的参数。

protected $signature = 'route:call {uri}';

然后是用法的描述:

protected $description = 'php artsian route:call /route';

要访问uri地址,我们肯定要构造一个请求体,传入对应的参数,这样控制器方法才能正确地接收。

$request = Request::create($this->argument('uri'), 'GET');

这里构造的请求体非常灵活,你可以模拟任何有效的请求,地址,方法,参数,等等。然后重点来了,我们使用laravel框架提供的 Container 容器构造一个调用:

app()->make(\Illuminate\Contracts\Http\Kernel::class)->handle($request);

就酱。

为了让你的命令在laravel生命周期内可被注册,还需要手动注册一下。在文件 app/Console/Kernel.php 内加这么一行:

protected $commands = [
    'App\Console\Commands\CallRoute'
];

现在你就可以在命令行使用了:

php artisan route:call /path

当然了如果你使用的laravel版本比较高,其提供了 tinker 功能,会让你眼前一亮,相见恨晚。比如原始的请求路由地址是这样的:

URL: http://xxx.test/calendar?filter[id]=1&anotherparam=2

那么我们可以直接使用容器实例化一个控制器对象:

 $cc = app()->make('App\Http\Controllers\CalendarController');

然后使用全局容器盒子调用控制器对象的方法,并传送参数:

app()->call([$cc, 'getCalendarV2'], ['filter[id]'=>1, 'anotherparam' => '2']);

是不是超级简单,有没有?可见,laravel容器盒子这种设计理念,几乎可以跨任意区域调用, 提供的强大能力,非同寻常。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 学习时间
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档