12/08/2018, 14:47

Laravel: Console Command Phần 2

Chúng ta cùng tiếp tục tìm hiểu về Console Command trong Laravel. Các bạn tham khảo phần 1 tại đây. Command I/O ***Retrieving Input*** 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. Để ...

Chúng ta cùng tiếp tục tìm hiểu về Console Command trong Laravel.

Các bạn tham khảo phần 1 tại đây.


Command I/O


***Retrieving Input***

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 argument và option:

/**
 * 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```, ```question``` và ```error```. 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 = AppUser::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 = AppUser::all();

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

foreach (usersasusers as usersasuser) { this−>performTask(this->performTask(this>performTask(user);

$bar->advance();

}

$$ar->finish();

Để biết thêm các advanced option, đọc thêm tại [Symfony Progress Bar component documentation.](https://symfony.com/doc/2.7/components/console/helpers/progressbar.html).
<br>

### **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 $$ommands = [ CommandsSendEmails::class ];

<br>
### **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```:

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

<br>
***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() { $$his->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```:

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

<br><br>
*Hy vọng bài viết này là hữu ích với các bạn! ^^*




0