编写定制的Laravel工匠命令

我用许多不同的语言编写了控制台命令,包括节点.js,Golang,PHP,还有直接的bash。以我的经验来看,Symfony控制台组件是目前任何语言中最好的控制台库之一。 Laravel的artian命令行界面(CLI)扩展了Symfony的控制台组件,增加了一些便利性和快捷方式。如果您想学习如何为您的Laravel应用程序创建一些自定义命令,请继续学习。 。通过为框架生成模型、控制器、中间件、测试用例和许多其他类型的文件, 基本的Laravel framework命令扩展了Symfony命令类, 没有Laravel的控制台特性,创建Symfony控制台项目非常简单: 1#!/usr/bin/env php 21011// ... register commands12$application->add(new GenerateAdminCommand());1314$application->run(); 您将受益于阅读Symfony控制台组件文档,特别是创建命令。Symfony控制台组件处理定义CLI参数、选项、输出、问题、提示和有用信息的所有困难。 p>Laravel正在从控制台组件获取基本功能,并扩展了一个漂亮的抽象层,使构建控制台更加方便。 将Symfony控制台与创建可交付的phar存档的功能结合起来,就像composer一样,您可以使用一个强大的命令行工具。安装程序 现在,您已经有了控制台的快速介绍和背景知识Laravel让我们为Laravel创建一个自定义命令。我们将构建一个控制台命令,每分钟对您的Laravel应用程序运行一次健康检查,以验证正常运行时间。 我不是建议您放弃正常运行时间服务,但是我建议artisan可以非常容易地直接构建一个快速而肮脏的运行状况监视器,我们可以使用它作为定制命令的具体示例。 正常运行时间检查器只是您可以使用控制台进行操作的一个示例。您可以构建特定于开发人员的控制台,帮助开发人员在应用程序和生产就绪的命令中更高效地执行重复和自动化的任务。 好吧,让我们用composer CLI创建一个新的Laravel项目。您也可以使用Laravel安装程序,但我们将使用composer。 1composer create-project laravel/laravel:~5.4 cli-demo2cd cli-demo/3# only link if you are using Laravel valet4valet link5composer require fabpot/goutte 您想知道composer命令的优点是什么吗?您刚刚使用了一个依赖Symfony控制台的项目。我还需要Goutte HTTP客户端,我们将使用它来验证正常运行时间。注册命令 现在您有了一个新项目,我们将创建一个自定义命令并在控制台中注册它。您可以通过routes/console.php文件中的闭包,或通过在app/Console/Kernel.php文件的protected $commands属性中注册命令来完成此操作。将前者视为基于闭包的路由,后者视为控制器。 我们将创建一个自定义命令类,并将其注册到控制台的内核类中。Artisan有一个内置命令来创建名为make:command的控制台类: 1php artisan make:command HealthcheckCommand 此命令在app/Console/Commands/HealthcheckCommand.php文件中创建一个类。如果打开文件,您将看到$signature和$description属性,还有一个handle()方法,它是控制台命令的主体。 调整该文件,使其具有以下名称和描述: 115{url : The URL to check}1718/**19* The console command description.20*21* @var string22*/23protected>2425/**26* Create a new command instance.27*28* @return void29*/30public function __construct()31{32parent::__construct();33}3435/**36* Execute the console command.37*38* @return mixed39*/40public function handle()41{42//43}44} 在app/Console/Kernel.php文件中注册该命令: 1protected>2CommandsHealthcheckCommand::class,3]; 如果运行php artisan help healthcheck,您将看到如下内容: 设置HTTP客户端服务您的目标应该是使您的控制台命令\"轻松\",并遵从应用程序服务来完成您的任务。artisan CLI可以访问服务容器以注入服务,这将允许我们在命令的构造函数中从服务注入HTTP客户端。 在app/Providers/AppServiceProvider.php文件中,在register方法中添加以下内容以创建HTTP服务: 1// app/Providers/AppServiceProvider.php 2 3public function register() 4{ 5$this->app->singleton(GoutteClient::class, function ($app) {> 7$client->setClient(new GuzzleHttpClient([>>10]));1112return $client;13});14} 我们设置Goutte HTTP爬虫,并使用一些选项设置底层Guzzle客户端。我们设置了一个超时(你可以配置),我们不想让客户端遵循重定向。我们想知道HTTP端点的真实状态。 接下来,用刚刚定义的服务更新HealthcheckCommand::__construct()方法。当Laravel构造控制台命令时,依赖项将自动从服务容器中解析出来: 1use GoutteClient; 2 3// ... 4 5/** 6 * Create a new command instance. 7 * 8 * @return void 9 */10public function __construct(Client $client)11{12parent::__construct();1315} 健康检查命令主体 健康检查命令类中的最后一个方法是handle()方法,它是命令主体。我们将获得{url}参数和状态代码,以检查URL是否返回预期的HTTP状态c 让我们充实出一个简单的命令来验证健康检查: 1/** 2 * Execute the console command. 3 * 4 * @return mixed 5 */ 6public function handle() 7{ 8try {>13} catch (Exception $e) {14$this->error(\"Healthcheck failed for $url with an exception\");15$this->error($e->getMessage());16return 2;17}1819if ($status !== $expected) {20$this->error(\"Healthcheck failed for $url with a status of \"$status\" (expected \"$expected\")\");21return 1;22}2324$this->info(\"Healthcheck passed for $url!\");2526return 0;27}2829private function getUrl()30{3233if (! filter_var($url, FILTER_VALIDATE_URL)) {34throw new Exception(\"Invalid URL \"$url\"\");35}3637return $url;38} 首先,我们验证URL参数并在URL无效时引发异常。接下来,我们向URL发出一个HTTP请求,并比较预期的状态实际响应的代码。 您可以更喜欢HTTP客户端,并通过检查HTML元素对页面进行爬网以验证状态,但在本例中,我们只检查HTTP状态代码。您可以随意使用它,并扩展healthcheck。 如果发生异常,我们将为来自HTTP客户端的异常返回不同的状态代码。最后,如果HTTP状态无效,我们将返回一个***23***退出代码。 让我们测试一下我们的命令。如果您还记得,我将我的项目与***24***: ***25*** 健康检查按预期工作。请注意,第二个失败的命令返回退出代码***26***。在下一节中,我们将学习如何按计划运行命令,并通过关闭代客泊车来强制执行失败。按计划运行自定义命令 现在我们有了一个基本命令,我们将把它连接到计划程序上,以每分钟监视一个端点的状态。如果您是Laravel的新手,控制台内核允许您使用一个非常流畅的API按计划运行artian命令。调度程序每分钟运行一次,并检查是否需要运行任何命令。 让我们将此命令设置为每分钟运行一次: ***27*** 在***28***方法中,我们每分钟运行一次命令,并将输出发送到***29***文件,以便可以直观地看到命令的结果。请注意,调度器同时具有***30***方法和***31***方法。后者将在每次运行命令时覆盖输出,前者将继续附加新项。 在运行此命令之前,我们需要调整URL。默认情况下,***32***函数可能返回***33***,除非您已经更新了***34***文件。让我们现在这样做,这样我们就可以对我们的应用程序完全测试healthcheck: ***35***手动运行调度程序 我们将模拟在一个cron上运行调度程序,这个cron每分钟都在用bash运行。打开一个新标签,这样你就可以把它放在前台并运行下面的无限while循环: ***36*** 如果你正在观看***37***文件,你将开始每六十秒看到这样的输出: ***38*** 如果你和代驾一起跟踪,让我们关闭它,这样调度程序就会失败。关闭web服务器会模拟一个无法访问的应用程序: ***39*** 接下来,让我们把服务器带回来并删除路由,这样我们就可以模拟一个无效的状态代码。 ***40*** 接下来,在***41***中注释掉路由: ***42*** 如果您没有运行调度程序,请启动它,然后重试当计划程序尝试检查状态代码时,应该会看到一条错误消息: ***43*** 不要忘记用***44***关闭无限计划程序选项卡!进一步阅读 我们的命令只输出healthcheck的结果,但是您可以通过广播故障以将其扩展到Slack或将其记录到数据库中。在您自己的情况下,尝试在healthcheck失败时设置一些通知。或许您甚至可以提供这样的逻辑,即它只会在随后的三个故障发生时发出警报。发挥创造力! 我们介绍了运行自定义命令的基础知识,但文档中没有介绍其他信息。您可以轻松地向用户提示问题、呈现表格和进度条等操作。 我还建议您直接试用Symfony控制台组件。设置自己的CLI项目很容易,只需要最少的编写器依赖项。文档提供的知识也将应用于您的artisan命令,例如,当您需要自定义诸如从命令列表中隐藏命令之类的内容时。 结论 当您需要提供自定义控制台命令时,Laravel的artisan命令提供了一些很好的功能,使编写自己的CLI变得轻而易举。您可以访问服务容器,并可以创建现有服务的命令行版本。我构建了CLI工具,可以帮助我调试第三方API、提供有关数据库中记录的格式化详细信息以及在CDN上执行缓存破坏。

admin_action_{$_REQUEST[‘action’]}

do_action( "admin_action_{$_REQUEST[‘action’]}" )动作钩子::在发送“Action”请求变量时激发。Action Hook: Fires when an ‘action’ request variable is sent.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$_REQUEST['action']引用从GET或POST请求派生的操作。源码(Source)更新版本源码位置使用被使用2.6.0 wp-admin/admin.php:...

日期:2020-09-02 17:44:16 浏览:1170

admin_footer-{$GLOBALS[‘hook_suffix’]}

do_action( "admin_footer-{$GLOBALS[‘hook_suffix’]}", string $hook_suffix )操作挂钩:在默认页脚脚本之后打印脚本或数据。Action Hook: Print scripts or data after the default footer scripts.目录锚点:#说明#参数#源码说明(Description)钩子名的动态部分,$GLOBALS['hook_suffix']引用当前页的全局钩子后缀。参数(Parameters)参数类...

日期:2020-09-02 17:44:20 浏览:1071

customize_save_{$this->id_data[‘base’]}

do_action( "customize_save_{$this->id_data[‘base’]}", WP_Customize_Setting $this )动作钩子::在调用WP_Customize_Setting::save()方法时激发。Action Hook: Fires when the WP_Customize_Setting::save() method is called.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_data...

日期:2020-08-15 15:47:24 浏览:807

customize_value_{$this->id_data[‘base’]}

apply_filters( "customize_value_{$this->id_data[‘base’]}", mixed $default )过滤器::过滤未作为主题模式或选项处理的自定义设置值。Filter Hook: Filter a Customize setting value not handled as a theme_mod or option.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_date['base'],指的是设置...

日期:2020-08-15 15:47:24 浏览:900

get_comment_author_url

过滤钩子:过滤评论作者的URL。Filter Hook: Filters the comment author’s URL.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/comment-template.php:32610...

日期:2020-08-10 23:06:14 浏览:930

network_admin_edit_{$_GET[‘action’]}

do_action( "network_admin_edit_{$_GET[‘action’]}" )操作挂钩:启动请求的处理程序操作。Action Hook: Fires the requested handler action.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$u GET['action']引用请求的操作的名称。源码(Source)更新版本源码位置使用被使用3.1.0 wp-admin/network/edit.php:3600...

日期:2020-08-02 09:56:09 浏览:877

network_sites_updated_message_{$_GET[‘updated’]}

apply_filters( "network_sites_updated_message_{$_GET[‘updated’]}", string $msg )筛选器挂钩:在网络管理中筛选特定的非默认站点更新消息。Filter Hook: Filters a specific, non-default site-updated message in the Network admin.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分$_GET['updated']引用了非默认的...

日期:2020-08-02 09:56:03 浏览:864

pre_wp_is_site_initialized

过滤器::过滤在访问数据库之前是否初始化站点的检查。Filter Hook: Filters the check for whether a site is initialized before the database is accessed.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/ms-site.php:93910...

日期:2020-07-29 10:15:38 浏览:834

WordPress 的SEO 教学:如何在网站中加入关键字(Meta Keywords)与Meta 描述(Meta Description)?

你想在WordPress 中添加关键字和meta 描述吗?关键字和meta 描述使你能够提高网站的SEO。在本文中,我们将向你展示如何在WordPress 中正确添加关键字和meta 描述。为什么要在WordPress 中添加关键字和Meta 描述?关键字和说明让搜寻引擎更了解您的帖子和页面的内容。关键词是人们寻找您发布的内容时,可能会搜索的重要词语或片语。而Meta Description则是对你的页面和文章的简要描述。如果你想要了解更多关于中继标签的资讯,可以参考Google的说明。Meta 关键字和描...

日期:2020-10-03 21:18:25 浏览:1729

谷歌的SEO是什么

SEO (Search Engine Optimization)中文是搜寻引擎最佳化,意思近于「关键字自然排序」、「网站排名优化」。简言之,SEO是以搜索引擎(如Google、Bing)为曝光媒体的行销手法。例如搜寻「wordpress教学」,会看到本站的「WordPress教学:12个课程…」排行Google第一:关键字:wordpress教学、wordpress课程…若搜寻「网站架设」,则会看到另一个网页排名第1:关键字:网站架设、架站…以上两个网页,每月从搜寻引擎导入自然流量,达2万4千:每月「有机搜...

日期:2020-10-30 17:23:57 浏览:1308