# Tạo và Chạy một Dự án CakePHP
## CakePHP là gì?
CakePHP là một framework PHP mã nguồn mở được thiết kế để giúp các nhà phát triển xây dựng ứng dụng web nhanh chóng. Nó dựa trên kiến trúc MVC (Model-View-Controller) và cung cấp một bộ công cụ mạnh mẽ giúp đơn giản hóa các tác vụ phát triển thông thường như tương tác cơ sở dữ liệu, xử lý biểu mẫu, xác thực, và quản lý phiên làm việc.
## Các Tính năng Chính và Ưu điểm của CakePHP
- **Phát triển Nhanh Chóng**: Cung cấp các công cụ tạo mã phong phú giúp các nhà phát triển nhanh chóng tạo ra các cấu trúc mã thông thường.
- **ORM Linh Hoạt và Mạnh Mẽ**: Lớp ORM tích hợp đơn giản hóa các thao tác cơ sở dữ liệu.
- **Bảo Mật**: Các tính năng bảo mật tích hợp như xác thực đầu vào, bảo vệ CSRF, và ngăn chặn tiêm SQL.
- **Hỗ trợ Cộng đồng**: Cộng đồng hoạt động và hệ sinh thái plugin 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 các nhà phát triển bắt đầu nhanh chóng.
CakePHP phù hợp cho các dự án từ ứng dụng nhỏ đến hệ thống doanh nghiệp lớn, giúp các nhà phát triển nhanh chóng xây dựng các ứng dụng web chất lượng cao.
## Tạo và Chạy một Dự án CakePHP Sử dụng ServBay
Trong bài viết này, chúng ta sẽ sử dụng môi trường PHP do ServBay cung cấp để tạo và chạy một dự án CakePHP. Chúng ta sẽ sử dụng tính năng "Host" của ServBay để thiết lập một máy chủ web và cấu hình dự án để truy cập với các thiết lập đơn giản.
::: warning Lưu ý: Nếu Bạn Đã Sử dụng NGINX hoặc Apache Trước Đây
ServBay sử dụng Caddy làm máy chủ web mặc định. Có một số thay đổi quan trọng cần lưu ý cho người dùng chuyển từ NGINX và Apache sang ServBay:
1. **Cấu hình Caddy**
ServBay đi kèm với Caddy đã được cài đặt sẵn và cấu hình sẵn. Các nhà phát triển chỉ cần quản lý các trang web thông qua tính năng "Host" của ServBay mà không cần chỉnh sửa thủ công tệp cấu hình Caddy.
2. **Quy tắc Rewrite và .htaccess**
Trong NGINX và Apache, các nhà phát triển thường tự viết các quy tắc rewrite và tệp .htaccess để xử lý viết lại URL và các cấu hình khác. Tuy nhiên, ServBay đã cung cấp các quy tắc Caddy tối ưu hóa có sẵn, vì vậy các nhà phát triển không cần viết các quy tắc này trừ khi có yêu cầu đặc biệt.
3. **Tìm Hiểu Thêm**
Để biết thêm thông tin, tham khảo [Rewrite và htaccess](../../advanced-settings/rewrite-and-htaccess.md), [Cách Chuyển Một Website Apache sang ServBay](../../advanced-settings/migrate-apache-website-to-servbay.md), và [Cách Chuyển Một Website NGINX sang ServBay](../../advanced-settings/migrate-nginx-website-to-servbay.md).
:::
## Tạo một Dự án CakePHP
::: tip
ServBay khuyến nghị rằng các nhà phát triển đặt các trang web của họ vào thư mục `/Applications/ServBay/www` để dễ dàng quản lý.
:::
1. **Cài Đặt Composer**
ServBay đi kèm với [Composer đã cài đặt sẵn](../composer.md), vì vậy không cần cài đặt riêng.
2. **Tạo một Dự án CakePHP**
Sử dụng Composer để tạo một dự án CakePHP mới:
```bash
cd /Applications/ServBay/www
mkdir servbay-cakephp-app
cd servbay-cakephp-app
composer create-project --prefer-dist cakephp/app .
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
55
56
Truy Cập Thư Mục Dự Án
Điều hướng đến thư mục dự án CakePHP mới tạo:
bashcd /Applications/ServBay/www/servbay-cakephp-app
1
Cấu hình Ban Đầu
Cấu Hình Các 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/app_local.php
. Đảm bảo các thiết lập sau được cấu hình chính xác:php'Datasources' => [ 'default' => [ 'host' => '127.0.0.1', 'username' => 'root', 'password' => 'password', 'database' => 'servbay_cakephp_app', 'url' => env('DATABASE_URL', null), ], ],
1
2
3
4
5
6
7
8
9
Cấu hình Máy Chủ Web
Sử dụng tính năng "Host" của ServBay để truy cập dự án CakePHP thông qua máy chủ web. Trong các thiết lập Host của ServBay, thêm một host mới:
- Tên:
My First CakePHP Dev Site
- Tên Miền:
servbay-cakephp-test.local
- Loại Website:
PHP
- Phiên Bản PHP: Chọn
8.3
- Thư Mục Gốc Của Website:
/Applications/ServBay/www/servbay-cakephp-app/webroot
Để biết các bước thiết lập chi tiết, tham khảo Thêm Trang Web Đầu Tiên.
Thêm Mã Mẫu
Thêm mã sau vào tệp config/routes.php
để xuất "Hello ServBay!":
$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
Thêm mã sau vào tệp src/Controller/PagesController.php
:
namespace App\Controller;
use Cake\Http\Response;
class PagesController extends AppController
{
public function display()
{
return new Response(['body' => 'Hello ServBay!']);
}
}
2
3
4
5
6
7
8
9
10
11
Truy Cập Trang Web
Mở trình duyệt và truy cập https://servbay-cakephp-test.local
để xem trang hiển thị Hello ServBay!
.
Ví dụ với Cơ sở Dữ liệu NoSQL
Ví dụ Memcached
Cài Đặt Phần Mở Rộng Memcached
Phần mở rộng Memcached đã được cài đặt sẵn trong ServBay, vì vậy không cần cài đặt bổ sung.
Cấu Hình Memcached
Cấu hình thông tin kết nối Memcached trong tệp
config/app_local.php
:php'Cache' => [ 'default' => [ 'className' => 'Cake\Cache\Engine\MemcachedEngine', 'servers' => ['127.0.0.1'], ], ],
1
2
3
4
5
6Cấu Hình Đường Dẫn
Thêm mã sau vào tệp
config/routes.php
:php$routes->connect('/memcached', ['controller' => 'Pages', 'action' => 'memcached']);
1Sử Dụng Memcached
Sử dụng cache trong controller:
phpuse Cake\Cache\Cache; class PagesController extends AppController { public function memcached() { $cacheKey = 'my_cache_key'; $cachedData = Cache::read($cacheKey); if (!$cachedData) { $cachedData = 'Hello Memcached!'; Cache::write($cacheKey, $cachedData); } return new Response(['body' => $cachedData]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Mở trình duyệt và truy cập
https://servbay-cakephp-test.local/memcached
Ví dụ Redis
Cài Đặt Phần Mở Rộng Redis
Phần mở rộng Redis đã được cài đặt sẵn trong ServBay, vì vậy không cần cài đặt bổ sung.
Cấu Hình Redis
Cấu hình thông tin kết nối Redis trong tệp
config/app_local.php
:php'Cache' => [ 'default' => [ 'className' => 'Cake\Cache\Engine\RedisEngine', 'server' => '127.0.0.1', 'port' => 6379, ], ],
1
2
3
4
5
6
7Cấu Hình Đường Dẫn
Thêm mã sau vào tệp
config/routes.php
:php$routes->connect('/redis', ['controller' => 'Pages', 'action' => 'redis']);
1Sử Dụng Redis
Sử dụng cache trong controller:
phpuse Cake\Cache\Cache; class PagesController extends AppController { public function redis() { $cacheKey = 'my_cache_key'; $cachedData = Cache::read($cacheKey); if (!$cachedData) { $cachedData = 'Hello Redis!'; Cache::write($cacheKey, $cachedData); } return new Response(['body' => $cachedData]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Mở trình duyệt và truy cập
https://servbay-cakephp-test.local/redis
Ví dụ Cơ Sở Dữ Liệu Quan Hệ
Tạo Sơ Đồ Cơ Sở Dữ Liệu và Các Tệp Migration
Tạo Các Tệp Migration
Sử dụng công cụ Bake của CakePHP để tạo các tệp migration:
bashbin/cake bake migration CreateUsers name:string email:string:unique
1Chạy Migration
Sử dụng các lệnh của CakePHP để chạy các migration và tạo các bảng cơ sở dữ liệu:
bashbin/cake migrations migrate
1
Ví dụ MySQL
Cấu Hình MySQL
Cấu hình thông tin kết nối MySQL trong tệp
config/app_local.php
:php'Datasources' => [ 'default' => [ 'host' => '127.0.0.1', 'username' => 'root', 'password' => 'password', 'database' => 'servbay_cakephp_app', 'url' => env('DATABASE_URL', null), ], ],
1
2
3
4
5
6
7
8
9Cấu Hình Đường Dẫn
Thêm mã sau vào tệp
config/routes.php
:php$routes->connect('/mysql-add', ['controller' => 'Pages', 'action' => 'mysqlAdd']); $routes->connect('/mysql', ['controller' => 'Pages', 'action' => 'mysql']);
1
2Thêm Bảng Người Dùng
Thêm mã sau vào tệp
src/Model/Table/UsersTable.php
:php<?php namespace App\Model\Table; use Cake\ORM\Table; class UsersTable extends Table { }
1
2
3
4
5
6
7
8Thêm Dữ Liệu Người Dùng
Thêm dữ liệu người dùng vào controller:
phpuse App\Model\Entity\User; use Cake\ORM\TableRegistry; class PagesController extends AppController { public function mysqlAdd() { $usersTable = TableRegistry::getTableLocator()->get('Users'); $user = $usersTable->newEntity(['name' => 'ServBay', 'email' => '[email protected]']); if ($usersTable->save($user)) { return new Response(['body' => 'User added']); } return new Response(['body' => 'Failed to add user']); } public function mysql() { $usersTable = TableRegistry::getTableLocator()->get('Users'); $users = $usersTable->find()->all(); return new Response(['body' => 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
25Mở trình duyệt và truy cập
https://servbay-cakephp-test.local/mysql-add
vàhttps://servbay-cakephp-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/app_local.php
:php'Datasources' => [ 'default' => [ 'host' => '127.0.0.1', 'driver' => Postgres::Class, 'username' => 'root', 'password' => 'password', 'database' => 'servbay_cakephp_app', 'url' => env('DATABASE_URL', null), ], ],
1
2
3
4
5
6
7
8
9
10Cấu Hình Đường Dẫn
Thêm mã sau vào tệp
config/routes.php
:php$routes->connect('/pgsql-add', ['controller' => 'Pages', 'action' => 'pgsqlAdd']); $routes->connect('/pgsql', ['controller' => 'Pages', 'action' => 'pgsql']);
1
2Thêm Bảng Người Dùng
Thêm mã sau vào tệp
src/Model/Table/UsersTable.php
:php<?php namespace App\Model\Table; use Cake\ORM\Table; class UsersTable extends Table { }
1
2
3
4
5
6
7
8Thêm Dữ Liệu Người Dùng
Thêm dữ liệu người dùng vào controller:
phpuse App\Model\Entity\User; use Cake\ORM\TableRegistry; class PagesController extends AppController { public function pgsqlAdd() { $usersTable = TableRegistry::getTableLocator()->get('Users'); $user = $usersTable->newEntity(['name' => 'ServBay', 'email' => '[email protected]']); if ($usersTable->save($user)) { return new Response(['body' => 'User added']); } return new Response(['body' => 'Failed to add user']); } public function pgsql() { $usersTable = TableRegistry::getTableLocator()->get('Users'); $users = $usersTable->find()->all(); return new Response(['body' => 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
25Mở trình duyệt và truy cập
https://servbay-cakephp-test.local/pgsql-add
vàhttps://servbay-cakephp-test.local/pgsql
Qua các bước trên, bạn đã thành công tạo và chạy một dự án CakePHP, sử dụng các tính năng của ServBay để quản lý và truy cập dự án của mình, và kết nối và truy vấn các cơ sở dữ liệu khác nhau.