post-image

Laravel Package Development

Tổng quan

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]?
Code language: PHP (php)

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 } },
Code language: JavaScript (javascript)

Sau đó chạy lệnh:

composer dump-autoload

Create package Provider

php artisan make:provider TimezonesServiceProvider
Code language: CSS (css)

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
Code language: PHP (php)

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(); } }
Code language: PHP (php)

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');
Code language: PHP (php)

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'); }
Code language: PHP (php)

Để 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>
Code language: HTML, XML (xml)

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

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

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')); }
Code language: PHP (php)

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'), ]);
Code language: PHP (php)

Sau đó chạy lệnh:

php artisan vendor:publish
Code language: CSS (css)

để 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

Tổng kết

Trên đây là những hiểu biết của mình về Laravel Package Development , cảm ơn bạn đã đọc đến đây. Happy coding ! 

Các bạn có thể tham khảo các bài viết hay về Laravel tại đây.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Tham khảo: Viblo

Leave a Reply

Your email address will not be published. Required fields are marked *