Tạo module Backend, Frontend và Api với Laravel 5.7 (version 2)

Hôm nay có thời gian rãnh rỗi. Tui viết lại bài tạo module version 2 để cập nhật lại cho bài lần trước, về cơ bản thì cũng không khác gì, nhưng có một số thay đổi khi load route và views cho từng module. Bài này tui dùng Laravel 5.7 nhé, và coi như các bạn đã cài WAMP Server rồi nhé.

1. Tạo project:

Hôm nay là ngày 01/12, cho nên tui chọn tên project là hestia nhé. Giả sử, thư mục WEB_ROOT cho project này hiện lại là E:\Server\www\learning:

Chờ đến khi nó chạy xong như hình sau:

Khi đó trong thư mục hestia, chúng ta sẽ có cây thư mục như sau:

Để đơn giản, tui không tạo virtual host để trỏ vào thư mục hestia/public mà tui sẽ dùng cái Web Server có sẵn của laravel để run cái project này luôn. Chuyển vào thư mục hestia, run command sau:

Mở Chrome hay FireFox lên, chạy http://localhost:9000/, nếu nó hiện ra cái trang Laravel to đùng thì ổn.

Nếu các bạn bỏ tham số –port=9000 thì mặc định Web Server nó sẽ listen ở port 8000 nha.

2. Tạo module Backend, Frontend và Api:

Tại thư mục app, các bạn tạo thư mục Modules và các thư mục con tương ứng như sau:

Chú ý: trong thự mục Modules/Api, không có thư mục Views nha, lý do là Api không cần render views.

Tại thư mục config, các bạn tạo một file tên là modules.php:

Với nội dung như sau:

Mục đích của việc tạo file modules.php để đễ dàng quản lý việc load routes cũng như views theo từng module tương ứng. Tiếp theo, các bạn tạo một Service Provider để nó kiểm tra và load module tương ứng. Tại thư mục app/Modules, các bạn tạo một file tên là ModuleServiceProvider.php:

Với nội dung sau (hơi bị dài nha):

Thực chất là tui sẽ dùng cái ModuleServiceProvider.php này để thay thế cho cái file Provider/RouteServiceProvider.php mặc định của Laravel.

Đối với hàm mapApi(), do tui muốn là có nhiều file route tương ứng với từng version cho api, kiểu như là:

  • v1.route.php, tương ứng với api/v1/*
  • v2.route.php, tương ứng với api/v2/*

Cho nên sẽ có phần scandir cho thư mục Api/Routes để lấy cái version name cho từng route.

Edit file config/app.php để load cái Modules/ModuleServiceProvider.php và unload cái Provider/RouteServiceProvider.php. Mở file config/app.php, tìm đến cái array ‘providers’:

comment cái dòng App\Providers\RouteServiceProvider::class,

và thêm App\Modules\ModuleServiceProvider::class,

Để cho chắc chắn rằng Laravel 5 nó hiểu cái namespace App\Modules, chúng ta mở file composer.json, tìm đến mục psr-4 nằm trong mục autoload, thêm “App\\Modules”: “app/Modules” ngay bên dưới “App\\”: “app/”:

Để chắc ăn, các bạn nên stop Web Server (ấn Ctrl + C) và start lại nhé.

3. Tạo route cho từng module

Ở phần này, tui sẽ map route với Controller@action nhé.

3.1. Backend module:

Các bạn tạo các file như sau:

Nội dung các file tương ứng như sau:

Backend/Controllers/Controller.php:

Backend/Controllers/HomeController.php:

Backend/Routes/web.php:

Backend/Views/home/welcome.blade.php:

Kết quả:

3.2. Frontend Module:

Cũng tạo các file giống như Backend:

Nội dung thì y chang, chỉ khác cái namespace và nội dung message:

Frontend/Controllers/Controller.php:

Frontend/Controllers/HomeController.php:

Frontend/Routes/web.php:

Frontend/Views/home/welcome.blade.php:

Kết quả:

3.3. Api Module:

Tạo các file sau:

Nội dung các file như sau:

Api/Controllers/Controller.php:

Api/Controllers/V1Controller.php:

Api/Routes/v1.route.php:

Kết quả trên Postman:

 

Vậy là xong roài đó. Hy vọng giúp ích được cho các bạn.  THANK-YOU

Read More

Sử dụng JSON để truyền nhận dữ liệu trong Restful

Trong bài Sử dụng tham số đường dẫn khi tạo Restful url, các bạn đã biết các truyền dữ liệu theo kiểu tham số của url endpoint rồi. Trong bài này, tui sẽ nói về việc sử dụng JSON để truyển nhận dữ liệu giữa Client và Server, nhưng trước tiên tui phải nói sơ qua JSON cho những ai chưa bao giờ biết JSON là gì.

1. JSON là gì?

JSON là viết tắt của cụm từ JavaScript Object Notation. Do Client chủ yếu sử dụng Javascript để tương tác và JSON chính là cách biểu diễn đối tượng trong Javascript luôn nên không cần phải có các bước parsing phức tạp như đối với XML. Đối với JSON, ta chỉ cần Key-Value để biểu diễn đối tượng cũng như dữ liệu. Ví dụ như sau:

Cặp dấu móc { } sẽ định nghĩa đó là một object, và trong object, có thể chứa object khác, ở đây property (hay là Key) “convertTo” là một object, còn các property khác là kiểu String. Để chứa nhiều object trong một array, ta dùng cặp dấu ngoặc vuông [ ].

Sơ sơ qua JSON là như vậy.

2. Lấy dữ liệu JSON từ Server bằng phương thức HTTP GET:

Ví dụ Client sẽ lấy danh sách các quyển sách thông qua endpoint http://localhost:9000/api/books, Server sẽ trả về danh sách giống như trên bằng JSON. Mở gile routes/api.php lên và thêm đoạn code sau:

$entries là một array chứa các array con là những quyển sách nha các bạn, hàm json() của đối tượng Response trong Laravel nó làm cái nhiệm vụ là convert cái array này sang JSON và trả về cho Client. Trong PHP, việc chuyển từ Array sang JSON và ngược lại rất dễ, các bạn sử dụng 2 cái hàm: json_encode() và json_decode() nha (search google để xem thêm nha). Còn trong Laravel thì nó đã làm sẳn cho mình luôn rồi, nên chỉ việc dùng thôi.

Postman để xem nhé:

 

Giờ tui muốn là Server trả về một object, có một property là “books” cá value là một array chứa các quyển sách trên như vầy thì bên Laravel code làm sao:

Các bạn chỉ cần sửa biến $entries lại như sau:

Lại Postman:

Các bạn chú ý sẽ thấy là cái key trong JSON nó giống với cái key trong Array của PHP nha các bạn.

3. Send dữ liệu JSON về Server bằng phương thức HTTP POST:

Cũng là endpoint http://localhost:9000/api/books nhưng với phương thức POST, chúng ta sẽ gửi về Server một quyển sách mới, Server nhận và append vào danh sách hiện tại và trả lại danh sách mới này cho Client. ví dụ ở đây, danh sách hiện tại có 2 quyển sách rồi nhé:

Nếu viết PHP bình thường, chúng ta phải dùng hàm json_decode() để lấy dữ liệu từ trong JSON ra, nhưng trong Laravel thì nó đã tích hợp luôn cái việc đó trong đối tượng Request. Cho nên khi đó, việc lấy từng giá trị thông qua các key tương ứng cũng giống như lấy dữ liệu từ form POST như kiểu làm bình thường thông qua hàm input() của Request.

Postman tiếp:

Chọn tab Body ở phía trên, sau đó click chọn raw, và chọn kiểu dữ liệu gửi đi là JSON(application/json), khi đó, Postman sẽ tự động thêm cái Header là Content-Type: application/json, nếu không thì bên Server sẽ không nhận được dữ liệu là nội dung JSON nha các bạn.

Tiếp theo, các bạn nhập nội dung JSON cần gửi về Server ở cái khung Text ngay bên dưới, Chọn phương thức là POST và click Send thì các bạn sẽ thấy cái list trả về có thêm cái nội dung quyển sách mới.

Chú ý, cái Body ở trên là để chúng ta nhập dữ liệu và gửi về Server, còn Body bên dưới là kết quả trả về (nếu có) từ Server nha các bạn.

OK, vậy là xong rồi đó, hy vọng các bạn có thể hiểu được cách làm việc với JSON.

Read More

Redis Pub/Sub – Cơ chế hoạt động – Cài đặt trên Windows

Chào các bạn. Đó giờ làm laravel, thấy cái thằng Redis chỉ được dùng làm cache nên cũng không quan tâm lắm, chỉ biết nó là dạng memory-database và lưu dữ liệu dạng key-value, hết. Hôm nay, tui lò mò tìm hiểu thì thấy Redis nó còn có một cơ chế gọi là Pub/Sub dùng để làm mấy cái ứng dụng realtime, cũng khá hay nha các bạn, nó giống như là thằng Kafka vậy dùng để làm message delivery tương tự như bài Xây dựng một Realtime Dashboard sử dụng Spark Streaming, Kafka, Nodejs và MongoDB. Bài hôm nay, chủ yếu hướng dẫn các bạn cài Redis trên Windows cũng như xem cái cơ chế Pub/Sub nó ra sau ha.

1. Cài đặt Redis trên Windows:

Nếu vào trang redis.io, các bạn không thấy cái mục download cho windows đâu, hình như là từ version 4.0, nó không còn hổ trợ cho Windows nữa hay sau đó. Nhưng không sau, các bạn vào link sau để tải về nhá: https://github.com/MicrosoftArchive/redis/releases

Chọn version là 3.2.100 (64 bit nhé), và download cái file zip như hình sau:

download xong, các bạn unzip nó ra thư mục nào cũng được, trong bài này tui unzip nó ra thư mục E:\Server\redis\3.2.100, như sau:

Các bạn chú ý 2 cái file: redis-server.exeredis-cli.exe, lát mình sẽ chạy 2 file này để làm demo.

2. Cơ chế Pub/Sub:

  • Pub: Publish, có nghĩa là một producer đẩy dữ liệu vào một channel (kênh) hay còn gọi là topic như trong Kafka
  • Sub: Subscribe có nghĩa là một consumer đăng ký nhận dữ liệu từ một channel hay topic.

Hiểu đơn giản tí, giống như xem truyền hình cáp vậy (ví dụ như SCTV), chúng ta là các consumer, đăng ký (subscribe) vào các kênh như: VTV1, VTV3, VTV6, HBO, Fox Movies…. thì SCTV chính là một producer, đẩy dữ liệu (publish) ra các kênh tương ứng đó và chúng ta chỉ nhận và xem trên TV thôi.

Như hình trên, một subscriber có thể đăng ký nhận data từ nhiều kênh nha các bạn.

3. Demo cơ chế Pub/Sub của Redis:

Do demo chỉ làm trên console, cho nên tui giả sử các bạn đều chuyển về ngay thư mục của Redis (cái thư mục mà unzip hồi nảy), như trong bài thì tui chuyển về thư mục E:\Server\redis\3.2.100 này hết nha.

Mở cmd đầu tiên lên và chạy lệnh:

Nếu nó ra như thế này có nghĩa là Redis Server đã run:

Chú ý: mặc định thì Redis nó listen ở port 6379. Để change thành port 7777, các bạn thêm tham số –port như sau:

Tiếp theo, mở 3 cái cmd lên, chạy cùng một lệnh:

Chúng ta quy định như hình trên nha, 1 PUBLISHER và 2 SUBSCRIBER

ở SUBCRIBER 1, các bạn đăng ký 2 kênh là channel-a và channel-b bằng lệnh subscribe:

ở SUBSCRIBER 2, các bạn đăng ký 1 kênh là channel-a

sau đó, ở PUBLISHER, các bạn phát một message là “Welcome to Channel A” ở channel-a bằng lệnh publish:

thì lập tức ở SUBSCRIBE 1 và SUBSCRIBE 2 sẽ hiện ra đoạn text trên:

Nếu bây giờ, ở PUBLISHER, các bạn phát một message “Welcome to Channel B” ở channel-b:

thì các bạn chỉ thấy SUBSCRIBER 1 nhận cái message đó thôi.

Đấy là cơ chế Pub/Sub của Redis, sau này có thời gian, tui sẽ làm một bài về việc dùng Redis Pub/Sub này kết hợp với Laravel Broadcasting cùng với socket.io để làm cái ứng dụng send message nho nhỏ. Vậy nhé, hẹn gặp lại.

Read More

Sử dụng tham số đường dẫn khi tạo Restful url

Ở bài trước, tui đã làm một cái RESTful endpoint cho các bạn xem thấy cũng ngon ăn ha, dễ òm. Nhưng cuộc đời nó không có đơn giản như vậy và RESTful cũng thế. Trong bài hôm nay, tui sẽ nói về cách sử dụng tham số đường dẫn (path parameter) trong url endpoint.

1. Tham số đường dẫn:

Với một url endpoint, nếu đi với các HTTP verb khác nhau, chúng ta sẽ có những endpoint khác nhau. Do đó, nếu cùng một url endpoint, cùng 1 HTTP verb, nếu số lượng tham số đường dẫn khác nhau cũng sẽ tạo ra các endpoint khác nhau.

Nhìn cái hình trên chắc cũng rõ ràng hơn rồi ha. Đó là cách chúng ta truyền tham số từ phía Client, vậy bên Server chúng ta phải định nghĩa như thế nào để nhận các tham số đó.

Với Url đầu tiên, ta viết như thế này:

{name} là biến parameter của url endpoint, tương ứng với giá trị “peter”, tới chổ này, chúng ta chỉ mới làm cái chổ để nhận giá trị là “peter” thôi. Tiếp theo, chúng ta phải đưa được cái giá trị này vào trong cái hàm callback để xử lý. Trong hàm callback, chúng ta phải khai báo một biến parameter của hàm là $name, biến này là biến của PHP nha và tên biến nên giống tên biến trên cái url để dễ nhớ (các bạn có thể đặt tên biến của hàm callback là $name1, $your_name…, không nhất thiết phải giống nha, nhưng tui khuyên là nên giống, hehe). Túm lại là:

Thử thôi, mở file routes/api.php ra và viết cái đoạn code trên:

Mở Postman lên và gõ cái url: http://localhost:9000/api/hello/peter, kết quả là:

Các bạn có thể thử đổi tên biến $name thành $your_name, rồi thử coi sao nhé.

2. Thứ tự của các tham số đường dẫn trong url:

OK, coi như các bạn đã thử và chạy ngon. Ta xem tiếp cái url thứ 2:

Trên url ta có 2 parameters, thì bên dưới hàm callback cũng phải có 2 cái parameters tương ứng (tên biến thì đã nói như ở trên ha). Viết thử coi sao:

lại Postman:

Oh, quá ngon, chạy mượt. Nhưng giờ các bạn thử đổi thứ tự biến parameter của hàm callback xem sao từ $name, $age thành $age, $name, tên biến thì giữ nguyên y chang:

Postman again:

Ngạc nhiên chưa, giá trị của biến $age = {name} = peter và biến $name = {age} = 25. Tại sao lại bị vậy, lý do? Đó là do thứ tự các biến trên url và trong hàm callback không giống nhau. Vậy từ chổ này, các bạn nhớ cho tui là:

Khi sử dụng tham số đường dẫn, nếu có từ 2 tham số (parameter) trở lên: tên biến có thể giống/khác nhau, nhưng thứ tự các biến tham số phải giống nhau trên cả url và hàm callback

3. Tham số tùy chọn:

Giả sử tui có cái url endpoint như sau: http://localhost:9000/api/age-permission/{age}, nếu như từ 18 tuổi trở lên thì truyền age vào, còn nếu nhỏ hơn 18 tuổi thì không cần truyền:

Từ 18 ==> http://localhost:9000/api/age-permission/20

Dưới 18 ==> http://localhost:9000/api/age-permission

Khí đó các bạn sẽ cho biến {age} thành {age?} là một biến option và giá trị default của biến $age trong hàm callback là 17, viết như sau:

Nếu có từ 2 tham số trở lên, các tham số tùy chọn (option parameter) thường để ở phía sau cùng

Thử viết xem sao:

Still Postman:

 

Xong, các bạn từ từ khám phá nha. Hẹn gặp lại!

Read More

Restful là gì? Tạo restful api với Laravel 5

Dạo gần đây, tui có build một số RESTful web service (đại khái là tạo một tập hợp các api) để cho một số ứng dụng khác kết nối vào. Nhân tiện, tui sẽ viết một số bài về việc sử dụng Laravel (version lúc đang viết là 5.6) để tạo RESTful api. Kiến thức của tui có bao nhiêu, tui sẽ viết ra bấy nhiêu, mong là giúp được ít nhiều cho các bạn. Vậy Restful là gì? Xem tiếp nào!

Laravel cũng có một framework dạng rút gọn chỉ để làm RESTful, đó là lumen

1. RESTful là gì?

Trước khi viết RESTful api, thì chúng ta cũng cần hiểu cái chữ REST nó là gì để nếu các bạn có đi phỏng vấn xin việc mà bị người ta hỏi thì cũng biết đường mà trả lời.

REST là viết tắt của cụm từ: Respresentational State Transfer. REST dựa vào các verb của HTTP (GET, POST, PUT, DELETE, PATCH, OPTIONS) để truyền và nhận dữ liệu giữa Client và Server. Cùng một url (ví dụ: http://my-domain.com/api/user) hay còn gọi là endpoint, nhưng với GET thì ta có một endpoint, với POST ta lại có một endpoint khác (khác ở đây có nghĩa là cách xử lý và trả dữ liệu về cho client), điều này giúp chúng ta thuận tiện hơn trong việc quản lý các endpoint này, dễ chỉnh sửa và thay đổi hơn so với dùng SOAP.

Đối với một trang web bình thường (ví dụ như là wordpress chẳng hạn), khi web browser gửi một request thông qua cái url như trên thì Server sẽ xử lý và trả về một trang HTML, sau đó web browser nhận và hiển thị trang HTML này ra

Còn đối với RESTful thì client có thể là Web Browser hoặc cũng có thể là một Mobile App, thậm chí là một Web Service khác, thì dữ liệu truyền nhận qua lại chủ yếu là JSON.

Cuối cùng, một điều cần lưu ý là, mối quan hệ giữ Client và Server lúc này là Stateless, có nghĩa là Server không cần biết Client là ai, Server cũng không cần phải lưu session đối với client giống như website “truyền thống”. Server lúc này chỉ cần biết là: à, có một request tới và thỏa một số điều kiện của mình (cần access token chẳng hạn), và mình xử lý và trả dữ liệu cho Client thôi, chấm hết, không day dưa  Happy-Grin

2. Tạo Laravel project:

Trong phạm vi bài này, tui không hướng dẫn chi tiết cái Laravel ra sao nha, chỉ làm nhanh gọn các lệnh thôi sau đó review qua cái cấu trúc thư mục để viết Restful.

Tạo Laravel project:

Đứng ngay thư mục <learn-restful>, tạo app key:

Xong xuôi, các bạn sẽ có cây thư mục như thế này:

Laravel có cung cấp cho chúng ta một cái Web Server nho nhỏ, vừa đủ để test, không cần phải cái Apache luôn. Thử coi cái project có chạy ổn không, ngay tại thư mục <learn-restful> các bạn gõ lệnh:

Sau đó, mở Web Browser lên, gõ: http://localhost:9000 hoặc http://127.0.0.1:9000 xem coi có thấy chữ Laravel to đùng hiện ra không, nếu có thì coi như ta setup project ổn.

Nếu chạy lệnh trên mà không có tham số –port=9000, thì mặc định Server nó sẽ listen ở port 8000

3. Tạo endpoint cho Restful:

Cũng giống như làm web, chúng ta cũng cần phải tạo một cái route để làm endpoint. Trong thư mục routes, các bạn thấy các file sau:

Ở đây chúng ta đang bàn luận về Restful, nên chỉ chú ý đến file api.php thôi, đây là file chứa tất cả các endpoint dùng để xử lý các request từ client. Mở file api.php lên, các bạn thấy nội dung như sau:

Khoan hãy quan tâm đến 3 dòng code từ 16-18, chúng ta sẽ bàn sau. Các bạn chú ý là để nhận request từ client, các bạn phải import thư viện Illuminate\Http\Request nhé bằng từ khóa use

Tới đây, tui muốn tạo một url endpoint như sau: http://localhost:9000/api/hello-world, thì Server sẽ trả về nội dung là “Hello World! Welcome to codingpearls.com”. Mở file api.php, thêm đoạn code như sau:

Hàm Route::get(), có nghĩa là Server sẽ xử lý endpoint này với HTTP verb là GET. tham số thứ nhất chính là url (tạm gọi là part endpoint), tham số thứ 2 chính là một callback function xử lý tương ứng với enpoint này.

Chú ý, các bạn có thấy phân cách giữa domain hoặc subdomain với “hello-world” là chữ “api” không? Tại sao chúng ta không có gõ chữ “api” này trong cái endpoint mà trong cái url lại có. Đáng lẽ phải gõ endpoint là “/api/hello-world” mới đúng chứ? Ở đây các bạn có thể hiểu api chính là prefix của cái endpoint “hello-world”. Giả sử chúng ta có 10 cái endpoint, chẳng lẽ chúng ta lại phãi gõ chữ “api” 10 lần cho 10 cái endpoint à? Kiểu như vầy

Route::get(‘/api/hello-world’, function…)
Route::get(‘/api/hello-world1’, function…)
Route::get(‘/api/hello-world2’, function…)
Route::get(‘/api/hello-world3’, function…)

Để thuận tiện, Laravel mới tạo cái prefix là “api” để cho thuận tiện trong việc viết code, cũng như sửa prefix endpoint, và cái prefix này ở đâu? nó nằm trong file app\Providers\RouteServiceProvider.php.

Mở file này lên, tìm đến hàm mapApiRoutes():

Chính nó, hàm Route::prefix(‘api’), các bạn thử đổi chữ “api” thành chữ khác, ví dụ: “rest-api” chẳng hạn, xong gõ lại cái url là http://localhost:9000/rest-api/hello-world xem sao nhé.

Với Web browser, chúng ta không thể test được với các HTTP verb khác như POST, PUT, DELETE chẳng hạn. Do đó, chúng ta sẽ sử dụng cái app của Chrome là Postman để làm client. Các bạn search bằng từ khóa “chrome postman” rồi cài cái app này vào trình duyệt Chrome nhé. Và sau này sẽ dùng Postman là chính để test cái url endpoint.

Đây là giao diện của Postman:

Bài đầu tiên về RESTful đến đây là kết thúc, hẹn các bạn trong các bài kế tiếp để tìm hiểu sâu hơn về cách login, tạo token, cách sử dụng middleware để verify token, cách nhận json data từ client ..v.v.  Bye

Read More

Tạo Authentication cho module Backend và Frontend trong Laravel 5

Cũng lâu lắm rồi mới có thời gian viết bài mới. Hôm nay, tui sẽ trình bày cách để tạo authentication cho từng module Frontend và Backend. Ở đây tui sẽ mặc định là chúng ta đã tạo 2 module là Frontend và Backend nhé (các bạn có thể xem tại đây).

1. Cấu trúc thư mục:

Giả sử tui có một project tên rubik có các thư mục module BackendFrontend như sau:

2. Database để login:

Để login, giả sử tui có 2 table là usercustomer ở dưới database tương ứng để login ở BackendFrontend như sau:

Database script để tạo 2 table này:

Mỗi table có sẵn 1 account để tí nữa test login

  • alibaba@gmail.com/112233 (user)
  • aladin@gmail.com/123123 (customer)

Các bạn cần tạo model tương ứng cho 2 table trên. Tại thư mục framework/app, các bạn tạo một thư mục tên là Models, trong thư mục Models này, các bạn tạo 2 file model lần lượt là User.phpCustomer.php

Thêm namespace App\Models và file composer.json ở phần psr-4

Bậy giờ các bạn viết phần nội dung cho 2 file User.phpCustomer.php. Có 2 cách:

Một là các bạn extends cái class Illuminate\Foundation\Auth\User có sẵn của nó (xem cái file app/User.php có sẵn thì nó làm theo cách này). Hai là các bạn tự viết lại. Ở đây tui sẽ dùng 2 cách cho 2 file Models/User.phpModels/Customer.php

Models/User.php:

Models/Customer.php:

Kết nối database:

Các bạn mở file framework/.env, edit các biến sau:

Tùy theo username, password của mysql của các bạn là gì thì ghi vô cho đúng nha.

Nếu các bạn có dùng prefix khi tạo table giống tui, thì các bạn mở file config/database.php, tìm cái phần mysql trong mục connections, edit lại phần prefix:

3. Tạo Authentication Provider và Guard:

Trong Laravel 5.4, cơ chế login là dựa trên provider. Mỗi provider sẽ tương ứng với một Model. Ở đây ta có 2 Model là User và Customer dùng để login ở Backend và Frontend, vậy ta cần có 2 provider.

Để sử dụng Provider này trong Controller, Middleware hoặc View, ta cần tạo Guard. Mỗi Guard sẽ ứng với một Provider, 2 Guard khác nhau có thể dùng cùng 1 Provider.

Các bạn mở file framework/config/auth.php

Tìm mục providers, bạn sẽ thấy nó có 1 sẵn cái provider là users, kệ nó, mình thêm vào 2 cái của mình là admincustomer (đặt tên là gì cũng được, đây là key của array):

Có Provider rồi, các bạn tìm cái phần guards (cũng trong file framework/config/auth.php), nó có sẵn 2 cái guard là web và api, cũng kệ nó luôn, tạo 2 cái guard tên là admincustomer (đặt tên gì cũng được, không nhất thiết phải giống với Provider):

Các bạn chú ý là ở phần providers các bạn đặt tên là gì thì ở phần guards, trong cái phần provider thì các bạn ghi đúng cái tên đó nha.

4. Tạo trang login và AuthController:

Sau khi có Provider và Guard rồi, chúng ta làm trang login. Do phần login ở Backend và Frontend đều như nhau, chỉ khác nhau là dùng guard nào thôi, cho nên tui sẽ làm phần Backend, còn phần Frontend thì tương tự nhé

4.1. Tạo view cho trang login:

Tại thư mục Backend/Views, tạo thư mục admin.

Trong thư mục Backend/Views/admin, tạo file login.blade.php:

4.2. Tạo AuthController:

Tại thư mục Backend/Controllers, tạo file AuthController.php:

Chú ý hàm getLogin sẽ trả về giao diện là trang login

Để khi gõ url: http://localhost:8080/learning/rubik/admin/login, cái Route nó hiểu và gọi hàm getLogin của AuthController thì chúng ta phải edit lại cái file Backend/routes.php như sau:

Chú ý cái parameter của hàm group: ‘namespace’ => ‘App\Modules\Backend\Controllers’. Nếu không dùng cái parameter này thì ngay chổ phần gọi hàm của controller, các bạn phải viết đầy đủ namespace như vầy:

Giờ mà các bạn gõ url http://localhost:8080/learning/rubik/admin/login mà nó ra như sau là ok:

4.3. Xử lý phần validate email và password:

Thêm hàm postLogingetLogout vào file Backend/Controllers/AuthController.php:

Edit lại file Backend/routes.php, thêm 2 cái Route cho validate login và logout:

Giờ nếu các bạn click nút “Login” thì nó sẽ báo lỗi (1/1) TokenMismatchException, lý do là Laravel nó sẽ kiểm tra cái token mỗi khi bạn thực hiện một POST request để tránh trường hợp bị cái lỗi Flood Post.

Để thêm cái token, các bạn edit trang Backend/Views/login.blade.php như sau:

Test thôi,

Không ghi email, password gì cả, click “Login” mà nó báo lỗi là ok:

Nhập email: alibaba@gmail.com, password: 112233 mà nó vào được trang Hello Backend có cái link Logout là ok luôn.

Đó là phần login cho Backend, tương tự cho phần Frontend, các bạn gọi cái guard là customer thay cho cái guard admin. Nhớ là cái namespace của Frontend là App\Modules\Frontend\Controllers, chổ nào là Backend thì thay bằng Frontend.

Tại thư mục Frontend/Controllers, tạo file AuthController.php:

Tại thư mục Frontend/Views, tạo thư mục customer.

Trong thư mục Frontend/Views/customer, tạo file login.blade.php:

Edit lại file Frontend/routes.php, thêm 2 cái Route cho validate login và logout:

Nhập email: aladin@gmail.com, password: 123123 để test như phần Backend.

Tới đây, có một vấn đề là nếu bạn không login, thì bạn vẫn vào được trang Hello Backend. Đó là do chúng ta chưa validate được là user đã login hay chưa. Để làm việc này, chúng ta phải dùng Middleware.

5. Tạo Authentication Middleware:

Trong Laravel 5, middleware đóng vai trò là bộ lọc (filter) các request, các bạn tưởng tượng nó như các lớp của củ hành tây vậy. Các request phải “xuyên qua” hết các lớp này thì mới thực thi các callback function của Route hay Controller tương ứng. Do đó ta cũng áp dụng cơ chế này để validate xem user đã login chưa?

  • Nếu login rồi thì thôi, tiếp tục thực hiện.
  • Chưa login, cho về lại trang login

Chúng ta có thể dùng một Middleware cho 2 Module Backend và Frontend, nhưng như thế thì khó quản lý code lắm. Cho nên tui sẽ làm 2 cái Middleware tương ứng cho 2 module Backend và Frontend

5.1. Tạo Middleware cho Backend và Frontend:

Tại thư mục Modules/Backend/Middleware, tạo file AdminAuthentication.php:

Tại thư mục Modules/Frontend/Middleware, tạo file CustomerAuthentication.php:

các bạn chú ý cái namespace App\Modules\Backend\MiddlewareApp\Modules\Frontend\Middleware cũng như 2 cái guard là admincustomer nha.

Để Laravel nó chạy 2 cái Middleware này, các bạn mở file app\Http\Kernel.php, tìm cái biến array $routeMiddleware, thêm vào cuối array này 2 dòng như sau:

Cái hàm xử lý chính trong việc kiểm tra là đã login hay chưa là hàm:

nếu đã login thì thôi, tiếp tục. Còn nếu chưa login thì phần xử lý này nó nằm trong file app/Exceptions/Handler.php, hàm unauthenticated như sau:

Nếu để vậy nó không chạy đâu, các bạn sửa lại tí:

Đổi dòng

thành

Cuối cùng, để dùng 2 cái middleware admin_authcustomer_auth, thì các bạn có thể gọi hàm middleware của Route như sau:

Mở file Backend/routes.php:

thêm hàm middleware vào sau hàm get:

hoặc vào trước hàm get;

Test thôi! Logout nếu đang ở trang Hello Backend. Thử gõ url http://localhost:8080/learning/rubik/admin thì nó sẽ redirect về trang login. Làm tương tự cho file Frontend/routes.php và dùng middleware là customer_auth.

Ngoài ra, nếu cái Route của các bạn gọi hàm của Controller thì các bạn có thể gọi middleware trực tiếp trong Controller luôn và gọi ở hàm __construct(), không cần gọi hàm middleware của Route như trên nữa.

Ví dụ, tui có DashboardController trong Backend:

Trên đây là những gì tui biết về phần Authentication trong Laravel 5, tuy bài viết hơi dài, nhưng các phần đều có liên quan với nhau. Hi vọng là bài này sẽ giúp giải đáp phần nào thắc mắc của các bạn về phần Authentication.  THANK-YOU

Read More

Tạo module Backend và Frontend trong Laravel 5

Xem bài viết version 2

Lúc trước trong series “Xây dựng website QUIZ“, tui có hướng dẫn tạo module. Hôm nay tui sẽ viết lại cái phần tạo module cho Laravel 5.4 thành một bài dạng tips để cho mọi người tiện tham khảo. Bắt đầu nào!

1. Tạo project và các thư mục:

Giả sử, thư mục WEB_ROOT cho project này hiện lại là E:\Server\www\learning:

Tại thư mục WEB_ROOT:

Sau khi tạo xong (không nhất thiết là đặt cái tên là framework nha các bạn, đặt tên gì cũng được), các bạn sẽ có cây thư mục như sau:

Copy các file và thư mục trong thư mục framework/public ra ngoài thư mục rubik như sau:

Mở file rubik/index.php lên,  tim đến 2 dòng sau:

và thay dấu “..” thành tên thư mục “framework” như sau:

Đó là phần Frontend, tiếp theo cũng trong thư mục rubik, tạo thư mục tên là admin cho phần Backend và cũng copy tất cả các file và thư mục trong framework/public vào thư mục admin này:

Mở file admin/index.php lên, tìm 2 dòng sau:

và edit lại như sau:

Do chúng ta copy các file này từ thư mục framework/public ra bên ngoài, cho nên mục đích của việc edit 2 file index.php này là để dẫn lại đường dẫn cho đúng.

Tiếp, chúng ta phải override lại cái hàm public_path(), lý do là ta đã sửa cái thư mục public mặc định thành thư mục gốc rồi. Mở file app\Providers\AppServiceProvider.php, thêm như sau:

Khi gọi hàm helper puclic_path(), các bạn sẽ thấy nó trả về cái thư mục gốc chứa file index.php.

Nếu thử gõ 2 cái url: http://localhost:8080/learning/rubik và http://localhost:8080/learning/rubik/admin mà hiện ra như sau là ổn:

Sau khi tạo xong, các bạn nên xóa cái thư mục framework/public đi, hoặc khi upload source code lên host thì không cần upload thư mục framework/public này.

2. Tạo module Backend và Frontend:

Trước tiên, tại thư mục framework/app, chúng ta tạo thư mục Modules với các thư mục con và file tương ứng như sau:

Sau đó, tại thư mục framework/config, chúng ta tao một file tên là module.php:

Nội dung cho file config/module.php như sau:

Mục đích của việc tạo file config/module.php là để kiểm tra cái url khi nào là vào frontend hoặc backend để điều hướng xửa lý vào các thư mục chứa code tương ứng trong Modules/Backend hay Modules/Frontend.

Để làm việc này, ta phải viết code cho file Modules/ModuleServiceProvider.php như sau:

Để Laravel nó load được cái file ModuleServiceProvider.php này, các bạn mở file framework/config/app.php lên, tìm đến phần array providers (dòng 138), và thêm vào cuối array này dòng App\Modules\ModuleServiceProvider::class

Để cho chắc chắn rằng Laravel 5 nó hiểu cái namespace App\Modules, chúng ta mở file framework/composer.json, tìm đến mục psr-4 nằm trong mục autoload:

Thêm như sau:

3. Xử lý route url cho từng module:

Phần trước, chúng ta đã tạo file routes.php tương ứng cho từng module Backend và Frontend. Bây giờ, trong mỗi file routes.php này, chúng ta sẽ tạo các Route để xem cái ModuleServiceProvider.php nó có thực hiện đúng hay không nha.

Nếu url là http://localhost:8080/learning/rubik thì sẽ in ra câu “Hello Frontend”

Nếu url là http://localhost:8080/learning/rubik/admin thì sẽ in ra câu “Hello Backend”

Nhưng trước hết là chúng ta phải bỏ cái Route xử lý hiển thị cái view mặc định hiển thị chữ “Laravel” to đùng như ở trên đã. Các bạn mở file framework/routes/web.php lên:

và xóa hoặc comment lại cái Route xử lý trang welcome:

Xong, tiếp theo là code cho 2 file routes.php nha

Backend/routes.php

Frontend/routes.php

Thử nào:

  • Url là http://localhost:8080/learning/rubik thì sẽ in ra câu “Hello Frontend”.
  • Url là http://localhost:8080/learning/rubik/admin thì sẽ in ra câu “Hello Backend”.

Nếu hiển thị đúng như vậy thì cái file Modules/ModuleServiceProvider.php nó đã được load và xử đúng. Tui làm được thì các bạn cũng làm được.  THANK-YOU

 

Read More

Bài 05 – Backend: Xây dựng trang login

Chào các bạn. Hôm nay tui trở lại với series Xây dựng hệ thống làm trắc nghiệm Quiz. Hiện tại, version mới nhất của Laravel là 5.4, cho nên từ bài này trở đi, tui sẽ làm trên version 5.4 luôn nha. Các bài trước thì lúc đó Laravel vẫn còn là 5.2 nhưng nó không có khác biệt gì lắm đâu, những thao tác của các bài trước làm trên 5.2 thì vẫn có thể làm được trên 5.4. Vậy thống nhất là dùng version 5.4 nha các bạn.

Bài hôm nay sẽ hướng dẫn các bạn tạo một trang login cho module backend, Nói thì nghe dê lắm luôn, nhưng các bạn phải làm các việc sau:

  • Tạo cái User model (đã tạo ở bài trước rồi hen).
  • Tạo cái view cho trang login.
  • Tạo cái Controller để hiển thì trang login, logout.
  • Tạo cái Middleware để kiểm tra xem nếu user chưa login thì sao, mà login rồi thì sao.

Sơ sơ là 4 cái việc như vậy, tiểu tiết thì nhiều. Nhưng trước khi làm, tui muốn update cái phần ModuleServiceProvider tạo ở bài 02 để các bạn nếu có dùng subdomain cho phần admin (ví dụ: admin.mywebsite.com) thì vẫn đáp ứng được. (more…)

Read More

Các loại toán tử trong PHP 5

Hi, Cũng lâu lắm rồi mới quay trở lại series bài trong PHP 5. Hôm nay tui sẽ giới thiệu tiếp với các bạn bài viết về toán tử trong PHP 5. Đã là làm việc với máy tính thì phải biết tính toán chứ đứng không các bạn. Rồi, vậy hôm nay chúng ta sẽ xem coi trong PHP có bao nhiêu loại toán tử nha.

Để có cái nhìn tổng quát, tui sẽ list ra một mớ các nhóm toán tử này như sau:

  1. Toán tử số học – Arithmetic Operators (là các phép toán đơn giản cộng, trừ, nhân, chia đó các bạn)
  2. Toán tử so sánh – Comparison Operators
  3. Toán tử logic – Logical Operators
  4. Toán tử logic trên bit – Bitwise Operators
  5. Toán tử dịch chuyển bit – Shift Operators
  6. Toán tử tự động tăng hoặc giảm – Auto Increment or Decrement Operators
  7. Toán tử gán – Assignment Operators
  8. Toán tử điều kiện – Conditional Operator
  9. Toán tử nối chuỗi – String Concatenation Operator

Trên đây là các loại toán tử của PHP, chúng ta xem xét từng loại nha. (more…)

Read More

Bài 04 – Config database và tạo các Model tương ứng với các table

Hello! Ở bài trước chúng ta đã phân tích và thiết kế databse cho Quiz. Hôm nay có thời gian rãnh, tui sẽ đi vào phần tạo các file model cho table. Ở phần này tui sẽ tạo thêm một table mới tên là vl_user dùng để đăng nhập vào phần Backend để chuẩn bị cho bài kế tiếp là tạo trang login cho Backend.

1. Cấu hình kết nối database:

Trước khi tạo table mới và viết trang login. Tui sẽ làm một việc đó là cấu hình cho laravel 5 nó kết nối được với cái database. Ở đây, các thông số về database của tui như sau:

(more…)

Read More