Laravel Zero - Build your own console application

Laravel Zero

Giới thiệu

Laravel Zero được tạo ra và được duy trì bởi Nuno Maduro, và là micro framework cho các ứng dụng console/command line. Đây là một phiên bản không chính thức và tùy chỉnh của Laravel được tối ưu hóa để xây dựng các ứng dụng dòng lệnh (command-line application).

Các đặc điểm của Laravel Zero:

  • Được xây dựng dựa trên các component của Laravel.
  • Cho phép lựa chọn cài đặt Laravel Eloquent, Laravel Logging và nhiều thành phần khác.
  • Hỗ trợ menu tương tác và các thông báo trên desktop trên Linux, Windows & MacOS.
  • Đi kèm với Scheduler và một Standalone Compiler.
  • Tích hợp với Collision (Collision là một trình hiển thị/thông báo lỗi Đẹp).

Cài đặt và sử dụng

Cài đặt

Requires: PHP 7.1.3+

Cài đặt Laravel Zero khá là đơn giản và tương tự với laravel:

$ composer create-project --prefer-dist laravel-zero/laravel-zero <your-app-name>

Sau khi cài đặt xong các bạn có thể chạy ngay ứng dụng ở ngay thư mục vừa tạo:

$ php <your-app-name>

Bạn có thể đổi tên của ứng dụng vừa tạo bằng cách gõ lệnh sau trong thư mục gốc của ứng dụng:

$ php <your-app-name> app:rename <new-app-name>

Sử dụng

Laravel Zero có sẵn documents đầy đủ và dễ hiểu tại http://laravel-zero.com/#/?id=about nên mình sẽ không viết lại nữa mà tập trung cho phần demo ở dưới nhé.

Demo

Trong bài viết này mình sẽ tạo một ứng dụng nho nhỏ để xem các phim đang/sắp/đã chiếu và thông tin của chúng.

$ composer create-project --prefer-dist laravel-zero/laravel-zero movie
$ cd movie

Mình sẽ sử dụng https://www.themoviedb.org để lấy các dữ liệu về phim. Trang này cho phép chúng ta tạo api key miễn phí, các bạn chỉ cần tạo một tài khoản (cũng miễn phí luôn) và tạo api key để bắt đầu sử dụng. Sau khi login các bạn vào Setting để tạo api key nhé, nó có 1 cái form điền thông tin, mình có thể điền thông tin fake hay thật đều được.

Ngoài ra để lấy các thông tin trên themoviedb mình cần phải cài thêm php-tmdb/laravel, đây là 1 package cung cấp các api cho phép chúng ta lấy các dữ liệu về phim

$ composer require php-tmdb/laravel

Cập nhật lại config/app.php,

'providers' => [
    App\Providers\AppServiceProvider::class,
    Tmdb\Laravel\TmdbServiceProvider::class,
],

Thêm config cho tmdb:

<?php // config/tmdb.php

return [
    /*
     * Api key
     */
    'api_key' => '<YOUR_API_KEY>',

    /**
     * Client options
     */
    'options' => [
        /**
         * Use https
         */
        'secure' => true,

        /*
         * Cache
         */
        'cache' => [
            'enabled' => true,
            // Keep the path empty or remove it entirely to default to storage/tmdb
            'path' => storage_path('tmdb')
        ],

        /*
         * Log
         */
        'log' => [
            'enabled' => true,
            // Keep the path empty or remove it entirely to default to storage/logs/tmdb.log
            'path' => storage_path('logs/tmdb.log')
        ]
    ],
];

Tạo command

Các thành phần yêu cầu cơ bản đã đầy đủ, tiếp theo chúng ta cần tạo ra các command:

$ php movie make:command InfoCommand
$ php movie make:command TopRateCommand
$ php movie make:command NowPlayingCommand
$ php movie make:command PopuplarCommand
$ php movie make:command UpcomingCommand

Về cơ bản, cấu trúc các Command được tạo ở trên tương tự với các Command trong laravel, các bạn thao khảo thêm tại Laravel/Artisan

<?php // App\Commands\InfoCommand.php
namespace App\Commands;

use App\Commands\Helper\MovieHelper;
use Illuminate\Console\Scheduling\Schedule;
use LaravelZero\Framework\Commands\Command;

class InfoCommand extends Command
{
    protected $signature = 'info {id? : Movie\'s ID}';
    protected $description = 'Get movie\'s information';
  
    public function handle(): void
    {
        $movieId = $this->argument("id");
        while (empty($movieId)) {
            $movieId = $this->ask("Please enter movie ID");
        }
        $rows = MovieHelper::getMovieInformation($movieId);
        $this->table([], $rows);
    }

	public function schedule(Schedule $schedule): void	{	}
}

Ở trên, nếu trong command của người dùng không chứa movieId mình sẽ để họ nhập bằng tay. Ngoài ra mình có sử dụng MovieHelper để lấy các dữ liệu cần thiết. (mình sẽ post ở cuối bài)


Kết quả

Laravel Zero

Menu chính

Laravel Zero

Lấy thông tin của phim dựa trên ID

Laravel Zero

Lấy danh sách các phim đang chiếu (20 phim)


Source code: github