本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了运行命令行脚本的相关问题,laravel 中有个专门单独的目录,也就是 console 目录,它是用于存放脚本文件的。下面一起来看一下,希望对大家有帮助。
推荐学习:laravel入门
我们看到了 laravel 中有个专门单独的目录,也就是 console 目录,它是用于存放脚本文件的。这个脚本文件一般指的就是我们通过 php 命令来执行的命令行脚本,在许多框架中都有这样的功能。对于现代化的应用开发来说,一些数据统计、数据导出、队列处理等比较耗时的功能,以及一些自动化的后端运行程序,都需要使用这种命令行脚本来执行。
默认提供的脚本在当前的框架目录中,我们在根目录执行 php artisan ,就可以看到命令行的帮助信息,这里就列出了所有已经存在的命令行脚本。第一篇文章中,我们就接触过这其中的两个命令。
# php artisan key:generate# php artisan serve
它们的作用一个是生成一个加密缓存等需要使用的唯一 key ,另一个是运行一个自带的简易服务器。从脚本名称中我们可以看出,脚本可以以一个 : 分隔,冒号前面是大的分类,比如有 cache:xxx 相关的,也有 make:xxx 相关的。cache 相关的就是处理一些缓存信息的,而 make 相关的则是创建一些我们需要的文件,比如创建一个控制器可以使用 make:controller ,创建一个数据模型可以使用 make:model 。
关于这些默认自带的脚本,我们将在学习到相关内容的时候顺带着一起学习。
自定义一个脚本自定义一个脚本非常简单。我们可以使用 make:command 命令来生成一个命令行脚本。
# php artisan make:command test1console command created successfully.
这时,在 app/console/commands 目录下就会出现一个 test1.php 文件。打开这个文件,我们需要做一些修改。
/** * the name and signature of the console command. * * @var string */protected $signature = 'command:name';/** * the console command description. * * @var string */protected $description = 'command description';
signature 用于设定当前这个脚本的名称,description 用于定义脚本的注释说明。它们用在什么地方呢?其实 signature 就是我们通过 php artisan 来运行这个脚本时所需要用到的那个名称。比如我们现在直接执行 php artisan 的话,就会看到下面这样一条可执行命令行脚本的出现。
command command:name command description
当然,使用这个默认的名称并不是好的主意,所以我们可以修改一下这两个属性。
/** * the name and signature of the console command. * * @var string */protected $signature = 'zyblog:test1';/** * the console command description. * * @var string */protected $description = '硬核测试1';
这个时候我们再运行 php artisan 的话,就可以看到我们定义的信息了。
zyblog zyblog:test1 硬核测试1
如果要运行这个脚本也非常简单。
# php artisan zyblog:test1
当然,我们还什么都没做呢,所以不会有什么输出。接下来我们把接收参数和输出信息一起做了。接收参数需要在 signature 中定义我们要接收的参数及选项。还记得我们之前讲过的在 php 中如何接收脚本参数及选项信息的文章吗?laravel 已经将这些封装好了,不需要再去使用那些函数来进行接收处理,直接使用就可以了。需要复习的同学可以移步 【如何获取php命令行参数】mp.weixin.qq.com/s/dfugam1jt… 进行复习或学习。
protected $signature = 'zyblog:test1 {a=1} {--b=*}';/** * execute the console command. * * @return int */public function handle(){ echo "欢迎进来测试!", php_eol; print_r($this->arguments()); // array // ( // [command] => zyblog:test1 // [a] => 1 // ) print_r($this->options()); // array // ( // [b] => array // ( // [0] => 2 // ) // [help] => // [quiet] => // [verbose] => // [version] => // [ansi] => // [no-ansi] => // [no-interaction] => // [env] => // ) echo $this->argument('a'); // 1 print_r($this->option('b')); // array // ( // [0] => 2 // ) return 0;}
在 handle() 函数中,我们可以编写当前这个脚本需要执行的功能代码。其中,通过 arguments() 和 argument() 可以接收到脚本的参数信息,通过 options() 和 option() 可以接收到脚本的选项信息。关于参数和选项的问题,之前的文章中我们也讲解过了,这里也就不多说了,一切都是以基础为准的。
参数选项源码分析对于参数和选项来说,laravel 的底层调用的其实是 symfony 的 console 组件,在 symfony/console/input/argvinput.php 中,我们可以看到下面这些代码。
public function __construct(array $argv = null, inputdefinition $definition = null){ $argv = $argv $_server['argv'] []; // strip the application name array_shift($argv); $this->tokens = $argv; parent::__construct($definition);}// ……………………// ……………………protected function parse(){ $parseoptions = true; $this->parsed = $this->tokens; while (null !== $token = array_shift($this->parsed)) { if ($parseoptions && '' == $token) { $this->parseargument($token); } elseif ($parseoptions && '--' == $token) { $parseoptions = false; } elseif ($parseoptions && 0 === strpos($token, '--')) { $this->parselongoption($token); } elseif ($parseoptions && '-' === $token[0] && '-' !== $token) { $this->parseshortoption($token); } else { $this->parseargument($token); } }}
很明显,在 symfony 中,也是使用的 argv 获取参数和选项,然后将它们放到 input 变量中向下传递。这个 input 变量很重要,后面我们在学习请求相关的内容时也会接触到。之后在我们的执行代码中,也就是 command 的 handle() 方法中使用 argument() 或者 option() 获取到的就是这个 input 中的数据。从断点调试中我们就可以看到它们的身影。
那么 laravel 是如何执行 handle() 函数的呢?首先通过 artisan 文件调用到 laravel/framework/src/illuminate/foundation/console/kernel.php 文件,在这个 kernel.php 中的 handle() 方法中会调用 symfony/console/application.php ,接着进入 laravel/framework/src/illuminate/console/command.php 中执行 execute() 方法,通过回调的方式调用我们自定义的那个 handle() 方法。
注意,在 laravel/framework/src/illuminate/console/command.php 的底层还是调用的 symfony 下面的 console/command.php 里面的方法。
整个调用链条非常长,不过也可以清晰地看出我们的 laravel 确实就是在 symfony 的基础上又套了层壳。而且不仅仅是命令行这里,在 web 请求这一块,依然底层还是 symfony 在发挥着至关重要的作用。
推荐学习:laravel视频教程
以上就是一起聊聊laravel运行命令行脚本的详细内容。