Laravel: Console Command trong laravel Phần 2

Chúng ta cùng tiếp tục tìm hiểu về Console Command trong Laravel để áp dụng vào viết các command cần thiết khi thiết kế web bds nhé. Các bạn tham khảo bài trước đó là: Laravel: Console Command trong laravel phần 1

Command I/O trong laravel là gì?

Trong khi command của bạn được thực hiện, bạn sẽ chắc chắn cần phải truy cập vào các đối số và các option được chấp nhận bởi command của bạn. Để làm như vậy, bạn có thể sử dụng phương thức argumentoption:

Retrieving Input

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $userId = $this->argument('user');

    //
}

Nếu bạn cần phải lấy tất cả các argument như 1 array, gọi phương thức arguments:

$arguments = $this->arguments();

option có thể được lấy ra dễ dành như argument bằng cách sử dụng phương thức option. Để lấy tất cả các option như 1 array, ta gọi phương thức options:

// Retrieve a specific option...
$queueName = $this->option('queue');

// Retrieve all options...
$options = $this->options();

Nếu option hoặc argument không tồn tại, nó sẽ trả về null.

Prompting For Input

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 input trong quá trình thực hiện command của bạn. Phương thức ask sẽ nhắc nhở người dùng với câu hỏi được đưa ra, chấp nhận inout của họ, và sau đó trả về input của người dùng trở lại command của bạn:

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $name = $this->ask('What is your name?');
}

Các phương thức secret cũng tương tự như ask, nhưng input của người dùng sẽ không được hiển thị khi họ gõ vào console. Phương thức này rất hữu ích khi yêu cầu thông tin nhạy cảm như password:

$password = $this->secret('What is the password?');

Asking For Confirmation

Nếu bạn cần phải hỏi người dùng để confirm, bạn có thể sử dụng phương thức confirm. Theo mặc định, phương thức này sẽ trả về false. Tuy nhiên, nếu người dùng nhập vào y hoặc yes , phương thức này sẽ trả về true:

if ($this->confirm('Do you wish to continue?')) {
    //
}

Auto-Completion

Phương thức anticipate có thể được sử dụng để cung cấp tính năng tự động hoàn thiện cho các lựa chọn có thể. Người dùng vẫn có thể lựa chọn bất kỳ câu hỏi, bất kể gợi ý của auto-completion.

$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);

Writing Output

Để gửi output đến console, sử dụng các phương thức line, info, comment, questionerror. Mỗi phương thức này sẽ sử dụng màu sắc ANSI thích hợp cho mục đích của từng lệnh. Ví dụ, hãy hiển thị một số thông tin chung cho người dùng. Thông thường, phương thức info sẽ hiển thị trong console với text màu xanh lá cây.

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $this->info('Display this on the screen');
}

Để hiển thị 1 error message, sử dụng phương thức error. Error message thường hiển thị màu đỏ

$this->error('Something went wrong!');

Nếu bạn muốn hiển thị đơn giản, không có màu ở console output, sử dụng phương thức line:

$this->line('Display this on the screen');

Table Layouts

Phương thức table làm cho nó dễ dàng để định dạng một cách chính xác nhiều row / column của dữ liệu. Chỉ cần pass trong header và row của phương thức. Chiều rộng và chiều cao sẽ được tự động tính toán dựa trên dữ liệu đưa ra:

$headers = ['Name', 'Email'];

$users = App\User::all(['name', 'email'])->toArray();

$this->table($headers, $users);

Progress Bars

Đối với task chạy dài, nó có thể hữu ích để hiển thị tiến trình chạy. Sử dụng các các output object, chúng ta có thể start, advance và stop thanh tiến trình. Đầu tiên, xác định tổng số các bước quá trình sẽ chạy qua, sau đó advance Bar Progress mỗi khi chạy qua một mục:

$users = App\User::all();

$bar = $this->output->createProgressBar(count($users));

foreach ($users as $user) {
    $this->performTask($user);

    $bar->advance();
}

$bar->finish();

Để biết thêm các advanced option, đọc thêm tại .

Registering Commands

Một khi command của bạn được hoàn tất, bạn cần phải đăng ký nó với Artisan. Tất cả các command được đăng ký trong file app/Console/Kernel.php. Trong file này, bạn sẽ tìm thấy một danh sách các command trong commands property. Để đăng ký command của bạn, chỉ cần thêm tên Class của command vào danh sách. Khi khởi động thủ công, tất cả các lệnh được liệt kê trong property này sẽ được giải quyết bởi các service container và đăng ký với Artisan:

protected $commands = [
    Commands\SendEmails::class
];

Programmatically Executing Commands

Đôi khi, bạn có thể muốn thực hiện 1 lệnh Artisan ngoài CLI. Ví dụ, bạn có thể muốn bắn 1 Artisan command từ một route hoặc controller. Bạn có thể sử dụng phương thức call trên Artisan facade để thực hiện điều này. Phương thức call cấp nhận tên của command như argument đầu tiên và một array các tham số của command là argument thứ 2. Exit code sẽ được trả lại:

Route::get('/foo', function () {
    Artisan::queue('email:send', [
        'user' => 1, '--queue' => 'default'
    ]);

    //
});

Nếu bạn cần phải xác định giá trị của 1 option mà không chấp nhận các string value, giống như --force flag trên migrate:refresh command, bạn có thể pass true hoặc false:

$exitCode = Artisan::call('migrate:refresh', [
    '--force' => true,
]);

Calling Commands From Other Commands

Đôi khi bạn có thể muốn gọi command khác từ một Artisan command đã tồn tại. Bạn có thể sử dụng phương thức call. Phương thức call chấp nhận tên command và một array các tham số của command :

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $this->call('email:send', [
        'user' => 1, '--queue' => 'default'
    ]);

    //
}

Nếu bạn muốn gọi một console command và ngăn chắn 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ó signature giống như phương thức call:

$this->callSilent('email:send', [
    'user' => 1, '--queue' => 'default'
]);

Bài viết này được tổng hợp từ Internet nhiều nguồn quốc tế khác nhau biên soạn lại, chúng tôi không chịu trách nhiệm về nội dung bài viết này, nếu việc áp dụng vào Dự án của bạn có sai sót hay liên hệ với chúng tôi để cập nhật lại nội dung nhé.