一、创建命令类
php artisan make:command Action
二、在 app\Console\Commands 目录下找到Action.php, 粘贴以下代码
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Http\Request;
use Mockery\Exception;
use Symfony\Component\Console\Output\OutputInterface;
class Action extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'action:call {uri}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'php artisan action:call XXController@xxAction?a=2';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
* @param OutputInterface $output
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function handle(Request $request)
{
$url = $this->argument('uri');
// 获取控制器+方法
$uri = parse_url($url, PHP_URL_PATH);
$uri = explode('@', $uri);
// 获取参数
parse_str(parse_url($url, PHP_URL_QUERY), $param);
$controller = $uri[0] ?? '';
$action = $uri[1] ?? '';
if (empty($controller) || empty($action)) {
$this->info('The format (Controller@method) is required');
return;
}
try {
$container = app()->make("App\Http\Controllers\\" . $controller);
} catch (Exception $e) {
$this->info($e->getMessage());
return;
}
if ($param) {
foreach ($param as $k => $v) {
$request->offsetSet($k, $v);
}
}
$result = app()->call([$container, $action], $param);
$this->info($result);
}
}
三、在 app/Console/Kernel.php 中的 $commands 增加该命令类
protected $commands = [
...,
'App\Console\Commands\Action',
];
四、如何执行
php artisan action:call XXController@xxAction
XXController 代表是控制器,xxAction是控制器某个方法
五、可能遇到问题:
执行Laravel的artisan命令时报错,提示:Could not open input file: artisan。
CD切换到Laravel项目根目录再次执行即可。