Artisan là một giao diện dòng lệnh đi kèm với Laravel. Artisan tồn tại ở gốc của ứng dụng của bạn dưới dạng một tập lệnh artisan
và cung cấp một số lệnh hữu ích có thể hỗ trợ bạn trong khi bạn xây dựng application. Để xem danh sách tất cả các lệnh Artisan có sẵn, bạn có thể sử dụng lệnh list
:
php artisan list
Mỗi lệnh cũng chứa một lệnh "help" để hiển thị và mô tả các tùy chọn và các tham số dành cho lệnh đó. Để xem lệnh help, hãy set help
vào trước tên của command:
php artisan help migrate
Nếu bạn đang sử dụng Laravel Sail làm môi trường phát triển local của bạn, hãy nhớ sử dụng dòng lệnh sail
để gọi các lệnh Artisan. Sail sẽ thực hiện các lệnh Artisan của bạn trong các Docker container của ứng dụng của bạn:
./sail artisan list
Laravel Tinker là một REPL mạnh mẽ cho Laravel framework, cung cấp bởi package PsySH.
Mặc định tất cả các ứng dụng Laravel đều chứa Tinker. Tuy nhiên, bạn có thể cài đặt Tinker thông qua Composer nếu trước đó bạn đã xóa nó ra khỏi ứng dụng của bạn:
composer require laravel/tinker
{tip} Nếu bạn đang tìm một tool giao diện người dùng để tương tác với ứng dụng Laravel của bạn? Hãy xem Tinkerwell!
Tinker cho phép bạn tương tác trực tiếp với toàn bộ application Laravel của bạn trên command line, bao gồm cả model Eloquent, job, event, vv... Để vào được môi trường Tinker, hãy chạy lệnh Artisan tinker
:
php artisan tinker
Bạn có thể export file cấu hình của Tinker bằng lệnh vendor:publish
:
php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
{note} Hàm helper
dispatch
và phương thứcdispatch
trên classDispatchable
phụ thuộc vào việc thu gom rác để set job vào queue. Do đó, khi sử dụng tinker, bạn nên sử dụngBus::dispatch
hoặcQueue::push
để điều phối job.
Tinker có sử dụng một danh sách "allow" để xác định các lệnh Artisan nào được phép chạy. Mặc định, bạn có thể chạy các lệnh clear-compiled
, down
, env
, inspire
, migrate
, optimize
, và up
. Nếu bạn muốn cho phép thêm các lệnh khác, bạn có thể thêm chúng vào mảng commands
trong file cấu hình tinker.php
của bạn:
'commands' => [
// App\Console\Commands\ExampleCommand::class,
],
Thông thường, Tinker sẽ tự động đặt bí danh cho các class khi bạn tương tác với chúng trong Tinker. Tuy nhiên, bạn có thể muốn không đặt bí danh cho một số class. Bạn có thể thực hiện điều này bằng cách thêm các class đó vào trong mảng dont_alias
của file cấu hình tinker.php
của bạn:
'dont_alias' => [
App\Models\User::class,
],
Ngoài các lệnh được cung cấp với Artisan, bạn có thể tự xây dựng các lệnh của riêng bạn. Các lệnh thường được lưu trữ trong thư mục app/Console/Commands
; tuy nhiên, bạn cũng có thể thoải mái chọn vị trí lưu trữ mà bạn muốn, miễn là các lệnh của bạn có thể load được bởi Composer.
Để tạo một lệnh mới, bạn có thể sử dụng lệnh Artisan make:command
. Lệnh này sẽ tạo một class command mới trong thư mục app/Console/Commands
. Đừng lo lắng nếu thư mục này không tồn tại trong application của bạn, vì nó sẽ được tạo vào lần đầu tiên bạn chạy lệnh Artisan make:command
:
php artisan make:command SendEmails
Sau khi đã tạo xong command, bạn hãy định nghĩa các giá trị phù hợp cho các thuộc tính signature
và description
. Các thuộc tính này sẽ được hiển thị thông tin command của bạn trên màn hình list
. Thuộc tính signature
cũng cho phép bạn định nghĩa kỳ vọng input đầu vào cho command của bạn. Phương thức handle
sẽ được gọi khi lệnh của bạn được thực thi. Bạn có thể cài đặt logic của bạn vào trong phương thức này.
Chúng ta hãy xem một ví dụ về command. Lưu ý rằng chúng ta có thể yêu cầu bất kỳ service nào mà chúng ta muốn thông qua hàm handle
của command. Laravel service container sẽ tự động inject tất cả các phụ thuộc đã được khai báo có trong phương thức đó:
<?php
namespace App\Console\Commands;
use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Console\Command;
class SendEmails extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Send a marketing email to a user';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @param \App\Support\DripEmailer $drip
* @return mixed
*/
public function handle(DripEmailer $drip)
{
$drip->send(User::find($this->argument('user')));
}
}
{tip} Để code của bạn có thể tái sử dụng tốt hơn, thì cách tốt nhất là giữ cho các command của bạn được "nhẹ" và hãy để các application service hoàn thành nhiệm vụ đó cho bạn. Trong ví dụ dưới trên, hãy chú ý rằng chúng ta sẽ inject một service class để thực hiện một "công việc nặng" như việc gửi e-mail.
Các command được tạo dựa trên closure sẽ cung cấp thêm một giải pháp để định nghĩa các command. Giống như cách mà các closure route làm, là tạo thêm một cách định nghĩa cho controller, bạn hãy nghĩ các closure command này như là một cách định nghĩa khác cho các class command, thay vì phải tạo ra một file command mới. Trong phương thức commands
ở trong file app/Console/Kernel.php
của bạn, Laravel sẽ load sẵn file routes/console.php
:
/**
* Register the closure based commands for the application.
*
* @return void
*/
protected function commands()
{
require base_path('routes/console.php');
}
Mặc dù file này không định nghĩa các HTTP route, nhưng nó định nghĩa các closure dựa theo format của route vào trong application của bạn. Trong file này, bạn có thể định nghĩa tất cả các closure dựa trên lệnh console của bạn bằng phương thức Artisan::command
. Phương thức command
chấp nhận hai tham số: một là một command signature và hai là một closure để nhận vào các tham số và các option của command:
Artisan::command('mail:send {user}', function ($user) {
$this->info("Sending email to: {$user}!");
});
Closure sẽ được liên kết với một instance command cơ bản, nên bạn có toàn quyền truy cập vào tất cả các phương thức helper mà bạn thường dùng trên một class command cơ bản.
Ngoài việc nhận vào các tham số và các option của command, closure command cũng có thể khai báo thêm các phụ thuộc mà bạn muốn resolve từ service container:
use App\Models\User;
use App\Support\DripEmailer;
Artisan::command('mail:send {user}', function (DripEmailer $drip, $user) {
$drip->send(User::find($user));
});
Khi định nghĩa một command dựa trên closure, bạn có thể sử dụng phương thức purpose
để thêm mô tả cho command. Mô tả này sẽ được hiển thị khi bạn chạy lệnh php artisan list
hoặc lệnh php artisan help
:
Artisan::command('mail:send {user}', function ($user) {
// ...
})->purpose('Send a marketing email to a user');
Khi viết một lệnh console, thường thu nhận các dữ liệu đầu vào từ người dùng thông qua các tham số hoặc các option. Laravel làm cho nó rất thuận tiện để xác định đầu vào mà bạn mong muốn từ người dùng bằng cách sử dụng thuộc tính signature
trên mỗi lệnh của bạn. Thuộc tính signature
cho phép bạn định nghĩa tên, tham số và các option cho lệnh theo một cú pháp đơn giản, dễ hiểu, giống như cú pháp trên route.
Tất cả các tham số và các tùy chọn do người dùng cung cấp được wrap trong một dấu ngoặc nhọn. Trong ví dụ sau, lệnh sẽ định nghĩa một tham số bắt buộc: user
:
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user}';
Bạn cũng có thể tạo ra tham số tùy chọn hoặc định nghĩa giá trị mặc định cho các tham số đó:
// Optional argument...
mail:send {user?}
// Optional argument with default value...
mail:send {user=foo}
Tùy chọn, giống như một tham số, là một dạng khác của input user. Các tùy chọn sẽ được gán tiền tố với hai dấu gạch nối (--
) khi chúng được cung cấp thông qua cửa sổ dòng lệnh. Có hai loại tùy chọn: loại tùy chọn nhận một giá trị và loại tuỳ chọn không nhận giá trị nào. Các tùy chọn không nhận giá trị đóng vai trò như là một "switch" boolean. Chúng ta hãy xem một ví dụ về loại tùy chọn này:
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user} {--queue}';
Trong ví dụ này, switch --queue
có thể được chỉ định khi gọi lệnh Artisan. Nếu switch --queue
được thông qua, giá trị của tùy chọn sẽ là true
. Nếu không, giá trị sẽ là false
:
php artisan mail:send 1 --queue
Tiếp theo, chúng ta hãy xem một tùy chọn nhận một giá trị. Nếu người dùng phải chỉ định một giá trị cho một tùy chọn, thì bạn hãy thêm hậu tố vào tên của tùy chọn đó bằng dấu =
:
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user} {--queue=}';
Trong ví dụ này, người dùng có thể truyền một giá trị cho tùy chọn đó như sau. Nếu tùy chọn không được truyền vào khi chạy command, thì giá trị của nó sẽ là null
:
php artisan mail:send 1 --queue=default
Bạn cũng có thể gán một giá trị mặc định cho các tùy chọn này bằng cách chỉ định giá trị mặc định sau tên mỗi tùy chọn. Nếu không có giá trị tùy chọn nào được người dùng truyền vào, thì giá trị mặc định sẽ được sử dụng:
mail:send {user} {--queue=default}
Để gán một shortcut khi định nghĩa một tùy chọn, bạn có thể chỉ định nó vào phía trước tên của một tùy chọn và sử dụng ký tự |
như một dấu để phân tách shortcut khỏi toàn bộ tên tùy chọn:
mail:send {user} {--Q|queue}
Khi gọi command trên terminal của bạn, các shortcut tùy chọn phải được set bằng một dấu gạch ngang ở đằng trước:
php artisan mail:send 1 -Q
Nếu bạn muốn định nghĩa các tham số hoặc tùy chọn để nhận vào nhiều giá trị, bạn có thể sử dụng ký tự *
. Đầu tiên, chúng ta hãy xem một ví dụ định nghĩa một tham số như sau:
mail:send {user*}
Khi gọi phương thức này, các tham số user
có thể được truyền theo dòng lệnh. Ví dụ: lệnh sau sẽ set giá trị của user
thành một mảng với foo
và bar
là các giá trị của nó:
php artisan mail:send foo bar
Ký tự *
này có thể được kết hợp với một định nghĩa tùy chọn tham số để cho phép nhập từ không đến nhiều instance tham số:
mail:send {user?*}
Khi định nghĩa một tùy chọn yêu cầu nhiều giá trị input, mỗi giá trị tùy chọn đó được truyền đến command phải được đặt tên tùy chọn đó ở đằng trước:
mail:send {user} {--id=*}
php artisan mail:send --id=1 --id=2
Bạn có thể gán một mô tả cho các input đầu vào như tham số hoặc tùy chọn bằng cách tách tên tham số đó ra khỏi mô tả bằng dấu hai chấm. Nếu bạn cần thêm một chút chỗ trống để định nghĩa thêm cho lệnh của mình, hãy định nghĩa nó trên nhiều dòng:
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send
{user : The ID of the user}
{--queue : Whether the job should be queued}';
Trong khi lệnh của bạn đang thực thi, bạn có thể sẽ cần truy cập vào các giá trị của các tham số và các tùy chọn đã được khai báo trong lệnh của bạn. Để làm như vậy, bạn có thể sử dụng các phương thức argument
và option
. Nếu một tham số hoặc tùy chọn không tồn tại, thì giá trị null
sẽ được trả về:
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$userId = $this->argument('user');
//
}
Nếu bạn cần lấy ra tất cả các tham số dưới dạng một array
, hãy gọi phương thức arguments
:
$arguments = $this->arguments();
Các tùy chọn có thể được lấy ra dễ dàng như các tham số bằng cách sử dụng phương thức option
. Để lấy tất cả các tùy chọn dưới dạng một mảng, hãy gọi phương thức options
:
// Retrieve a specific option...
$queueName = $this->option('queue');
// // Retrieve all options as an array...
$options = $this->options();
Ngoài việc hiển thị output, bạn cũng có thể yêu cầu người dùng cung cấp thêm thông tin trong quá trình đang thực thi lệnh. Phương thức ask
sẽ hỏi người dùng với một câu hỏi có sẵn, chấp nhận thông tin nhập thêm của người dùng và sau đó truyền lại thông tin mới nhập thêm đó cho lệnh của bạn:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$name = $this->ask('What is your name?');
}
Phương thức secret
tương tự như phương thức ask
, nhưng đầu vào của người dùng sẽ không được hiển thị cho họ khi họ gõ vào console. Phương thức này hữu ích khi yêu cầu thông tin nhạy cảm như mật khẩu:
$password = $this->secret('What is the password?');
Nếu bạn cần yêu cầu người dùng xác nhận "yes hoặc no", bạn có thể sử dụng phương thức confirm
. Mặc định, phương thức này sẽ trả về false
. Tuy nhiên, nếu người dùng nhập y
hoặc yes
để trả lời confirm, thì phương thức sẽ trả về true
.
if ($this->confirm('Do you wish to continue?')) {
//
}
Nếu cần thiết, bạn có thể chỉ định rằng mặc định confirm sẽ trả về giá trị true
bằng cách truyền giá trị true
làm tham số thứ hai cho phương thức confirm
:
if ($this->confirm('Do you wish to continue?', true)) {
//
}
Phương thức anticipate
có thể được sử dụng để cung cấp một auto-completion cho các lựa chọn. Người dùng vẫn có thể cung cấp bất kỳ câu trả lời nào, cho dù có gợi ý auto-completion:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
Ngoài ra, bạn có thể truyền một closure làm tham số thứ hai cho phương thức anticipate
. closure sẽ được gọi mỗi khi người dùng nhập một ký tự vào. closure phải chấp nhận một tham số string có chứa các ký tự nhập vào của người dùng và trả về một loạt các tùy chọn để tự động hoàn thành:
$name = $this->anticipate('What is your address?', function ($input) {
// Return auto-completion options...
});
Nếu bạn cần cung cấp cho người dùng một danh sách các lựa chọn khi hỏi một câu hỏi, thì bạn có thể sử dụng phương thức choice
. Bạn có thể set giá trị mặc định cho phương thức này thông qua index của mảng, và nó sẽ được trả về nếu người dùng không chọn bất kỳ tuỳ chọn nào của bạn index này có thể được chỉ định qua tham số thứ ba:
$name = $this->choice(
'What is your name?',
['Taylor', 'Dayle'],
$defaultIndex
);
Ngoài ra, phương thức choice
chấp nhận tham số thứ tư và tùy chọn thứ năm để xác định số lần thử tối đa và có cho phép chọn nhiều hay không:
$name = $this->choice(
'What is your name?',
['Taylor', 'Dayle'],
$defaultIndex,
$maxAttempts = null,
$allowMultipleSelections = false
);
Để gửi một output đến console, hãy sử dụng các phương thức line
, info
, comment
, question
và error
. Mỗi phương thức này sẽ sử dụng một màu ANSI thích hợp cho mục đích của chúng. Ví dụ: Để hiển thị một thông tin chung cho người dùng. Thì thông thường, phương thức info
sẽ hiển thị trong console dưới dạng màu xanh lá cây:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// ...
$this->info('The command was successful!');
}
Để hiển thị một thông báo lỗi, sử dụng phương thức error
. Thông báo lỗi đó sẽ được hiển thị màu đỏ:
$this->error('Something went wrong!');
Bạn có thể sử dụng phương thức line
để hiển thị đoạn text, không có màu:
$this->line('Display this on the screen');
Bạn có thể sử dụng phương thức newLine
để hiển thị một dòng trống:
// Write a single blank line...
$this->newLine();
// Write three blank lines...
$this->newLine(3);
Phương thức table
giúp bạn dễ dàng định dạng chính xác nhiều hàng / cột dữ liệu. Tất cả những gì bạn cần làm là cung cấp tên cột và dữ liệu cho bảng và Laravel sẽ
tự động tính toán chiều rộng và chiều cao thích hợp cho bảng của bạn:
use App\Models\User;
$this->table(
['Name', 'Email'],
User::all(['name', 'email'])->toArray()
);
Đối với các tác vụ chạy dài, có thể bạn sẽ cần hiển thị một thanh tiến trình thông báo cho người dùng biết mức độ hoàn thành của tác vụ. Sử dụng phương thức withProgressBar
, Laravel sẽ hiển thị một thanh tiến trình và tăng tiến trình đó thông qua mỗi lần lặp của một giá trị lặp nhất định:
use App\Models\User;
$users = $this->withProgressBar(User::all(), function ($user) {
$this->performTask($user);
});
Thỉnh thoảng, bạn có thể cần kiểm soát nhiều hơn đối với cách tăng của thanh tiến trình. Đầu tiên, định nghĩa tổng số các bước mà tiến trình sẽ lặp. Sau đó, tăng thanh tiến trình sau khi xử lý xong từng bước:
$users = App\Models\User::all();
$bar = $this->output->createProgressBar(count($users));
$bar->start();
foreach ($users as $user) {
$this->performTask($user);
$bar->advance();
}
$bar->finish();
{tip} Để biết các tùy chọn nâng cao, hãy xem tài liệu component Symfony Progress Bar.
Tất cả các lệnh console của bạn được đăng ký trong class App\Console\Kernel
của ứng dụng, là "console kernel" của ứng dụng của bạn. Trong phương thức commands
của class này, bạn sẽ thấy một lệnh gọi đến phương thứcload
của kernel. Phương thức load
này sẽ quét thư mục app/Console/Commands
và đăng ký tất cả các command mà nó chứa với Artisan. Bạn thậm chí có thể thực hiện thêm các cuộc gọi bổ sung để quét thêm các thư mục khác cho các lệnh Artisan:
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
$this->load(__DIR__.'/../Domain/Orders/Commands');
// ...
}
Nếu cần thiết, bạn có thể đăng ký các lệnh theo cách thủ công bằng cách thêm tên class của command vào thuộc tính $commands
trong class App\Console\Kernel
của bạn. Nếu thuộc tính này chưa được định nghĩa trên kernel của bạn, thì bạn nên tự định nghĩa nó. Khi Artisan khởi động, tất cả các lệnh được liệt kê trong thuộc tính này sẽ được resolve bằng service container và được đăng ký với Artisan:
protected $commands = [
Commands\SendEmails::class
];
Thỉnh thoảng bạn có thể muốn chạy một command Artisan bên ngoài CLI. Ví dụ: bạn có thể chạy một command Artisan từ route hoặc controller. Bạn có thể sử dụng phương thức call
trên facade Artisan
để thực hiện điều này. Phương thức call
chấp nhận tên một command hoặc tên một class làm tham số đầu tiên và một mảng các tham số của command đó làm tham số thứ hai. Exit code sẽ được trả về:
use Illuminate\Support\Facades\Artisan;
Route::post('/user/{user}/mail', function ($user) {
$exitCode = Artisan::call('mail:send', [
'user' => $user, '--queue' => 'default'
]);
//
});
Ngoài ra, bạn có thể truyền toàn bộ lệnh Artisan sang phương thức call
dưới dạng một chuỗi:
Artisan::call('mail:send 1 --queue=default');
Nếu command của bạn định nghĩa một tùy chọn là một mảng, bạn có thể truyền một mảng các giá trị cho tùy chọn đó:
use Illuminate\Support\Facades\Artisan;
Route::post('/mail', function () {
$exitCode = Artisan::call('mail:send', [
'--id' => [5, 13]
]);
});
Nếu bạn cần định nghĩa một giá trị cho một tùy chọn không nhận giá trị, chẳng hạn như một flag --force
trong lệnh migrate:refresh
, bạn có thể truyền true
hoặc false
:
$exitCode = Artisan::call('migrate:refresh', [
'--force' => true,
]);
Sử dụng phương thức queue
trên facade Artisan
, bạn thậm chí có thể queue các lệnh Artisan để chúng được xử lý trong background bởi queue worker của bạn. Trước khi sử dụng phương thức này, hãy đảm bảo là bạn đã cấu hình queue của bạn và đang chạy một queue listener:
use Illuminate\Support\Facades\Artisan;
Route::post('/user/{user}/mail', function ($user) {
Artisan::queue('mail:send', [
'user' => $user, '--queue' => 'default'
]);
//
});
Sử dụng phương thức onConnection
và onQueue
, bạn có thể chỉ định kết nối hoặc queue nào mà lệnh Artisan sẽ được gửi tới:
Artisan::queue('mail:send', [
'user' => 1, '--queue' => 'default'
])->onConnection('redis')->onQueue('commands');
Thỉnh thoảng bạn có thể muốn gọi các lệnh khác từ một lệnh Artisan hiện có. Bạn có thể làm như vậy bằng cách sử dụng phương thức call
. Phương thức call
này nhận vào tên của command và một mảng các tham số của command đó:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->call('mail:send', [
'user' => 1, '--queue' => 'default'
]);
//
}
Nếu bạn muốn gọi một command khác và xoá đi tất cả các output của nó, bạn có thể sử dụng phương thức callSilent
. Phương thức callSilent
có cùng cách khai báo với phương thức call
:
$this->callSilently('mail:send', [
'user' => 1, '--queue' => 'default'
]);
Component symfony console, cái mà hỗ trợ cho Artisan console, cho phép bạn chỉ định các tín hiệu (nếu có) mà command của bạn cần xử lý. Ví dụ: bạn có thể chỉ định là command của bạn cần xử lý các tín hiệu SIGINT
vàSIGTERM
.
Để bắt đầu, bạn nên implement interface Symfony\Component\Console\Command\SignalableCommandInterface
trong class command Artisan của bạn. Interface này sẽ yêu cầu bạn định nghĩa hai phương thức: getSubscribedSignals
và handleSignal
:
<?php
use Symfony\Component\Console\Command\SignalableCommandInterface;
class StartServer extends Command implements SignalableCommandInterface
{
// ...
/**
* Get the list of signals handled by the command.
*
* @return array
*/
public function getSubscribedSignals(): array
{
return [SIGINT, SIGTERM];
}
/**
* Handle an incoming signal.
*
* @param int $signal
* @return void
*/
public function handleSignal(int $signal): void
{
if ($signal === SIGINT) {
$this->stopServer();
return;
}
}
}
Như bạn có thể thấy, phương thức getSubscribedSignals
sẽ trả về một mảng các tín hiệu mà lệnh của bạn có thể xử lý, trong khi phương thức handleSignal
sẽ nhận tín hiệu và có thể phản hồi tương ứng.
Lệnh make
của Artisan console sẽ được sử dụng để tạo nhiều class khác nhau, chẳng hạn như controller, job, migration và các bài test. Các class này được tạo ra bằng cách sử dụng các file "stub" được điền sẵn các giá trị dựa trên đầu vào mà bạn đưa vào. Tuy nhiên, thỉnh thoảng bạn có thể muốn thực hiện các thay đổi nhỏ đối với các file do Artisan tạo ra. Để thực hiện điều này, bạn có thể sử dụng lệnh stub:publish
để export ra các stub cơ bản nhất để tùy chỉnh:
php artisan stub:publish
Các file stub đã được export sẽ nằm trong thư mục stubs
trong thư mục gốc của ứng dụng của bạn. Bất kỳ thay đổi nào mà bạn thực hiện đối với các file stub này sẽ được phản ánh khi bạn tạo các class tương ứng khi sử dụng lệnh Artisan make
.
Artisan gửi ba event khi chạy các lệnh: Illuminate\Console\Events\ArtisanStarting
, Illuminate\Console\Events\CommandStarting
, và Illuminate\Console\Events\CommandFinished
. Event ArtisanStarting
được gửi ngay lập tức khi Artisan bắt đầu chạy. Tiếp theo, event CommandStarting
sẽ được gửi ngay trước khi lệnh được chạy. Cuối cùng, event CommandFinished
sẽ được gửi sau khi một lệnh đã chạy xong.
entry