Wednesday, 24/04/2019
News
Home » Laravel » Làm thế nào để tạo package trong Laravel

Làm thế nào để tạo package trong Laravel

Hướng dẫn tạo một Package Laravel 5 đơn giản trong 10 bước

Cách chính thống để Laravel xây dựng thêm các tính năng cho ứng dụng mà nó phát triển đó chính là sử dụng Package Laravel. Package có thể là bất cứ thứ gì từ cách tuyệt vời để xử lý ngày tháng như Carbon, hoặc là một BDD testing framework hoàn chỉnh như Behat.

Cũng phải hiểu rằng có nhiều loại package. Một số thì stand-alone, nghĩa là nó không phụ thuộc vào framework nào cả và có thể sử dụng trong nhiều project, không chỉ giới hạn mỗi Laravel. Chẳng hạn như Carbon package vừa nhắc tới. Số còn lại thì được xây dựng với mục đích là để hoạt động ở trên Laravel Framework. Những package Laravel này thường xây dựng đủ cả routes, controllers, views, và cả các file cấu hình để bổ sung tính năng và tăng cường hiệu suất cho Laravel app. Như vậy bài viết này nhằm mục tiêu hướng dẫn các bước để xây dựng một Laravel Package mà nó sinh ra để dành cho Laravel. Vậy đấy!

Tạo Package Laravel 5 đơn giản trong 10 bước

Vậy là bạn đã quyết định học cách tạo package cho bản thân để tăng cường sức mạnh cho ứng dụng Laravel yêu dấu của mình phải không? Tốt lắm, chúng ta cùng bắt đầu viết một Laravel 5 package đơn giản from scratch. Và tính năng của cái package mà chúng ta sẽ build đó là: hiển thị thời gian hiện tại cho các múi giờ khác nhau. Đơn giản vậy thôi, nhưng biết đâu hữu ích trong trường hợp nào đó chăng 😀

Ok, Here we go!

1. Fresh Laravel 5.1 installation

Chúng ta sẽ sử dụng Laravel 5.1 trong tutorial này. Do đó thì hãy cài đặt một project mới đi nào. Bạn dùng cách nào tùy ý, ở đây mình xài composer luôn cho tiện:

2. Package folder and name

Đầu tiên hãy tạo một folder là  /packages ở thư mục root của Laravel app – Đó là nơi chúng ta đặt code cho package. Bây giờ thì nghĩ một cái tên hợp lý cho nó thôi. Tên của package trong Laravel thường gồm 2 phần: [VENDOR or CREATOR] / [PACKAGE NAME]. Ví dụ: Bản thân Laravel cũng là một dạng package và có full name là  laravel/laravel. Còn Jeffrey Way – admin của Laracasts đặt tên cho Package Generators nổi tiếng của anh ta là way/generators. Vậy logic ở đây khá đơn giản: Package Laravel gồm tên của tác giả và tên của chính nó.

Vậy thì cái package của chúng ta sẽ được đặt tên là  laraveldaily/timezones – và giờ ta cần tạo cấu trúc thư mục như sau ở trong  /packages:

Tạ Package Laravel 5 đơn giản trong 10 bước: Cấu trúc folder

 

 

 

Và bên trong đó ta cần thêm 1 folder tên là src nữa:

Tạ Package Laravel 5 đơn giản trong 10 bước: Cấu trúc folder 2

 

 

Bây giờ cấu trúc thư mục đã xong, tiếp theo sẽ tiến hành đăng ký thương hiệu cho nó với Composer 😀

3. Composer.json file for the package

Mọi package đều cần có file composer.json, nơi mà không chỉ chứa thông tin các thành phần phụ thuộc (dependencies) mà còn chứa thông tin về chính package đó. Chạy lệnh này ở trong timezones folder:

Bạn sẽ được hướng dẫn từng bước để điền các thông tin cho composer.json. Đừng lo nếu bỏ qua hoặc điền sai điều gì đó, vì chúng ta có thể dễ dàng sửa đổi lại sau. Và xong các bước thì bạn sẽ được kết quả là file composer.json có nội dung tương tự như sau:

Đơn giản vậy là đủ!

4. Loading package via main composer.json and PSR-4

Để cho Laravel có thể autoload được package mới thì chúng ta cần phải khai báo cho nó đồng thời định danh alias nữa. Mở composer.json ở thư mục gốc của ứng dụng (chú ý phân biệt 2 file composer.json – một của Laravel root, một của package) lên và thêm vào section “psr-4”:

Sau đó chạy lệnh này ở thư mục gốc để composer autoload:

5. Creating a Service Provider

Service Provider là cầu nối quan trọng giữa Package và Laravel. Một service provider có nhiệm vụ là bind things vào trong Laravel service container và thông báo cho Laravel biết nơi để load các resource của package ví dụ như views, configuration, và localization files.

Đầu tiên hãy đọc kỹ về Service Provider trước đã 😀

Bây giờ thì tạo mới bằng cách sử dụng câu lệnh Artisan:

Câu lệnh trên sẽ generate file mới là  TimezonesServiceProvider.php trong folder  app/Providers. Sau đó thì hãy di chuyển file đó tới thư mục  /packages/laraveldaily/timezones/src. Đừng quên rằng phải thay đổi cả namespace của Provider class – nó phải giống với khai báo ở trong file composer.jsongốc. Trong trường hợp này là  LaraveldailyTimezones:

Tạo Package Laravel 5 đơn giản trong 10 bước: Timezones service provider

Bạn có thể thấy là chúng ta vừa generate class với 2 method là boot()register(). Chúng ta sẽ xử lý chúng sau. Còn bây giờ thì phải đăng ký service provider mới vào mảng Service Providers trong file  config/app.php đã:

Cool! Chúng ta vừa tạm hoàn thành phần Service Provider, giờ chuyển sang phần Controller thôi.

6. Create a Controller

Trong ví dụ Package Laravel này, chúng ta chỉ có một Controller – gọi nó là TimezonesController – và ta cần tạo nó trong cùng thư mục src của package.

Và controller này cũng chỉ có duy nhất 1 method là index để hiển thị thời gian ở các múi giờ khác nhau. Chúng ta sẽ sử dụng thư viện Carbon trong trường hợp này (bạn không cần cài đặt Carbon vì nó đã có sẵn ở trong Laravel rồi).

Đây là nội dung file packageslaraveldailytimezonessrcTimezonesController.php:

Một lần nữa đừng quên namespace cho đúng chuẩn và nhớ use AppHttpControllersController ở phía trên nhé.

7. Create our Routes.php file

File routes.php thì đã quá quen thuộc rồi. Tuy nhiên file routes cho package của ta sẽ nằm ở packageslaraveldailytimezonessrcroutes.php:

Bạn có tự thắc mắc là làm thế nào mà Laravel biết được file routes.php này và cả cái controller ở phần trên nữa? Lúc này sẽ phải nhờ đến Service Provider thôi: Thêm các dòng sau vào method register():

8. That’s it – load URL in the browser!

Tạo Package Laravel 5 đơn giản trong 10 bước: Load package trong view

 

 

Trong ví dụ này, tác giả sử dụng  Windows/XAMPP làm local server.

Bây giờ chúng ta cùng cân nhắc tới 2 vấn đề tiềm năng:

  • Nếu người dùng xác định múi giờ với slash symbol (/) thì sao? Lúc đó vẫn được tính là 1 URL.
  • Có lẽ chúng ta nên đặt một múi giờ mặc định, nếu người dùng chưa chỉ định rõ múi giờ.

Vậy thì chúng ta hãy giả sử rằng người dùng sẽ thêm múi giờ sử dụng dấu gạch ngang (dash symbol (-)) thay cho dấu gạch chéo (/) và chúng ta sẽ  str_replace nó. Đồng thời chúng ta làm cho tham số thành tùy chọn và múi giờ sẽ được mặc định là giống như trong cấu hình trong file  config/app.php.

Mở  packageslaraveldailytimezonesroutes.php ra và thêm question mark như sau:

Đồng thời sửa lại  packageslaraveldailytimezonesTimezonesController.php:

Giờ chúng ta có thể load URLs kiểu như  /timezones hoặc là  /timezones/Europe-London.

Ok, chúng ta sẽ có một package cơ bản và hoạt động tốt! Tuyệt cmn vời 😀 Nhưng có thể còn có thêm vài thứ mà bạn muốn thêm vào.

9. What about the Views?

Tất nhiên bạn sẽ không echo ra trình duyệt mỗi cái múi giờ xấu xí như vậy đúng không? Chí ít cũng thêm cho nó một chút HTML và vài chút style chứ. Tức là tạo views cho package. Hãy tạo folder mới là  /src/views để đặt các file View trong đó. Chúng ta sẽ copy view mặc định của Laravel 5 là  welcome.blade.php và thêm duy nhất 1 biến  $current_time vào. Đây là nội dung file  src/views/time.blade.php:

Giờ thì quay lại với Service Provider và sử dụng method boot() để khai báo nơi chúng ta sẽ load Views. Tham số thứ hai là Namespace mà chúng ta sẽ dùng ở bước kế tiếp.

Tiếp theo, sửa Controller để load view có tham số. Ở đây chúng ta đang load view với namespace của package mà chúng ta khai báo trong Service Provider:

Here we go! Reload lại trình duyệt cái xem nào!

Tạo Package Laravel 5 đơn giản trong 10 bước: View cho package

Đó chính là cách mà chúng ta sử dụng view ở trong Package Laravel!

10. Publishing the Views

Điều cuối cùng đó là: Giả sử người dùng package muốn customize lại view thì sao? Đó là viễn cảnh thường thấy – chúng ta cung cấp một basic template tuy nhiên người dùng mới là người quyết định giao diện cho app của họ, không phải chúng ta.

Tuy nhiên chúng ta không thể để họ customize lại bằng cách là tới package folder và sửa lại trực tiếp view trong đó được. Nghĩa là ta cần copy package view tới folder  resources/views mặc định của Laravel. Để làm được điều đó thì hãy thêm dòng này vào method boot() trong Service Provider:

Bạn có muốn show package của mình cho cộng đồng open source cùng sử dụng để người dùng có thể thêm package đó vào trong file composer.json không? Đây là hướng dẫn nho nhỏ để bạn làm điều đó. Chúng ta sẽ không đi sâu về cái này vì nó nằm ngoài phạm vi bài post về Laravel. Nhưng đây là các bước cơ bản:

  1. You form your package as a repository and upload it to GitHub;
  2. You register on Packagist.org;
  3. You make sure that your composer.json contains all necessary information;
  4. You submit a link to your GitHub repository to Packagist – and then – BOOM! – magic happens!
  5. For all detailed information about composer.json fields, package versioning and other topics – see Packagist documentation.

Kết luận

Chúng ta vừa cùng nhau đi hết một tutorial khá dài về cách để xây dựng một Package Laravel 5 sử dụng Laravel 5.1 trong 10 bước đơn giản. Không có gì cầu kì và khó hiểu ở đây cả, mình tin là vậy. Hi vọng qua bài này bạn đã có cái nhìn tổng quan về các bước để tạo package Laravel. Biết đâu được đọc xong bài này bạn thấy hứng thú với công việc Laravel Package Development thì sao? 😀 Rồi một ngày trên Packagist xuất hiện một sản phẩm bá đạo nào đó ^^ Tuyệt nhỉ!

Nói vui vậy thôi. Cảm ơn các bạn đã theo dõi blog và hi vọng nhận được sự ủng hộ từ phía mọi người!

Nguồn bài dịch: laravel-php.com

Nguồn bài gốc: laraveldaily.com

1 Star2 Stars3 Stars4 Stars5 Stars6 Stars7 Stars8 Stars9 Stars10 Stars (1 votes, average: 9.00 out of 10)
Loading...

Leave a Reply

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

*

:cuoi: :hix: :hihihi: :kiss: :sexy: :dotay: :ngacnhien: :oh: :love: more »