Tạo và Chạy Dự Án Zend Framework
Zend Framework là gì?
Zend Framework là một khung PHP mã nguồn mở, cung cấp một tập hợp các thư viện hướng đối tượng để xây dựng các ứng dụng và dịch vụ web hiện đại. Nó nổi tiếng với thiết kế mô-đun và hiệu suất cao, phù hợp cho việc xây dựng từ các ứng dụng nhỏ đến các ứng dụng doanh nghiệp lớn.
Các tính năng và ưu điểm của Zend Framework
- Thiết kế mô-đun: Zend Framework sử dụng thiết kế mô-đun, cho phép nhà phát triển chọn và sử dụng các thành phần theo nhu cầu.
- Hiệu suất cao: Với kiến trúc tối ưu và cơ chế cache, Zend Framework cung cấp hiệu suất vượt trội.
- Linh hoạt: Có thể tích hợp nhiều thư viện và mở rộng bên thứ ba, phù hợp với các dự án có quy mô khác nhau.
- Hỗ trợ cộng đồng: Có cộng đồng nhà phát triển lớn và hệ sinh thái phong phú.
- Tài liệu tốt: Cung cấp tài liệu và hướng dẫn chi tiết, giúp nhà phát triển nhanh chóng nắm bắt.
Zend Framework phù hợp để xây dựng các ứng dụng web và API chất lượng cao, hữu ích từ các dự án nhỏ đến các hệ thống doanh nghiệp lớn.
Sử dụng ServBay để Tạo và Chạy Dự Án Zend Framework
Trong bài viết này, chúng ta sẽ sử dụng môi trường PHP của ServBay để tạo và chạy một dự án Zend Framework. Chúng ta sẽ sử dụng chức năng 'host' của ServBay để thiết lập một máy chủ web và thực hiện cấu hình đơn giản để truy cập dự án.
Lưu ý: Nếu bạn đã từng là người dùng NGINX hoặc Apache
ServBay sử dụng Caddy làm máy chủ web mặc định. Đối với những người dùng chuyển từ NGINX và Apache sang ServBay, có một số thay đổi quan trọng cần lưu ý:
Cấu hình Caddy
ServBay đã tích hợp sẵn Caddy và cấu hình mặc định đã được tối ưu và kiểm tra. Nhà phát triển chỉ cần sử dụng chức năng 'host' của ServBay để quản lý các trang web, không cần phải tự chỉnh sửa tệp cấu hình Caddy.
Quy tắc Rewrite và .htaccess
Trong NGINX và Apache, nhà phát triển thường cần tự viết các quy tắc Rewrite và tệp .htaccess để xử lý URL rewriting và các cấu hình khác. Tuy nhiên, khi sử dụng ServBay, các quy tắc của Caddy đã được cấu hình sẵn, do đó nhà phát triển không cần tự viết các quy tắc này trừ khi có nhu cầu đặc biệt.
Tìm hiểu thêm
Để biết thêm thông tin, vui lòng tham khảo Rewrite và htaccess, Cách chuyển trang web Apache sang ServBay, Cách chuyển trang web NGINX sang ServBay.
Tạo Dự Án Zend Framework
TIP
ServBay khuyến nghị các nhà phát triển đặt trang web tại thư mục /Applications/ServBay/www
để dễ quản lý.
Cài đặt Composer
ServBay đã cài đặt sẵn Composer, không cần cài đặt riêng.
bashcd /Applications/ServBay/www mkdir servbay-zend-app cd servbay-zend-app composer create-project zendframework/skeleton-application .
1
2
3
4Chuyển vào thư mục dự án
Chuyển vào thư mục Zend Framework mới tạo:
bashcd /Applications/ServBay/www/servbay-zend-app
1
Cấu hình Khởi tạo
Cấu hình biến môi trường
Cấu hình thông tin kết nối cơ sở dữ liệu và các biến môi trường khác trong tệp
config/autoload/global.php
. Đảm bảo cấu hình đúng như sau:phpreturn [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9
Cấu hình Máy chủ Web
Sử dụng chức năng 'host' của ServBay để truy cập dự án Zend Framework với máy chủ web. Trong cài đặt 'host' của ServBay, thêm một trang mới:
- Tên:
My First Zend Dev Site
- Tên miền:
servbay-zend-test.local
- Loại trang web:
PHP
- Phiên bản PHP: chọn
8.3
- Thư mục gốc của trang web:
/Applications/ServBay/www/servbay-zend-app/public
Chi tiết các bước cài đặt, vui lòng tham khảo Thêm trang đầu tiên.
Thêm ví dụ mã
Thêm đoạn mã sau vào tệp module/Application/config/module.config.php
để xuất ra "Hello ServBay!":
return [
'router' => [
'routes' => [
'home' => [
'type' => 'Literal',
'options' => [
'route' => '/',
'defaults' => [
'controller' => 'Application\Controller\Index',
'action' => 'index',
],
],
],
],
],
'controllers' => [
'factories' => [
'Application\Controller\Index' => InvokableFactory::class,
],
],
'view_manager' => [
'template_path_stack' => [
__DIR__ . '/../view',
],
],
];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Thêm đoạn mã sau vào tệp module/Application/src/Controller/IndexController.php
:
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
return new ViewModel([
'message' => 'Hello ServBay!',
]);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
Thêm đoạn mã sau vào tệp module/Application/view/application/index/index.phtml
:
<?php echo $this->message; ?>
Truy cập trang web
Mở trình duyệt, truy cập https://servbay-zend-test.local
, bạn sẽ thấy trang web hiển thị Hello ServBay!
.
Ví dụ cơ sở dữ liệu NoSQL
Ví dụ Memcached
Cài đặt phần mở rộng Memcached
Trong ServBay, phần mở rộng Memcached đã được cài đặt sẵn, không cần cài đặt thêm.
Cấu hình Memcached
Thêm phụ thuộc Memcached vào tệp
composer.json
:json{ "require": { "laminas/laminas-cache-storage-adapter-memcached": "^2.0" } }
1
2
3
4
5Sau đó chạy
composer update
để cài đặt phụ thuộc.Cấu hình router
Thêm đoạn mã sau vào tệp
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'memcached' => [ 'type' => 'Literal', 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'memcached', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Sử dụng Memcached
Sử dụng bộ nhớ đệm trong controller:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; class IndexController extends AbstractActionController { public function memcachedAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], ], ], ]); $cacheKey = 'my_cache_key'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Memcached!'; $cache->setItem($cacheKey, $cachedData); } return new ViewModel([ 'message' => $cachedData, ]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34Thêm đoạn mã sau vào tệp
module/Application/view/application/index/memcached.phtml
:php<?php echo $this->message; ?>
1Mở trình duyệt, truy cập
https://servbay-zend-test.local/memcached
Ví dụ Redis
Cài đặt phần mở rộng Redis
Trong ServBay, phần mở rộng Redis đã được cài đặt sẵn, không cần cài đặt thêm.
Cấu hình Redis
Thêm phụ thuộc Redis vào tệp
composer.json
:json{ "require": { "laminas/laminas-cache-storage-adapter-redis": "^2.0" } }
1
2
3
4
5Sau đó chạy
composer update
để cài đặt phụ thuộc.Cấu hình router
Thêm đoạn mã sau vào tệp
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'redis' => [ 'type' => 'Literal', 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'redis', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Sử dụng Redis
Sử dụng bộ nhớ đệm trong controller:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; class IndexController extends AbstractActionController { public function redisAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, ], ], ], ]); $cacheKey = 'my_cache_key'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis!'; $cache->setItem($cacheKey, $cachedData); } return new ViewModel([ 'message' => $cachedData, ]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35Thêm đoạn mã sau vào tệp
module/Application/view/application/index/redis.phtml
:php<?php echo $this->message; ?>
1Mở trình duyệt, truy cập
https://servbay-zend-test.local/redis
Ví dụ cơ sở dữ liệu quan hệ
Tạo cấu trúc cơ sở dữ liệu và tệp di chuyển
Tạo tệp di chuyển
Sử dụng công cụ Migrations của Laminas để tạo tệp di chuyển:
bashcomposer require laminas/laminas-db
1Chỉnh sửa tệp di chuyển
Tạo tệp di chuyển mới trong thư mục
data/migrations
và chỉnh sửa để định nghĩa cấu trúc bảng cơ sở dữ liệu:phpuse Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class CreateUsersTable { public function up(Adapter $adapter) { $sql = new Sql($adapter); $create = $sql->createTable('users') ->addColumn('id', 'integer', ['auto_increment' => true]) ->addColumn('name', 'varchar', ['length' => 255]) ->addColumn('email', 'varchar', ['length' => 255, 'unique' => true]) ->addPrimaryKey('id'); $adapter->query( $sql->buildSqlString($create), Adapter::QUERY_MODE_EXECUTE ); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Chạy di chuyển
Chạy di chuyển thủ công để tạo bảng cơ sở dữ liệu:
php$adapter = new Adapter([ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ]); $migration = new CreateUsersTable(); $migration->up($adapter);
1
2
3
4
5
6
7
8
9
10
Ví dụ MySQL
Cấu hình MySQL
Cấu hình thông tin kết nối MySQL trong tệp
config/autoload/global.php
:phpreturn [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9Cấu hình router
Thêm đoạn mã sau vào tệp
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'mysql-add' => [ 'type' => 'Literal', 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => 'Literal', 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'mysql', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26Ghi dữ liệu người dùng
Ghi dữ liệu người dùng trong controller:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { protected $adapter; public function __construct(Adapter $adapter) { $this->adapter = $adapter; } public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay', 'email' => '[email protected]', ]); $this->adapter->query( $sql->buildSqlString($insert), Adapter::QUERY_MODE_EXECUTE ); return new ViewModel([ 'message' => 'User added', ]); } public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $result = $this->adapter->query( $sql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE ); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users), ]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55Thêm đoạn mã sau vào tệp
module/Application/view/application/index/mysql-add.phtml
:php<?php echo $this->message; ?>
1Thêm đoạn mã sau vào tệp
module/Application/view/application/index/mysql.phtml
:php<?php echo $this->users; ?>
1Mở trình duyệt, truy cập
https://servbay-zend-test.local/mysql-add
vàhttps://servbay-zend-test.local/mysql
Ví dụ PostgreSQL
Cấu hình PostgreSQL
Cấu hình thông tin kết nối PostgreSQL trong tệp
config/autoload/global.php
:phpreturn [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9Cấu hình router
Thêm đoạn mã sau vào tệp
module/Application/config/module.config.php
:phpreturn [ 'router' => [ 'routes' => [ 'pgsql-add' => [ 'type' => 'Literal', 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => 'Literal', 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'pgsql', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26Ghi dữ liệu người dùng
Ghi dữ liệu người dùng trong controller:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { protected $adapter; public function __construct(Adapter $adapter) { $this->adapter = $adapter; } public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay', 'email' => '[email protected]', ]); $this->adapter->query( $sql->buildSqlString($insert), Adapter::QUERY_MODE_EXECUTE ); return new ViewModel([ 'message' => 'User added
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32