+9

Giới thiệu Laravel Package Development

Laravel Package là một hình thức thêm chức năng cho laravel, để chúng ta có thể sử dụng được ở bất cứ project nào mà chúng ta muốn. Không cần lặp đi lặp lại một hành đồng là copy và paste từ project này sang project khác, mặt khác chúng ta cũng có thể public package này ra cho nhưng dev khác dùng nữa. Một số package khá nổi tiếng được laravel subport như Carbon, Passport, Socialite ... mỗi dự án có những đặc điểm khác nhau, nhưng tôi nhận thấy hầu hết dự án cũng có hệ thống login, quản lý user ... vậy tại sao ko xây một cái package lên, lần sau muốn dùng chỉ cần gõ vài dòng lệnh là đã hoàn thành một module của dự án. Sau đây tôi sẽ hướng dẫn các bạn viết một package đơn giản là lấy thời gian hiện tại show ra màn hình:

Cài đặt

composer create-project --prefer-dist laravel/laravel package
mkdir -p packages/laraveldaily/timezones
cd  packages/laraveldaily/timezones

sau khi chạy lệnh cuối nó sẽ hỏi các bạn một số câu như sau:

 Welcome to the Composer config generator  
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [root/timezones]: laraveldaily/timezones
Description []: Demo-package to show time
Author [Duongnv <nguyen.van.duong@framgia.com>, n to skip]: 
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []: 
License []: MIT
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? 
Search for a package: 
Would you like to define your dev dependencies (require-dev) interactively [yes]? 
Search for a package: 
{
    "name": "laraveldaily/timezones",
    "description": "Demo-package to show time",
    "license": "MIT",
    "authors": [
        {
            "name": "aaNv",
            "email": "nguyen.van.aa@framgia.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {}
}

Do you confirm generation [yes]? 

sau khi chạy xong các bạn có thể sửa nội dung đã nhập bằng cách vào file composer.json đã được tạo ra trong thư mục hiện tại.

Tạo packages

Quay về thư mục gốc của project bạn thêm đoạn mã sau vào file 'psr-4' trong file composer.json:

"autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "Laraveldaily\\Timezones\\": "packages/laraveldaily/timezones/src"  // thêm dòng này vào đây chú ý cần tạo thêm thư mục src trong timezones
        }
    },

Sau đó chạy lệnh:

composer dump-autoload

Create package Provider

php artisan make:provider TimezonesServiceProvider

Nó sẽ tạo ra một service provider trong thu mục provider, chúng ta cần move nó vào thư mục package /packages/laraveldaily/timezones/src và đừng quên đổi namepaces cho nó nhé: namespace Laraveldaily\Timezones;

vào file config/app.php thêm đoạn code sau vào providers

 'providers' => [
 
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
        // ... other providers
        Illuminate\View\ViewServiceProvider::class,
        Laraveldaily\Timezones\TimezonesServiceProvider::class, // thêm dòng này vàio cuối

Tạo Controller

tạo file packages\laraveldaily\timezones\src\TimezonesController.php với nội dung như sau:

namespace Laraveldaily\Timezones;
 
use App\Http\Controllers\Controller;
use Carbon\Carbon;
 
class TimezonesController extends Controller
{
    public function index($timezone)
    {
        echo Carbon::now($timezone)->toDateTimeString();
    }

}

Tạo Routes.php file

Tạo file packages\laraveldaily\timezones\src\routes.php với nội dung như sau:

Route::get('timezones/{timezone}',  'laraveldaily\timezones\TimezonesController@index');

Bây giờ chúng ta cần đăng ký với service provider để nó nhận file routes vòa controller của chúng ta. Trong File TimezonesServiceProvider.php thay hàm register sau đây:

 public function register()
    {
        include __DIR__ . '/routes.php';
        $this->app->make('Laraveldaily\Timezones\TimezonesController');
    }

Để check xem laravel đã nhận routes và Controller có trong packages của bạn chưa, thì check như sau:

  1. Chạy lệnh php artisan serve
  2. Vào trình duyệt bằng link: http://127.0.0.1:8000/timezones/UTC
  3. Nếu vào thành công không thông báo lỗi là ok rồi.

Tạo Views

Bay h chúng ta cần tạo file time.blade.php trong thư mục src/views của packages với nội dung như sau:

<!DOCTYPE html>
<html>
<head>
    <title>Laravel Timezones</title>

    <link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">

    <style>
        html, body {
            height: 100%;
        }

        body {
            margin: 0;
            padding: 0;
            width: 100%;
            display: table;
            font-weight: 100;
            font-family: 'Lato';
        }

        .container {
            text-align: center;
            display: table-cell;
            vertical-align: middle;
        }

        .content {
            text-align: center;
            display: inline-block;
        }

        .title {
            font-size: 96px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="content">
        <div class="title">{{ $current_time }}</div>
    </div>
</div>
</body>
</html>

Quay lại file Service Provider để khai báo views:

public function boot()
    {
        $this->loadViewsFrom(__DIR__.'/views', 'timezones');
    }

Quay lại Controller để trả dữ liệu ra views:

public function index($timezone = NULL)
    {
        $current_time = ($timezone) ? Carbon::now(str_replace('-', '/', $timezone))  : Carbon::now();
        
        return view('timezones::time', compact('current_time'));
    }

Ok vậy là xong rồi, F5 trình link http://127.0.0.1:8000/timezones/UTC và xem thành quả của bạn.

Publish Views, Config ...

Tất nhiên là chúng ta có nhu cầu sửa giao diện của file views, hay cho phép sửa cấu hình của packages, thì nó cần được public ra chứ ko thể sửa trong vendor dc

Quay về server Provide hàm boot đặt thêm đoạn code sau vào cuối:

$this->publishes([
            __DIR__ . '/views' => base_path('resources/views/laraveldaily/timezones'),
]);

Sau đó chạy lệnh:

php artisan vendor:publish

để public views Copied Directory [/packages/laraveldaily/timezones/src/views] To [/resources/views/laraveldaily/timezones]

Ngoài ra laravel package còn cho phép chúng ta thực hiện với config, migrate, asset ..., chúng cũng có thể được public ra để custom theo ý muốn, các bạn có thể tham khảo thêm ở trang chủ.

Ví dụ này rất đơn giản chỉ giúp chúng ta cách tạo ra một package như thế nào, việc tạo ra package khá đơn giản giúp cho laravle ngày một mạnh mẽ bởi sự đóng góp bở cộng đồng, tất cả các package của laravel đều dc tạo ra như thế này.

Public source

  • Để public source này cho nhiều người cùng dùng chúng ta cần up nó lên gihub
  • Đăng ký với website Packagist.org.
  • Bất kỳ au muốn dùng chỉ cần chạy lệnh: composer required laraveldaily/timezones

Tham khảo

  1. https://laravel.com/docs/5.4/packages
  2. http://laraveldaily.com/how-to-create-a-laravel-5-package-in-10-easy-steps/

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí