Tìm kiếm bài viết

Laravel: Console Command trong laravel Phần 2

21.09.2020

5.0/5 (1 Reviews)

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é.

    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é.

    CÓ THỂ BẠN QUAN TÂM

    Bài Viết Cùng Chuyên Mục

    XEM THÊM
    thumbnail

    Kubernetes bài 6 - Vận hành k8s Day-Two Operations và Quản trị bằng GitOps

    22.05.2026

    Khi cụm Kubernetes của bạn đã được bảo mật cấu hình, tối ưu tài nguyên và thiết lập tự phục hồi, câu hỏi đặt ra là làm sao để duy trì sự ổn định đó trong nhiều năm tiếp theo mà không bị phụ thuộc

    thumbnail

    Kubernetes bài 5 - bảo mật Cloud Native và chuẩn DevSecOps cho K8s

    22.05.2026

    Việc siết chặt an ninh (Hardening) không phải là cấu hình một vài thông số rồi bỏ đó, mà là một tư duy phòng thủ chiều sâu.

    thumbnail

    Kubernetes bài 4 - Tối ưu Resource Auto-Healing và Scale Zero-Downtime

    22.05.2026

    Bài viết này sẽ đi sâu vào các cơ chế ở tầng Kernel giúp hệ thống tự phục hồi, chống lại các đợt tấn công cạn kiệt tài nguyên và cập nhật phiên bản mới mà người dùng không hề hay biết.

    thumbnail

    Kubernetes bài 3 - Bảo mật cấu hình k8s và config Security trên Production

    22.05.2026

    Kubernetes giải quyết bài toán này bằng hai đối tượng chuyên biệt nhưng nếu không hiểu rõ bản chất bảo mật ở tầng dưới, bạn đang tự tay dâng toàn bộ chìa khóa hệ thống cho hacker.

    thumbnail

    Kubernetes bài 2 - Mạng lưới k8s và luồng Traffic ở Packet Level

    22.05.2026

    Pod không chỉ là một container: Rất nhiều người nhầm lẫn Pod 1-1 với Container. Thực chất, Pod là đơn vị triển khai nhỏ nhất, có thể chứa một hoặc nhiều container

    Mục lục bài viết