How to create a new module in Zend Framework 3 (Part II)
Bài đăng này đã không được cập nhật trong 5 năm
Trong bài viết trước mình đã giới thiệu cơ bản về zend và cách cài đặt, trong bài viết này mình hướng dẫn cách tạo ra một module mới trong zend
Zend-mvc sử dụng một hệ thống module riêng để tổ chức các source code
Trong ứng dụng zend Skeleton đã cài đặt sẵn một module là Application. Nó được sử dụng để cung cấp sẵn bootstrapping, error và routing configuration cho toàn bộ ứng dụng và thường được sử dụng để cung cấp các controller mức độ ứng dụng cho trang chủ hệ thống.
1. Cài đặt một Blog Module
- Đầu tiên tạo ra một thư mục Blog như cấu trúc bên dưới :
Zend_Demo/
/module
/Blog
/config
/src
/Controller
/Form
/Model
/view
/blog
/blog
- Trong đó :
- config: sẽ chứa các file config cho module
- src : sẽ chứa các controller, model, form, repository,...
- view : sẽ chứa các file giao diện của module
- Tạo ra một Module class trong folder src.
//Blog/src/Module.php
namespace Blog;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
}
- Để load và config một mô-đun, Zend Framework cung cấp một
ModuleManager
.ModuleManager
sẽ tự động gọi functiongetConfig()
- Trong
getConfig()
sẽ gọi đến file config.php trongBlog/config/module.config.php
, file này dùng để cấu hình cho module ,sẽ được viết sau.
2. Autoloading
- Mặc dù Zend Framework cung cấp khả năng autoloading thông qua zend-loader component, nhưng bạn nên sử dụng khả năng autoloading của Composer. Như vậy, chúng ta cần thông báo cho Composer về new namespace và where its files live.
- Mở file composer.js trong thư mục gốc của dự án và tìm đến phần "autoload" . Mặc định ở đây đã khai báo Application module, chúng ta sẽ thêm blog module vào :
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Blog\\": "module/Blog/src/" //Thêm ở đây
}
},
- Trong thư mục config của dự án mở file modules.config.php và thêm vào tên module
// config/mdules.config.php
return [
'Zend\Form',
'Zend\Db',
'Zend\Router',
'Zend\Validator',
'Application',
'Blog',//Thêm ở đây
];
- Zend Framework cung cấp một
ModuleManager
. Nó sẽ tìm kiếm tên module được khai báo trong file config/modules.config.php của ứng dụng, sau đó vào module để tìm fileModule.php
- Trong trường hợp ở đây tên module chính là Blog và nó sẽ tìm kiếm file
Module.php
trongmodule/Blog/src/
. - Sau khi thêm xong chạy câu lệnh
composer dump-autoload
để tự động cập nhập các module.
3. Configuration
- Tạo ra file
Blog/src/Controller/BlogController.php
<?php
namespace Blog\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class BlogController extends AbstractActionController
{
public function indexAction()
{
return new ViewModel();
}
}
Tạo ra file view Blog/view/blog/blog/index.phtml
<h1>Hello My First Application</h1>
- Tạo ra file
Blog/config/module.config.php
, như đã nói ở trên file này dùng để cấu hình cho module:
<?php
namespace Blog;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'router' => [
'routes' => [
'blog' => [
'type' => Literal::class,
'options' => [
'route' => '/blog',
'defaults' => [
'controller' => Controller\BlogController::class,
'action' => 'index',
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\BlogController::class => InvokableFactory::class,
],
],
'view_manager' => [
'template_path_stack' => [
__DIR__ . '/../view',
],
],
];
-
Trong file này sẽ khai báo các router, controller, view, service manager,.. mà module sử dụng.
-
Mình sẽ nói qua về các phần có ở trên:
- 'router' : Ở đây sẽ khai báo tên router, có 2 kiểu router hay dùng phổ biến nhất là
Literal
(đường dẫn tuyệt đối) vàSegment
(đường dẫn tương đối). Ngoài ra còn một số kiểu khác như : Regex, Hostname, Scheme, Method.- Trong router cũng sẽ xác định controller nào sẽ được sử dụng, ở đây là
BlogController.php
- Các 'action' ở đây khai báo tên function sẽ được thực thi khi route chạy.
- Trong router cũng sẽ xác định controller nào sẽ được sử dụng, ở đây là
- 'controller' : Đăng ký controller với hệ thống . Có 2 cách để đăng ký controller:
- Đăng ký controller với InvokableFactory: Trong ZF có lớp
Zend\ServiceManager\Factory\InvokableFactory
được dùng để khởi tạo đối tượng lớp (theo mô hình lập trình factory) . Trong vd trên là đăng ký controller có sử dụng InvokableFactory. - Đăng ký với một lớp Factory tự xây dựng : Cái này được sử dụng trong trường hợp bạn muốn trước khi controller được tạo bạn thi hành một số tác vụ khác trước đã. Lúc này bạn cần xây dựng một lớp khởi tạo (Factory riêng), và đăng ký controller theo factory đó. Cái này mình sẽ nói rõ hơn trong phần service manager
- Đăng ký controller với InvokableFactory: Trong ZF có lớp
- 'view_manager' : Khai báo các view sẽ sử dụng cho module. Trong zend mặc định view sẽ được gọi theo đường dẫn như này :
/view/namemodule/namecontroller/nameaction.phtml
. Nếu muốn custom, chỉ định các đường dẫn thì có thể khai báo thêm trong 'view_manage'. Vd như trong file config của Application module :
'view_manager' => [ 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => [ 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ], 'template_path_stack' => [ __DIR__ . '/../view', ],
- 'router' : Ở đây sẽ khai báo tên router, có 2 kiểu router hay dùng phổ biến nhất là
-
Ngoài ra trong file config còn cấu hình thêm nhiều thành phần khác nữa, tùy vào nhu cầu sử dụng.
-
Khi chạy
http://localhost:8080/blog
sẽ được kết quả như này :
Kết luận
- Trong bài viết này mình đã tạo ra một module mới và chạy, trong các bài viết tiếp theo mình sẽ tìm hiểu về service manager. Thank you for reading ^^
- Tham khảo:
All rights reserved