Tạo controller trong Magento 2

Controller là 1 thành phần quan trọng khi phát triển module trên Magento 2, hoặc trên 1 PHP MVC Framework. Nó là nơi nhận các requests, xử lý và hiển thị kết quả lên website.

Trong Magento 2, 1 module có thể có nhiều controller trong thư mục Controller, các controller chứa các action trong class và method execute(). Magento 2 có 2 loại controller, đó là frontend controller (xử lý bên ngoài frontend) và backend controller (xử lý bên trong backend). Về cách thức hoạt động thì 2 controller này hoàn toàn giống nhau, chỉ khác nhau 1 chút đó là backend controller có kiểm tra phân quyền khi xử lý request.

Controller trong Magento 2 hoạt động ra sao?

Nhiệm vụ của controller là nhận request từ end-user (người dùng web hoặc từ command line của Magento). Dưới đây là đường dẫn URL thường thấy của 1 Magento 2 controller

Trong đó:

route_name là tên của route (và tên này là duy nhất không trùng lặp) được đặt trong routes.xml
controller là tên thư mục con nằm trong thư mục Controller
action là tên class với method execute để xử lý request.

Tạo controller trong Magento 2 như thế nào?

Để tạo controller, chúng ta cần tạo thư mục con trong thư mục Controller của module, sau đó tạo thêm 1 file action class trong thư mục con đó. Trong bài viết này, chúng ta sẽ tạo controller Test với action class là Hello cho module Laptrinhinfo_HelloWorld.

Bước 1: Tạo routes.xml

etc/frontend/routes.xml

Bước 2: Tạo file controller

Controller/Index/Index.php

Như bạn đã thấy, các file controller đều kế thừa class \Magento\Framework\App\Action\Action và sẽ gọi phương thức execute. Và chúng ta sẽ viết logic code trong đó trước khi trả lại kết quả.

Bước 3: Tạo file layout

view/frontend/layout/helloworld_index_index.xml

Bước 4: Tạo file template

view/frontend/templates/index/index.phtml

Bước 5: Flush cache 

Bước 6: Test lại

Bạn có thể kiểm tra xem controller đã hoạt động đúng chưa bằng cách truy cập vào

hoặc

Các phương thức (method) khác trên Magento 2 controller

Ngoài execute, class \Magento\Framework\App\Action\Action còn cung cấp cho chúng ta 2 phương thức khác cũng quan trọng không kém đó là _forward_redirect

Phương thức _forward

Phương thức sẽ chuyển phần xử lý cho 1 action class khác mà không làm thay đổi đường dẫn request URL. Ví dụ chúng ta có 2 action class là Forward và Hello với nội dung class Forward là

Khi chúng ta truy cập vào http://example.com/route_name/test/forward thì kết quả xử lý từ class Hello sẽ hiển thị trên trình duyệt. Ngoài tên action class, bạn có thể chỉ định tên controller, tên module, và tham số truyền thêm vào trong phương thức _forward. Dưới đây là source code của phương thức _forward trong Magento 2

Phương thức _redirect

Phương thức này sẽ chuyển hướng đường dẫn URL sang 1 action class khác, và đương nhiên kết quả trả về sẽ là của action class được điều hướng đến. Chúng ta có thể kiểm tra bằng cách thay phương thức _forward bằng _redirect

Kết quả là khi bạn truy cập vào http://example.com/route_name/test/forward , trình duyệt sẽ chuyển hướng bạn đến http://example.com/route_name/test/hello và hiển thị kết quả của action class Hello.