Tạo và Chạy Dự Án CakePHP với ServBay
ServBay là môi trường phát triển web local mạnh mẽ được thiết kế riêng cho macOS, tích hợp các ngôn ngữ như PHP, Node.js, Python, Go, Java cùng các dịch vụ CSDL như MySQL, PostgreSQL, MongoDB, Redis và các máy chủ web Caddy hoặc Nginx. ServBay mang đến nền tảng phát triển tiện lợi, hiệu quả để giúp lập trình viên dễ dàng thiết lập và quản lý các dự án local.
Bài viết này sẽ hướng dẫn bạn cách tạo, cấu hình và vận hành một dự án CakePHP trong môi trường ServBay. CakePHP là framework PHP phổ biến cho phát triển web, tuân thủ mô hình MVC (model-view-controller), nổi bật với khả năng phát triển nhanh, ORM mạnh mẽ và các tính năng bảo mật sẵn có. Kết hợp với sự tiện ích của ServBay, bạn có thể bắt đầu phát triển CakePHP cực kỳ nhanh chóng.
CakePHP là gì?
CakePHP là một framework mã nguồn mở cho phát triển ứng dụng web PHP, cung cấp khung làm việc chuẩn để xây dựng ứng dụng web nhanh chóng, có cấu trúc mà không làm giảm đi sự linh hoạt. Framework này tuân thủ nguyên tắc “Ưu tiên quy ước hơn cấu hình" nhằm đơn giản hóa nhiều tác vụ phát triển thường gặp.
Các tính năng nổi bật & ưu điểm của CakePHP
- Dựa trên mô hình MVC: Tổ chức mã nguồn rõ ràng, dễ bảo trì và mở rộng.
- Phát triển nhanh: Công cụ dòng lệnh Bake giúp sinh code nhanh, tăng tốc quy trình phát triển.
- ORM mạnh mẽ (Object Relational Mapping): Đơn giản hóa thao tác với CSDL, hỗ trợ đa hệ quản trị.
- Bảo mật tích hợp sẵn: Hỗ trợ chống CSRF, chống SQL Injection, xác thực dữ liệu đầu vào.
- Template engine linh hoạt: Hỗ trợ nhiều giải pháp render view khác nhau.
- Cộng đồng lớn, kho plugin đa dạng: Dễ dàng tìm kiếm hỗ trợ, mở rộng tính năng.
- Tài liệu chi tiết: Có hướng dẫn toàn diện và tham khảo API đầy đủ.
CakePHP phù hợp cho các ứng dụng web đủ mọi quy mô — từ API đơn giản đến hệ thống doanh nghiệp phức tạp.
Thiết lập Môi trường Phát triển CakePHP với ServBay
ServBay cung cấp sẵn môi trường tích hợp tối ưu cho phát triển CakePHP, bao gồm:
- PHP cùng các extension phổ biến được cài sẵn.
- Composer quản lý package PHP đã dựng sẵn.
- Máy chủ web (Caddy/Nginx) dễ cấu hình.
- Các dịch vụ CSDL tích hợp (MySQL, PostgreSQL, Redis...).
Với ServBay, bạn không còn phải tốn công lắp ghép, cài đặt thủ công từng thành phần riêng lẻ nữa.
Yêu cầu trước khi bắt đầu
Trước khi tiến hành, hãy bảo đảm bạn đã thực hiện các bước sau:
- Cài đặt ServBay: Đảm bảo bạn đã tải và cài đặt thành công ServBay trên macOS.
- Khởi động các dịch vụ trên ServBay: Mở ứng dụng ServBay và kích hoạt các gói dịch vụ cần thiết (ví dụ: PHP, CSDL mà bạn muốn dùng như MySQL hoặc PostgreSQL, và dịch vụ lưu cache như Redis, Memcached). Bạn quản lý các dịch vụ này ở tab “Gói phần mềm” trên bảng điều khiển ServBay.
- Làm quen thao tác cơ bản với ServBay: Biết cách thêm và cấu hình website. Nếu chưa quen, nên xem Hướng dẫn sử dụng ServBay cơ bản.
Tạo Dự Án CakePHP
ServBay khuyến nghị bạn lưu mã nguồn các dự án web trong thư mục /Applications/ServBay/www
để tiện cho việc tự động nhận diện, quản lý website.
Mở Terminal
Khởi động ứng dụng Terminal trên macOS.
Di chuyển vào thư mục gốc website của ServBay
Điều hướng đến thư mục gợi ý để lưu dự án:
bashcd /Applications/ServBay/www
1Tạo thư mục dự án
Tạo thư mục con cho dự án CakePHP của bạn. Ở ví dụ này, ta đặt tên là
servbay-cakephp-app
:bashmkdir servbay-cakephp-app cd servbay-cakephp-app
1
2Tạo ruột dự án CakePHP bằng Composer
Composer đã cài sẵn trên ServBay. Tại thư mục dự án, chạy lệnh sau để tạo bộ khung CakePHP:
bashcomposer create-project --prefer-dist cakephp/app .
1Lệnh trên lấy bản CakePHP ổn định mới nhất và các phụ thuộc rồi cài vào thư mục hiện tại (
.
).Cài ORM driver (nếu dùng PostgreSQL)
Nếu muốn kết nối tới PostgreSQL, bạn cần cài thêm driver:
bashcomposer require cakephp/orm-pgsql
1Đối với MySQL, thường không cần vì đã có sẵn trong các phụ thuộc chính của CakePHP.
Cấu Hình Ban Đầu
Sau khi tạo dự án, bạn cần chỉnh một số thông tin cơ bản, đặc biệt là kết nối cơ sở dữ liệu.
Cấu hình biến môi trường và thông tin kết nối CSDL
File cấu hình môi trường local nằm ở
config/app_local.php
. Sửa file này, tìm mụcDatasources
và điền các thông tin kết nối CSDL của bạn. Mặc định với ServBay, tên đăng nhập làroot
, mật khẩu làpassword
.Ví dụ cấu hình kết nối MySQL:
php// config/app_local.php 'Datasources' => [ 'default' => [ 'className' => \Cake\Database\Connection::class, 'driver' => \Cake\Database\Driver\Mysql::class, // hoặc \Cake\Database\Driver\Postgres::class cho PostgreSQL 'persistent' => false, 'host' => '127.0.0.1', // Địa chỉ máy chủ CSDL – ServBay chạy local //'port' => '3306', // Port mặc định MySQL 3306, PostgreSQL 5432 'username' => 'root', // Tài khoản mặc định ServBay 'password' => 'password', // Mật khẩu mặc định ServBay 'database' => 'servbay_cakephp_app', // Tên CSDL bạn định tạo 'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => false, /** * Đặt quoteIdentifiers là true nếu dùng từ khóa như "user" cho tên bảng. * Nếu dùng từ như "cake", bạn có thể để là false. * Nếu không chắc, hãy để là true. */ 'quoteIdentifiers' => false, /** * Một vài hạn chế như sau: * - Hầu hết các driver không hỗ trợ đổi mức cô lập qua PDO options. * - Không phải mọi driver đều cho phép cài charset bằng PDO options. * - Không hỗ trợ PDO options cho driver đóng gói sẵn như Postgres từ CakePHP. * Với Postgres, chỉ cần đặt encoding. */ 'options' => [], //'url' => env('DATABASE_URL', null), // Nếu dùng biến môi trường DATABASE_URL, bật dòng này lên ], ],
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
36Hãy điều chỉnh
driver
vàport
tuỳ loại CSDL bạn dùng (MySQL/PostgreSQL). Đảm bảo têndatabase
khớp với tên CSDL bạn sẽ tạo.
Cấu Hình Máy Chủ Web (Tạo Website trong ServBay)
Để truy cập dự án CakePHP qua trình duyệt, bạn cần thêm một website trỏ về thư mục dự án trong ServBay.
Mở bảng điều khiển ServBay
Nhấp vào biểu tượng ServBay để mở control panel.
Chuyển đến tab “Website”
Trong bảng điều khiển, chọn “Website” ở menu trái.
Thêm website mới
Nhấn nút
+
ở dưới để thêm mới. Điền thông tin như sau:- Tên (Name): Ví dụ
My CakePHP Dev Site
cho dễ nhớ. - Miền (Domain): Đặt một domain phát triển local, ví dụ
servbay-cakephp-test.local
. ServBay tự động trỏ về local. - Loại website (Site Type): Chọn
PHP
. - Phiên bản PHP (PHP Version): Chọn phiên bản tương thích với CakePHP (CakePHP 4+ cần tối thiểu PHP 7.4+, CakePHP 5+ nên chọn PHP 8.1+) — ví dụ
8.3
. - Thư mục gốc website (Document Root): Lưu ý! Gốc máy chủ web của dự án KHÔNG phải thư mục chính mà là
webroot
bên trong dự án. Đặt là/Applications/ServBay/www/servbay-cakephp-app/webroot
(thayservbay-cakephp-app
bằng tên dự án của bạn).
- Tên (Name): Ví dụ
Lưu và áp dụng thay đổi
Sau khi điền xong, nhấn “Lưu”. ServBay sẽ hiện cải tiến thay đổi — xác nhận là xong. ServBay tự động cấu hình máy chủ web (Caddy hoặc Nginx) để
servbay-cakephp-test.local
trỏ vào thư mụcwebroot
của dự án bạn.
Xem chi tiết từng bước tại Thêm Website đầu tiên trong tài liệu ServBay.
Kiểm Tra Thiết Lập
Giờ, bạn đã có thể truy cập website từ trình duyệt.
Mở trình duyệt, nhập domain bạn đã cài trong ServBay, ví dụ: https://servbay-cakephp-test.local
.
Nếu mọi thứ ổn, bạn sẽ thấy trang chào mừng mặc định của CakePHP. Điều này xác nhận môi trường PHP, máy chủ web và ServBay đã được thiết lập đúng.
Tích Hợp CSDL và Dịch Vụ Cache
CakePHP có ORM và lớp trừu tượng cache mạnh, giúp bạn dễ dàng kết nối với các dịch vụ MySQL, PostgreSQL, Redis, Memcached do ServBay cung cấp.
Ví dụ Cơ sở Dữ liệu Quan hệ (MySQL / PostgreSQL)
Ví dụ sau hướng dẫn bạn dùng ORM của CakePHP để kết nối MySQL hoặc PostgreSQL (trên ServBay), tạo bảng users
đơn giản, và thao tác CRUD.
Tạo cơ sở dữ liệu trong ServBay
Trước khi migrate, hãy tạo mới một database trên hệ quản trị CSDL ServBay. Có thể dùng công cụ quản lý đi kèm (phpMyAdmin cho MySQL/MariaDB, pgAdmin cho PostgreSQL, hoặc bên thứ ba như Navicat, DBeaver...). Kết nối tới dịch vụ (thường là
127.0.0.1
, userroot
, passpassword
) rồi tạo CSDL tên làservbay_cakephp_app
.Tạo file Model ORM
CakePHP ORM yêu cầu file Model đại diện cho bảng. Tạo file
UsersTable.php
:Lưu đoạn code này vào
src/Model/Table/UsersTable.php
:php<?php namespace App\Model\Table; use Cake\ORM\Table; use Cake\Validation\Validator; // Nếu cần rule xác thực class UsersTable extends Table { /** * Phương thức khởi tạo * * @param array $config Cấu hình cho Table. * @return void */ public function initialize(array $config): void { parent::initialize($config); $this->setTable('users'); // Chỉ định tên bảng rõ ràng $this->setDisplayField('name'); // Trường hiển thị mặc định $this->setPrimaryKey('id'); // Thiết lập khóa chính // Nếu muốn dùng behavior Timestamp // $this->addBehavior('Timestamp'); } /** * Quy tắc xác thực mặc định. * * @param \Cake\Validation\Validator $validator Đối tượng Validator. * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator): Validator { $validator ->scalar('name') ->maxLength('name', 255) ->requirePresence('name', 'create') ->notEmptyString('name'); $validator ->email('email') ->requirePresence('email', 'create') ->notEmptyString('email') ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); // Bảo đảm email là duy nhất return $validator; } }
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
49Dùng Bake tạo file migration
CakePHP khuyến khích quản lý CSDL qua migration. Ở thư mục gốc dự án (
/Applications/ServBay/www/servbay-cakephp-app
), chạy công cụ Bake tạo file migration bảng users:bashbin/cake bake migration CreateUsers name:string email:string:unique
1Lệnh trên sinh migration tạo bảng users với trường
name
(string) vàemail
(string, unique).Chạy migration tạo bảng
Chạy lệnh để bảng
users
được tạo thật trên CSDL:bashbin/cake migrations migrate
1Nếu thành công, bạn sẽ thấy bảng users trong database.
Cấu hình kết nối CSDL (nếu chưa thiết lập)
Đảm bảo cấu hình
Datasources.default
trongconfig/app_local.php
phù hợp CSDL và thông tin truy cập.Ví dụ MySQL:
php'Datasources' => [ 'default' => [ 'className' => \Cake\Database\Connection::class, 'driver' => \Cake\Database\Driver\Mysql::class, 'host' => '127.0.0.1', 'username' => 'root', 'password' => 'password', 'database' => 'servbay_cakephp_app', // ... cấu hình thêm ], ],
1
2
3
4
5
6
7
8
9
10
11Ví dụ PostgreSQL:
php'Datasources' => [ 'default' => [ 'className' => \Cake\Database\Connection::class, 'driver' => \Cake\Database\Driver\Postgres::class, 'host' => '127.0.0.1', // 'port' => '5432', // Port mặc định 'username' => 'root', // User mặc định ServBay 'password' => 'password', // Password mặc định ServBay 'database' => 'servbay_cakephp_app', // ... cấu hình thêm ], ],
1
2
3
4
5
6
7
8
9
10
11
12
Thêm route và phương thức controller mẫu
Sửa
config/routes.php
, thêm tuyến để thêm và xem dữ liệu user:php// config/routes.php use Cake\Routing\RouteBuilder; use Cake\Routing\Router; use Cake\Routing\Route\DashedRoute; Router::defaultRouteClass(DashedRoute::class); Router::scope('/', function (RouteBuilder $routes) { // ... tuyến khác $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); // Route ví dụ database $routes->connect('/db-add-user', ['controller' => 'Pages', 'action' => 'dbAddUser']); $routes->connect('/db-list-users', ['controller' => 'Pages', 'action' => 'dbListUsers']); // ... tuyến khác $routes->fallbacks(DashedRoute::class); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Sửa
src/Controller/PagesController.php
, bổ sung phương thức thao tác database:php<?php namespace App\Controller; use Cake\Http\Response; use Cake\ORM\TableRegistry; use Cake\Datasource\Exception\RecordNotFoundException; // Xử lý ngoại lệ khi không tìm thấy record class PagesController extends AppController { /** * Hiển thị một view * * @param array ...$path Các đoạn đường dẫn. * @return \Cake\Http\Response|null */ public function display(...$path): ?Response { // ... method display mặc định return new Response(['body' => 'Hello ServBay! Đây là trang mặc định.']); } /** * Ví dụ DB: Thêm user mới */ public function dbAddUser(): Response { $usersTable = TableRegistry::getTableLocator()->get('Users'); // Lấy instance bảng Users // Tạo đối tượng user mới $user = $usersTable->newEntity([ 'name' => 'ServBay Demo User', 'email' => '[email protected]' // Email demo gắn liền thương hiệu ServBay ]); // Thử lưu vào DB if ($usersTable->save($user)) { return new Response(['body' => 'Thêm thành công! User ID: ' . $user->id]); } else { // Thất bại, có thể do validation hoặc lý do khác $errors = $user->getErrors(); // Lấy thông tin lỗi xác thực return new Response(['body' => 'Thêm user thất bại. Lỗi: ' . json_encode($errors)]); } } /** * Ví dụ DB: Liệt kê toàn bộ user */ public function dbListUsers(): Response { $usersTable = TableRegistry::getTableLocator()->get('Users'); // Lấy instance bảng Users // Truy xuất dữ liệu user $users = $usersTable->find()->all(); // Xuất dữ liệu dạng JSON return new Response(['body' => json_encode($users->toArray())]); // Dùng toArray() để chuyển sang mảng } }
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
55
56
57
58Truy cập route ví dụ database
Mở trình duyệt:
- Truy cập
https://servbay-cakephp-test.local/db-add-user
để thêm user. Bạn sẽ nhận được thông báo thành công. - Truy cập
https://servbay-cakephp-test.local/db-list-users
để xem toàn bộ danh sách user (bao gồm user bạn vừa tạo).
- Truy cập
Với các bước trên, bạn đã kết nối dự án CakePHP với cơ sở dữ liệu trên ServBay và thực hiện thành công các thao tác ORM cơ bản.
Ví dụ dịch vụ Cache (Memcached / Redis)
CakePHP tích hợp API cache thống nhất giúp bạn dễ dàng chuyển giữa Memcached và Redis. ServBay cài sẵn extension PHP tương ứng và cung cấp đầy đủ dịch vụ phía server.
Hãy bảo đảm đã khởi động Memcached hoặc Redis trên tab “Gói phần mềm” của ServBay.
Cấu hình kết nối cache
Sửa file
config/app_local.php
, ở phầnCache
cấu hình như sau:Ví dụ cấu hình Memcached:
php// config/app_local.php 'Cache' => [ 'default' => [ 'className' => \Cake\Cache\Engine\MemcachedEngine::class, 'servers' => ['127.0.0.1:11211'], // Địa chỉ và port mặc định Memcached trên ServBay 'prefix' => 'servbay_cakephp_', // tiền tố key cache ], // ... cấu hình cache khác ],
1
2
3
4
5
6
7
8
9Ví dụ cấu hình Redis:
php// config/app_local.php 'Cache' => [ 'default' => [ 'className' => \Cake\Cache\Engine\RedisEngine::class, 'host' => '127.0.0.1', // Địa chỉ mặc định Redis trên ServBay 'port' => 6379, // Port mặc định Redis 'password' => null, // Nếu đặt mật khẩu Redis thì điền ở đây 'database' => 0, // Redis database index 'prefix' => 'servbay_cakephp_', // tiền tố key cache ], // ... cấu hình cache khác ],
1
2
3
4
5
6
7
8
9
10
11
12
Chọn cache engine bạn thực sự sử dụng để cấu hình phù hợp.
Bổ sung route và method controller ví dụ cache
Sửa
config/routes.php
, thêm route thao tác cache:php// config/routes.php // ... route khác $routes->connect('/cache-memcached', ['controller' => 'Pages', 'action' => 'cacheMemcached']); $routes->connect('/cache-redis', ['controller' => 'Pages', 'action' => 'cacheRedis']); // ... route khác
1
2
3
4
5Thêm vào
src/Controller/PagesController.php
hàm dùng cache:php<?php namespace App\Controller; use Cake\Http\Response; use Cake\Cache\Cache; // Sử dụng Cache class // ... các use khác class PagesController extends AppController { // ... các method khác (display, dbAddUser, dbListUsers) /** * Ví dụ cache với Memcached */ public function cacheMemcached(): Response { // Đảm bảo app_local.php đã cấu hình 'default' cache là MemcachedEngine $cacheKey = 'servbay_memcached_test_key'; $cachedData = Cache::read($cacheKey); // Đọc thử từ cache $responseBody = ''; if ($cachedData === false) { // Cache miss $responseBody = 'Cache miss! Ghi "Hello Memcached!" vào cache.'; $dataToCache = 'Hello Memcached!'; Cache::write($cacheKey, $dataToCache, 'default'); // Ghi vào cache 'default' (đã cấu hình là Memcached) } else { // Cache hit $responseBody = 'Cache hit! Dữ liệu từ cache: ' . $cachedData; } return new Response(['body' => $responseBody]); } /** * Ví dụ cache với Redis */ public function cacheRedis(): Response { // Đảm bảo app_local.php đã cấu hình 'default' cache là RedisEngine $cacheKey = 'servbay_redis_test_key'; $cachedData = Cache::read($cacheKey); // Đọc thử từ cache $responseBody = ''; if ($cachedData === false) { // Cache miss $responseBody = 'Cache miss! Ghi "Hello Redis!" vào cache.'; $dataToCache = 'Hello Redis!'; Cache::write($cacheKey, $dataToCache, 'default'); // Ghi vào cache 'default' (cấu hình Redis) } else { // Cache hit $responseBody = 'Cache hit! Dữ liệu từ cache: ' . $cachedData; } return new Response(['body' => $responseBody]); } }
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
55
56
57
58
59
60
61Truy cập ví dụ cache
Mở trình duyệt:
- Nếu cấu hình Memcached, truy cập
https://servbay-cakephp-test.local/cache-memcached
. Lần đầu sẽ hiện “Cache miss”, refresh sẽ thấy “Cache hit”. - Nếu cấu hình Redis, truy cập
https://servbay-cakephp-test.local/cache-redis
. Lần đầu sẽ hiện “Cache miss”, refresh sẽ thấy “Cache hit”.
- Nếu cấu hình Memcached, truy cập
Điều này chứng minh dự án CakePHP đã tích hợp cache engine thành công cùng ServBay.
Lưu Ý Khi Sử Dụng
- Thông tin database: Tài khoản, mật khẩu mặc định (
root
/password
) chỉ sử dụng cho local development. Trên môi trường production nhất định phải dùng thông tin an toàn hơn. - Thư mục gốc website: Bắt buộc trỏ Document Root của site ServBay vào thư mục
webroot
trong dự án CakePHP, không phải thư mục main! Đây là khuyến nghị chuẩn của CakePHP. - Tương thích phiên bản PHP: Đảm bảo phiên bản PHP chạy trên ServBay tương thích CakePHP bạn dùng. Xem tài liệu chính thức CakePHP về yêu cầu phiên bản.
- Port ServBay: Nếu port mặc định ServBay (như 80, 443) bị ứng dụng khác chiếm dụng, hãy đổi port trong cài đặt ServBay và điều chỉnh truy cập domain/port tương ứng, hoặc sửa file hosts nếu cần.
Câu Hỏi Thường Gặp (FAQ)
- Q: Không truy cập được
servbay-cakephp-test.local
?- A: Kiểm tra Document Root trên ServBay đã trỏ đúng tới
/Applications/ServBay/www/servbay-cakephp-app/webroot
chưa. - Đảm bảo máy chủ web (Caddy/Nginx) bên ServBay đang running.
- Kiểm tra file hosts hệ thống có trỏ
servbay-cakephp-test.local
về127.0.0.1
không (thường ServBay làm tự động). - Kiểm tra file
.htaccess
trong dự án hoặc file cấu hình máy chủ web (thườngwebroot/.htaccess
mặc định là chuẩn).
- A: Kiểm tra Document Root trên ServBay đã trỏ đúng tới
- Q: Không kết nối được database?
- A: Đảm bảo dịch vụ CSDL (MySQL/PostgreSQL) bên ServBay đang chạy.
- Kiểm tra thông tin kết nối trong
config/app_local.php
(host, port, username, password, database) đúng chưa, có khớp với service ServBay không. - Đảm bảo bạn đã tạo database
servbay_cakephp_app
rồi.
- Q: Không chạy được lệnh Composer,
bin/cake
báo lỗi?- A: Hãy đảm bảo bạn đang ở đúng thư mục gốc của dự án (
/Applications/ServBay/www/servbay-cakephp-app
) khi chạy lệnh. - Đảm bảo PHP & Composer trên ServBay đã running.
- Kiểm tra lệnh
php
đã nhận diện trong terminal (ServBay thường thêm tự động vào PATH). Có thể thử terminal tích hợp của ServBay hoặc thiết lập thủ công.
- A: Hãy đảm bảo bạn đang ở đúng thư mục gốc của dự án (
Tổng Kết
Với ServBay, bạn có thể thiết lập môi trường local phát triển CakePHP trên macOS một cách hiệu quả. Các phần mềm PHP, Composer, máy chủ web và CSDL được tích hợp sẵn, giúp tối giản mọi công đoạn cấu hình. Bài viết đã hướng dẫn tỉ mỉ quá trình từ khởi tạo, cấu hình cơ bản, thiết lập máy chủ web, tích hợp database & cache, để bạn sớm bắt tay vào phát triển với CakePHP. Tận dụng ServBay giúp bạn tập trung tối đa cho code, không còn vướng bận chuyện xây dựng môi trường phức tạp nữa!