Ligne de commande artisanale
Introduction à la ligne de commande Artisan
- paramètres
- options Commande E/S
- Récupérer l'entrée Exécuter des commandes par programme
- Appeler des commandes à partir d'autres commandes Artisan est la propre interface de ligne de commande de Laravel. Elle fournit de nombreuses commandes pour vous aider à créer des applications Laravel. Pour voir une liste de toutes les commandes Artisan disponibles, utilisez la commande
list
:
php artisan list
help
avant la commande pour afficher l'interface d'aide de la commande : php artisan help migrate
- . Tinker vous permet d'interagir avec l'ensemble de votre application Laravel à partir de la ligne de commande. Comprend Eloquent ORM, des tâches, des événements et bien plus encore. Exécutez la commande Artisan
php artisan tinker
Vous pouvez publier le fichier de configuration Tinker en utilisant la commandevendor:publish
:php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
tinker
pour accéder à l'environnement Tinker : Liste blanche des commandes
Tinker utilise une liste blanche pour déterminer quelles commandes Artisan sont autorisées à s'exécuter dans le shell. Par défaut, vous pouvez exécuter clear-compiled
, down
, env
, inspire
, migrate< / code>,
optimize
et up
. Si vous souhaitez ajouter plus de commandes à la liste blanche, vous pouvez les ajouter au tableau commands
dans le fichier de configuration tinker.php
: clear-compiled
、down
、env
、 inspire
、migrate
、 optimize
、和 up
命令。如果你想要添加更多的白名单命令,可以将它们添加到 tinker.php
配置文件中的 commands
数组里:
'commands' => [ // App\Console\Commands\ExampleCommand::class, ],
黑名单别名
通常,Tinker 会在 Tinker 中根据你的需要自动为类添加别名。然而,你可能不希望为某些类添加别名。你可以在 tinker.php
配置文件中的 dont_alias
数组里列举这些类来完成此操作:
'dont_alias' => [ App\User::class, ],
编写命令
除 Artisan 提供的命令外,你还可以构建自己的自定义命令。 命令通常存储在 app/Console/Commands
目录中;不过,只要你的命令可以由 Composer 加载,你就可以自由选择自己的存储位置。
生成命令
要创建一个新的命令,可以使用 Artisan 命令 make:command
。这个命令会在 app/Console/Commands
目录中创建一个新的命令类。 不必担心应用中不存在这个目录,因为它会在你第一次运行 Artisan 命令 make:command
时创建。生成的命令会包括所有命令中默认存在的属性和方法:
php artisan make:command SendEmails
命令结构
命令运行后,你应该先填写 signature
和 description
属性以便你在输入 php artisan list
时能够清楚知道用法。执行命令时会调用 handle
方法,你可以在这个方法中放置命令逻辑。
{tip} 为了代码更好的复用,最好保持你的控制台代码轻量并且能够延迟到应用服务中完成。在下面的例子中,我们将注入一个服务类来完成发送邮件的重任。
来看一个简单的例子。我们可以在 handle
<?php namespace App\Console\Commands; use App\User;use App\DripEmailer; use Illuminate\Console\Command; class SendEmails extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user}'; /** * The console command description. * * @var string */ protected $description = 'Send drip e-mails to a user'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @param \App\DripEmailer $drip * @return mixed */ public function handle(DripEmailer $drip) { $drip->send(User::find($this->argument('user'))); } }
Alias de liste noireHabituellement, Tinker ajoutera automatiquement des alias aux classes dans Tinker en fonction de vos besoins. Cependant, vous ne souhaiterez peut-être pas ajouter d'alias à certaines classes. Vous pouvez le faire en énumérant ces classes dans le tableau dont_alias
du fichier de configuration tinker.php
:
/** * Register the Closure based commands for the application. * * @return void */ protected function commands(){ require base_path('routes/console.php'); }🎜 < div name="43428a" data-unique="43428a">🎜
Commandes d'écriture
🎜En plus des commandes fournies par Artisan, vous pouvez également créer vos propres commandes personnalisées. Les commandes sont généralement stockées dans le répertoireapp/Console/Commands
; cependant, tant que vos commandes peuvent être chargées par Composer, vous êtes libre de choisir votre propre emplacement de stockage. 🎜🎜🎜🎜Génération de commandes
🎜Pour créer une nouvelle commande, vous pouvez utiliser Artisan Commandemake:command
. Cette commande créera une nouvelle classe de commandes dans le répertoire app/Console/Commands
. Ne vous inquiétez pas si ce répertoire n'existe pas dans votre application, car il sera créé la première fois que vous exécuterez la commande Artisan make:command
. La commande générée inclura les propriétés et méthodes qui existent par défaut dans toutes les commandes : 🎜Artisan::command('build {project}', function ($project) { $this->info("Building {$project}!"); });🎜🎜🎜
Structure de la commande
🎜Après avoir exécuté la commande, vous devez d'abord remplir les attributssignature
et description
afin de pouvoir savoir clairement lors de la saisie de php artisan utilisation de la liste
. La méthode handle
sera appelée lors de l'exécution de la commande. Vous pouvez placer la logique de la commande dans cette méthode. 🎜🎜{tip} Pour une meilleure réutilisation du code, il est préférable de garder le code de votre console léger et de confier son exécution au service d'application. Dans l'exemple suivant, nous allons injecter une classe de service pour effectuer la tâche d'envoi d'e-mails. 🎜🎜Regardons un exemple simple. Nous pouvons injecter toutes les dépendances dont nous avons besoin dans la méthode
handle
. Le conteneur de service Laravel injectera automatiquement toutes les dépendances avec des contraintes de type dans le constructeur :🎜use App\User; use App\DripEmailer;Artisan::command('email:send {user}', function (DripEmailer $drip, $user) { $drip->send(User::find($user)); });🎜🎜🎜🎜🎜🎜
Commandes de fermeture
Les commandes basées sur la fermeture offrent un moyen d'utiliser des classes au lieu de définir des commandes de console. De la même manière, le routage de fermeture est une alternative aux contrôleurs, et les commandes de fermeture peuvent être considérées comme une alternative aux classes de commandes. Dans la méthode commands
du fichier app/Console/Kernel.php
, Laravel charge le fichier routes/console.php
:app/Console/Kernel.php
文件的 commands
方法中,Laravel 加载了 routes/console.php
file:
Artisan::command('build {project}', function ($project) { $this->info("Building {$project}!"); })->describe('Build the project');
虽然这个文件没有定义 HTTP 路由,但是它将基于控制台的入口点(路由)定义到了应用中。在这个文件,你可以使用 Artisan::command
方法定义所有的闭包路由。 command
方法接受两个参数: 命令名称 和一个接受命令参数及选项的闭包:
/** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user}';
闭包绑定底层的命令实例,因为你可以访问所有能够在完整命令类中的所有辅助方法。
类型提示依赖
除了接收命令的参数和选项外,命令闭包也可以使用类型提示从 服务容器 中解析其他的依赖关系:
// 可选参数... email:send {user?} // 带有默认值的可选参数... email:send {user=foo}
闭包命令描述
当你定义一个闭包命令,你应当使用 describe
方法来为命令添加描述。这个描述会在你运行 php artisan list
或者 php artisan help
命令时显示:
/** * 命令行的名称及签名。 * * @var string */ protected $signature = 'email:send {user} {--queue}';
定义输出期望
在编写控制台命令时,通常是通过参数和选项来收集用户输入的。Laravel 可以通过 signature
属性非常方便的定义你期望用户输入的内容。signature
允许使用单一且可读性高,类似路由的语法定义命令的名称、参数和选项。
参数
所有用户提供的参数及选项都被包含在花括号中。在下面的例子中,这个命令定义了一个 必须的参数: user
:
php artisan email:send 1 --queue
你也可以创建可选参数,并定义参数的默认值:
/** * 命令行的名称及签名。 * * @var string */ protected $signature = 'email:send {user} {--queue=}';
选项
选项,类似于参数,是用户输入的另一种格式。当命令行指定选项时,它们以两个连字符 ( --
) 作为前缀。有两种类型的选项:接收值和不接收值。不接收值的选项就像是一个布尔值的「开关」。让我们看一下这种类型的选项的例子:
php artisan email:send 1 --queue=default
在这个例子中,可以在调用 Artisan 命令时指定 --queue
开关。如果 --queue
开关被传递,该选项的值为 true
, 否则为 false
email:send {user} {--queue=default}Bien que this Le fichier ne définit pas les routes HTTP, mais il définit les points d'entrée (routes) basés sur la console dans l'application. Dans ce fichier, vous pouvez définir tous les itinéraires de fermeture à l'aide de la méthode
Artisan::command
. La méthode command
accepte deux paramètres : Le nom de la commande et une fermeture qui accepte les paramètres et les options de la commande : email:send {user} {--Q|queue}
La fermeture lie la commande sous-jacente exemple car vous avez accès à toutes les méthodes d’assistance disponibles dans la classe de commande complète.
Dépendances typées
email:send {user*}
Description de la commande de fermeture
🎜Lorsque vous définissez une commande de fermeture, vous devez utiliser méthodescribe
pour ajouter une description à la commande. Cette description s'affichera lorsque vous exécuterez la commande php artisan list
ou php artisan help
: 🎜php artisan email:send foo bar🎜🎜🎜< div name="b603e9" data-unique="b603e9">🎜
Définir les attentes de sortie
🎜Lors de l'écriture de commandes de console, les entrées de l'utilisateur sont généralement collectées via des paramètres et des options. Laravel rend très pratique la définition de ce que vous attendez de l'utilisateur qu'il saisisse via l'attributsignature
. signature
vous permet de définir le nom, les paramètres et les options d'une commande en utilisant une syntaxe unique, lisible, de type route. 🎜🎜🎜🎜user
:🎜email:send {user} {--id=*} php artisan email:send --id=1 --id=2🎜Vous pouvez également créer des paramètres facultatifs et définir leurs valeurs par défaut :🎜
/** * 命令行的名称及签名。 * * @var string */ protected $signature = 'email:send {user : The ID of the user} {--queue= : Whether the job should be queued}';🎜🎜🎜
--
). Il existe deux types d'options : recevoir une valeur et ne pas recevoir de valeur. Une option qui n'accepte pas de valeur est comme un "switch" booléen. Regardons un exemple de ce type d'option : 🎜/** * 执行命令。 * * @return mixed */ public function handle(){ $userId = $this->argument('user'); // }🎜Dans cet exemple, le commutateur
--queue
peut être spécifié lors de l'appel de la commande Artisan. La valeur de cette option est true
si le commutateur --queue
est passé, false
sinon : 🎜$arguments = $this->arguments();🎜🎜🎜🎜🎜🎜
Options avec valeur
Ensuite, examinons une option avec valeur. Si vous souhaitez que l'utilisateur doive spécifier une valeur pour une option, vous devez ajouter un signe égal =
comme suffixe à la fin du nom de l'option : =
作为的后缀:
// 获取一个指定的选项值 $queueName = $this->option('queue'); // 获取所有的选项值 $options = $this->options();
在这个例子中, 用户可以传递该选项的值,如下所示:
/** * 执行命令。 * * @return mixed */ public function handle(){ $name = $this->ask('What is your name?'); }
你也可以通过在选项名称后面指定默认值来设定该选项的默认值。如果用户没有传递选项值,将使用设定的默认值:
$password = $this->secret('What is the password?');
选项简写
要在定义选项时指定简写,你可以在选项名称前指定它,并用 |
分隔符将简写与完整选项名称分隔开:
if ($this->confirm('Do you wish to continue?')) { // }
输入数组
如果你想定义接收数组输入的参数或选项,你可以使用 *
符号。首先,我们先看一个数组参数的实例:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
调用此方法时,该 user
参数的输入参数可按顺序传递给命令行。例如,以下命令会设置 user 的值为 ['foo', 'bar']
:
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
当定义接收数组的选项时,传递给命令行的每个选项值都应以选项名称为前缀:
/** * 执行命令。 * * @return mixed */ public function handle(){ $this->info('Display this on the screen'); }
输入说明
你可以通过使用冒号来为参数和选项添加说明,并使其将他们隔开。如果你需要一点额外的空间来定义你的命令,可以随意分开在多个行里:
$this->error('Something went wrong!');
Command I/O
获取输入
在命令执行时,显然你需要获取命令接收到的参数和选项的值。你可以用 argument
和 option
方法来达到目的:
$this->line('Display this on the screen');
如果你想所有的参数以 array
数组获取,可以调用 arguments
方法:
$headers = ['Name', 'Email']; $users = App\User::all(['name', 'email'])->toArray(); $this->table($headers, $users);
和获取参数类似,option
方法可以非常容易的获取选项的值。要将所有的选项以数组获取,使用 options
方法:
$users = App\User::all(); $bar = $this->output->createProgressBar(count($users)); $bar->start();foreach ($users as $user) { $this->performTask($user); $bar->advance(); }$bar->finish();
如果参数或选项不存在,则返回 null
/** * 注册应用的命令 * * @return void */ protected function commands(){ $this->load(__DIR__.'/Commands'); $this->load(__DIR__.'/MoreCommands'); // ... }Dans cet exemple, l'utilisateur peut transmettre la valeur de l'option comme suit Montré :
protected $commands = [ Commands\SendEmails::class ];Vous pouvez également définir la valeur par défaut d'une option en spécifiant la valeur par défaut après le nom de l'option. Si l'utilisateur ne transmet pas de valeur d'option, la valeur par défaut définie sera utilisée :
Route::get('/foo', function () { $exitCode = Artisan::call('email:send', [ 'user' => 1, '--queue' => 'default' ]); // });
|
: 🎜Artisan::call('email:send 1 --queue=default');🎜🎜🎜
Tableau d'entrée
🎜Si vous souhaitez définir des paramètres ou des options qui reçoivent une entrée de tableau, vous pouvez utiliser < code>*< /code> symbole. Tout d'abord, regardons un exemple de paramètre de tableau : 🎜Route::get('/foo', function () { Artisan::queue('email:send', [ 'user' => 1, '--queue' => 'default' ]); // });🎜Lors de l'appel de cette méthode, les paramètres d'entrée du paramètre
user
peuvent être transmis à la ligne de commande dans l'ordre. Par exemple, la commande suivante définira la valeur de user sur ['foo', 'bar']
: 🎜Artisan::queue('email:send', [ 'user' => 1, '--queue' => 'default' ])->onConnection('redis')->onQueue('commands');🎜Lors de la définition d'options qui reçoivent un tableau, chaque valeur d'option transmise à la ligne de commande doit commencer par Les noms d'options sont préfixés par : 🎜
Route::get('/foo', function () { $exitCode = Artisan::call('email:send', [ 'user' => 1, '--id' => [5, 13] ]); });🎜🎜🎜
Descriptions des entrées
🎜Vous peut le faire en utilisant Utiliser des deux-points pour décrire et séparer les paramètres et les options. Si vous avez besoin d'un peu d'espace supplémentaire pour définir votre commande, n'hésitez pas à la répartir sur plusieurs lignes : 🎜$exitCode = Artisan::call('migrate:refresh', [ '--force' => true, ]);🎜🎜🎜
E/S de commande
🎜🎜🎜Obtenir une entrée h3>🎜Lorsque la commande est exécutée, vous devez évidemment obtenir les valeurs des paramètres et options reçues par la commande. Vous pouvez utiliser les méthodes argument
et option
pour y parvenir : 🎜/**
* 执行控制台命令
*
* @return mixed
*/
public function handle(){
$this->call('email:send', [
'user' => 1,
'--queue' => 'default'
]);
//
}
🎜Si vous souhaitez que tous les paramètres soient obtenus sous la forme d'un tableau array
, vous peut appeler la méthode arguments
: 🎜$this->callSilent('email:send', [
'user' => 1,
'--queue' => 'default'
]);
🎜Semblable à l'obtention de paramètres, la méthode option
peut facilement obtenir la valeur d'une option. Pour obtenir toutes les options sous forme de tableau, utilisez la méthode options
: 🎜rrreee🎜Si le paramètre ou l'option n'existe pas, renvoyez null
. 🎜🎜🎜🎜🎜🎜🎜Entrée interactive
En plus d'afficher la sortie, vous pouvez également demander à l'utilisateur de fournir une entrée pendant l'exécution de la commande. La méthode ask
demandera à l'utilisateur une saisie et la recevra, puis la saisie de l'utilisateur sera transmise à votre commande : ask
方法将提示用户输入并接收,然后用户的输入将会传入你的命令:
secret
方法和 ask
方法类似,但当用户在控制台输入时他们的输入内容是不可见的。这个方法适用于需要用户输入像密码这样的敏感信息的时候:
请求确认
如果你想要寻求用户确认一些简单的信息,你可以使用 confirm
方法。默认情况下,该方法将返回 false
。但如果用户在回复中输入 y
或者 yes
则会返回 true
。
自动补全
anticipate
方法可用于为可能的选择提供自动补全功能。用户仍然可以忽略自动补全的提示,作任意回答:
多重选择
如果你要给用户提供一些预设的选择,可以使用 choice
方法。你也可以设置默认值的索引,用以应对用户没有选择的情景:
编写输出
可以使用 line
、 info
、 comment
、 question
和 error
方法来将输出发送到终端。每个方法都使用适当的 ANSI
颜色表明其目的。例如,让我们向用户显示一些普通信息,通常来说,最好使用 info
方法,它会在控制台将输出的内容显示为绿色:
显示错误信息, 使用 error
方法。 错误信息则会显示为红色:
如果你想在控制台显示无颜色设置的输出,请使用 line
方法:
表格布局
对于多行列数据的格式化输出,table
rrreee
secret
méthode et ask< Méthode /code> Similaire, mais lorsque l'utilisateur tape dans la console, sa saisie est invisible. Cette méthode convient lorsque l'utilisateur a besoin de saisir des informations sensibles comme un mot de passe : rrreeeDemande de confirmation
Si vous souhaitez demander à l'utilisateur de confirmer une simple informations , vous pouvez utiliser la méthode confirm
. Par défaut, cette méthode renverra false
. Mais si l'utilisateur entre y
ou oui
dans la réponse, true
sera renvoyé.
rrreeeLa méthode anticipate
peut être utilisée pour fournir une auto-complétion pour les choix possibles. Les utilisateurs peuvent toujours ignorer l'invite de saisie semi-automatique et donner n'importe quelle réponse : rrreee
Choix multiplesSi vous souhaitez proposer aux utilisateurs des choix prédéfinis, vous pouvez Utilisez la méthode choix
. Vous pouvez également définir l'index de la valeur par défaut pour faire face à la situation où l'utilisateur n'a pas le choix : rrreee🎜🎜🎜🎜🎜 Pour écrire le résultat🎜🎜, vous pouvez utiliser line
, info
, commentaire
, question
et error
Méthode pour envoyer la sortie au terminal. Chaque méthode utilise la couleur ANSI
appropriée pour indiquer son objectif. Par exemple, affichons quelques informations générales à l'utilisateur. De manière générale, il est préférable d'utiliser la méthode info
, qui affichera le contenu de sortie en vert sur la console : 🎜rrreee🎜Pour afficher l'erreur. informations, utilisez la méthode < code>erreur. Le message d'erreur s'affichera en rouge : 🎜rrreee🎜 Si vous souhaitez afficher la sortie sans paramètres de couleur dans la console, veuillez utiliser la méthode line
: 🎜rrreee🎜🎜Mise en page de table🎜🎜Pour la sortie formatée de données multi-colonnes, la méthode table
est plus facile à gérer. Sur la base des données d'en-tête et de ligne du tableau entrantes, il calculera dynamiquement la largeur et la hauteur : 🎜rrreee🎜🎜🎜Barre de progression🎜🎜Pour les tâches fastidieuses, il est très nécessaire d'accélérer la progression. Utilisez l'objet de sortie pour créer, charger et arrêter les barres de progression. Tout d'abord, définissez le nombre total d'étapes pour la tâche, puis chargez la barre de progression à chaque fois que la tâche est exécutée : 🎜rrreee🎜Voir 🎜Documentation du composant Symfony Progress Bar🎜 pour une utilisation plus avancée. 🎜🎜🎜🎜🎜🎜🎜Enregistrer les commandes
Les commandes dans le répertoire app/Console/Commands
seront enregistrées car la méthode commands
du noyau de la console appelle load. En fait, vous pouvez appeler load
à volonté pour scanner les commandes Artisan dans d'autres répertoires : app/Console/Commands
目录下的命令都会被注册,这是由于控制台内核的 commands
方法调用了 load
。实际上,可随意调用 load
来扫描其他目录下的 Artisan 命令:
rrreee也可以在 app/Console/Kernel.php
文件的 $commands
属性中手动注册命令的类名。Artisan 启动时,这个属性列出的命令都将由 服务容器 解析并通过 Artisan 进行注册:
rrreee程序调用命令
有时需要在 CLI 之外执行 Artisan 命令,例如,在路由或控制器里触发 Artisan 命令。要实现调用,可以使用 Artisan
门面的 call
方法。call
方法的第一个参数接受命令名,第二个参数接受数组形式的命令参数。退出码将返回:
rrreee另外,你可以将整个 Artisan 命令作为字符串传递给 call
方法:
rrreeeArtisan
门面的 queue
方法可以将 Artisan 命令队列化,交由 队列工作进程 进行后台处理。使用此方法之前,务必配置好队列以及运行队列监听器:
rrreee你也可以指定 Artisan 命令派发的连接或任务:
rrreee传递数组值
如果定义了接受数组的选项,可以直接传递数组到该选项:
rrreee传递布尔值
需要指定没有选项值的选项时,例如,migrate:refresh
命令的 --force
选项,就可以传入 true
或 false
:
rrreee命令的互相调用
call
方法可以实现调用其它 Artisan 命令。call
方法接受命令名和数组形式的选项:
rrreee如果要抑制控制台命令的所有输出,可以使用 callSilent
方法。callSilent
的使用方法同 call
rrreee
Vous pouvez également utiliser $commands dans le app/Console/Kernel.php code> fichier
Le nom de classe de la commande enregistrée manuellement dans l'attribut. Au démarrage d'Artisan, les commandes répertoriées dans cette propriété seront analysées par le conteneur de services et enregistrées auprès d'Artisan : 🎜Commande d'appel de programme🎜🎜Parfois, il est nécessaire d'exécuter des commandes Artisan en dehors de la CLI, par exemple pour déclencher des commandes Artisan dans un routeur ou un contrôleur. Pour implémenter l'appel, vous pouvez utiliser la méthode call
de la façade Artisan
. Le premier paramètre de la méthode call
accepte le nom de la commande, et le deuxième paramètre accepte les paramètres de la commande sous la forme d'un tableau. Le code de sortie sera renvoyé : 🎜rrreee🎜 Alternativement, vous pouvez transmettre l'intégralité de la commande Artisan sous forme de chaîne à la méthode call
: 🎜rrreee🎜Artisan
file d'attente de la façade La méthode The code> peut mettre en file d'attente les commandes Artisan et les transmettre au processus de travail de file d'attente pour un traitement en arrière-plan. Avant d'utiliser cette méthode, assurez-vous de configurer la file d'attente et d'exécuter l'écouteur de file d'attente : 🎜rrreee🎜 Vous pouvez également spécifier la connexion ou la tâche envoyée par la commande Artisan : 🎜rrreee🎜Passer une valeur de tableau
🎜Si une option qui accepte un tableau est définie, vous pouvez passer le tableau directement à l'option : 🎜rrreee🎜Passer une valeur booléenne< /h4>🎜Lorsque vous devez spécifier une option sans valeur d'option, par exemple, l'option --force
de migrate:refresh< /code>, vous pouvez passer en true
ou false
: 🎜rrreee🎜🎜🎜🎜Appel mutuel de commandes
🎜La méthode call
peut être utilisée pour appeler d'autres commandes Artisan. La méthode call
accepte un nom de commande et un tableau d'options : 🎜rrreee🎜 Si vous souhaitez supprimer toutes les sorties d'une commande de console, vous pouvez utiliser la méthode callSilent
. L'utilisation de callSilent
est la même que celle de call
: 🎜rrreee🎜Cet article a été publié pour la première fois sur le site Web 🎜LearnKu.com🎜. 🎜🎜