Create package for laravel

laravel-logo-white.png

  • Laravel với những tính năng vô cùng mạnh mẽ của mình ngày càng được sử dụng rộng rãi trong lập trình web.
  • Một trong những điểm mạnh của laravel là lượng package vô cùng lớn giúp giảm rất nhiều thời gian để phát triển tính năng cho website của mình. Tuy nhiên đã bao giờ bạn nghĩ đến việc tự tạo cho mình một package chưa?
  • Trong bài viết này tôi sẽ hướng dẫn cách tạo một package cho các bạn mới có thể làm quen một cách dễ dàng
  • Ví dụ sau đây là một package với chức năng liệt kê toàn bộ user trong hệ thống.
  • chú ý: để có thể hiểu rõ được các tạo một package bạn nên đọc qua các kiến thức sau:

Cấu trúc thư mục

  • chúng ta cần làm là tạo thư mục và name-spacing cho package theo chuẩn PSR-4. Trong laravel sẽ có cấu trúc thư mục như sau: vendor/package-nam
  • Trong ví dụ của mình tôi sẽ tạo ra một cây thư mục với cấu trúc như sau:
vendor/kynm/sample/src

Sử dụng composer

  • Việc tiếp theo chúng ta cần làm là tạo file composer.json cho package. File này sẽ giúp package của chúng ta trong việc quản lý các dependencies (các package laravel khác mà bạn muốn sử dụng cho package của mình) và cho việc deploy package khi hoàn thiện.
  • di chuyển vào thư mục gốc package từ terminal:
cd vendor/kynm/sample
  • Để tạo ra file composer.json ta sử dụng lệnh
composer init
  • Sau khi sử dụng lệnh trên thì termial sẽ yêu cầu ta điền một số thông số để khởi tạo file composer.json. Bạn có thể nhập các thông số minhf muốn như name, description,authors,minimum-stability, require..... Tuy nhiên bạn cũng có thể cứ ấn enter để nó tự động điền các thông số mặc định cho. sau đó ta sẽ custom lại sau cũng chưa muộn.
  • Về cơ bản sau khi chạy xong ta sẽ được một file composer.json với nội dung như sau
{
    "name": "kynm/sample",
    "description": "this is first package",
    "authors": [
        {
            "name": "kynm",
            "email": "[email protected]"
        }
    ],
    "minimum-stability": "dev",
    "require": {}
}
  • Lúc này nhìn vào thư mục package vừa tạo ta đã thấy cấu trúc thư mục đã được thêm một số file mới như sau:

Selection_016.jpg

  • Để có thể load được các class trong package ở các nơi khác trên trang web thì ta phải định nghĩa nó trên file composer.json của ứng dụng
  • di chuyển ra thư mục gốc của ứng dụng web và tìm đến file composer.js. Sau đó thêm vào một định nghĩa namespase như sau:
"psr-4": {
    "App\\": "app/",
    "KyNM\\Simple\\": "vendor/kynm/sample/src"
},
  • Đến đây cơ bản ta đã tạo xong được một composer package rồi.

Tạo các thành phần chính trong package

Tạo Service Provider

  • Service Provider là thành phần quan vô cùng quan trọng. Có thể coi nó như một file bootstrap riêng biệt nằm trong package của bạn. Nó chỉ đơn giản là một file sets up mọi thứ một cách chính xác trong quá trình start up. Ở đây ta chỉ cần sets up một vài thông số sau đó Laravel sẽ biết phải làm gì với nó.
  • Tạo một file SimpleServiceProvider.php trong thư mục src của package với nội dung như sau
namespace KyNM\Simple;
use Illuminate\Support\ServiceProvider;
class SimpleServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->loadViewsFrom(__DIR__.'/views', 'simple');
        if (! $this->app->routesAreCached()) {
            require __DIR__.'/routes.php';
        }
    }
    public function register()
    {
        //
    }
}
  • Đăng ký service provider để sử dụng trong toàn bộ app như sau: vào file config.php thêm vào dòng sau:
    Collective\Html\HtmlServiceProvider::class,
    Themsaid\Multilingual\MultilingualServiceProvider::class,
    KyNM\Simple\SimpleServiceProvider::class,

Tạo controller cho package

  • Thêm một file SimpleController.php vào thư mục src:
namespace KyNM\Simple;
use App\Http\Controllers\Controller;
use App\Models\User;
class SimpleController extends Controller {
  public function __construct() {
    // $this->middleware('auth');
  }
  public function index()
  {
    $users = User::all();
    return view('simple::admin')->with('users', $users);
  }
}
  • Trong hàm boot() của SimpleServiceProvider.php ta đã định nghĩa một file router và đường dẫn load một file view cho package. giờ ta sẽ tạo ra 2 file đó để hệ package được hoàn chỉnh và chạy như một chức năng bình thường ta viết bên ngoài app.
  • tạo thư mục : views trong thư mục src
  • tạo file admin.blade.php trong thư mục views với nội dung
<div class="container">
<h1>You have {{count($users)}} user(s)</h1>
<div class="col-md-8">
<ul class="list-group">
@foreach($users as $user)
<li class="list-group-item">{{$user->username}}</li>
 @endforeach </ul>
</div>
</div>
  • tạo file router.php trong thu mục src với nội dung
Route::get('sampleusers', 'KyNM\Simple\[email protected]');
  • Đến đây ta đã được một package có thể chạy được thông qua đường dẫn: test.localhost/sampleusers

Tổng kết

  • Trên đây là các bước cơ bản để tạo ra một package cho laravel. tùy từng mục đích sử dụng mà bạn sẽ tạo ra các package phù hợp.