Việc cài đặt môi trường phát triển với Devilbox về cơ bản là khá đơn giản. Tôi tin rằng cho dù bạn có là người mới thì cũng không gặp bất kỳ khó khăn nào để làm quen với công cụ này. Tuy nhiên như đã đề cập ở phần trước, việc data dir
nằm ngay bên trong Devilbox khiến chúng ta có cảm giác dự án của mình bị dính chặt với Devilbox.
Nếu có thể chuyển data dir
ra thư mục khác thì sẽ khiến mọi thứ linh hoạt hơn. Lúc này Devilbox sẽ chỉ đóng vai trò là công cụ thiết lập môi trường phát triển mà thôi. Bạn hoàn toàn có thể đổi sang công cụ khác nếu muốn một cách dễ dàng mà không cần quan tâm đến data dir
nữa.
Nghe thì hay đấy, nhưng chúng ta sẽ làm điều đó như thế nào?
Đây là cấu trúc thư mục mặc định của Devilbox:
├── devilbox
└── data
└── www
└── my_project
Còn đây sẽ là cấu trúc thư mục mới mà tôi đề xuất:
├── devilbox
├── projects
└── my_project
Thư mục projects
sẽ chứa toàn bộ dự án và nằm cùng cấp với thư mục chứa Devilbox. Đương nhiên, các bạn hoàn toàn có quyền quyết định việc đặt tên thư mục chứa dự án và đặt nó ở đâu trong máy tính của mình. Ở đây, tôi chỉ đang đề xuất một cấu trúc giúp cho bạn dễ hình dung hơn mà thôi.
Bây giờ, tôi sẽ hướng dẫn các bạn cách cấu hình lại Devilbox với cấu trúc trên. Nhớ là đừng quên tạo thư mục projects
trước khi sang bước tiếp theo.
data dir
Đầu tiên hãy mở tập tin .env
, tìm đến khóa HOST_PATH_HTTPD_DATADIR
và thay đổi giá trị là đường dẫn mới cho data dir
. Với cấu trúc đã đề xuất, tôi sẽ chỉnh sửa lại như sau:
HOST_PATH_HTTPD_DATADIR=../projects
Tiếp theo, chỉ cần khởi động lại Devilbox là xong. Đơn giản như đang giỡn!
docker compose down
docker compose up -d
Bạn có thể kiểm tra lại ở mục Virtual Hosts để thấy kết quả.
Tuy đã chuyển đổi thư mục data dir
đi nơi khác nhưng hãy lưu ý rằng: để truy cập PHP Container hay thực thi các lệnh Docker liên quan đến Devilbox, bạn cần phải ở trong thư mục chứa Devilbox. Nếu cảm thấy không thoải mái khi phải chuyển sang thư mục chứa Devilbox để thực thi câu lệnh khi đang ở bên trong data dir
, các bạn có thể cân nhắc thiết lập và sử dụng các command alias
.
Ngoài ra, các thay đổi liên quan đến thư mục /shared/httpd
bên trong PHP Container đều ảnh hưởng đến data dir
dù cho bạn có đặt nó ở đâu.
docroot
Ban đầu, my_project
của chúng ta có cấu trúc như thế này:
├── my_project
└── htdocs
└── index.php
Trên thực tế, có thể các bạn sẽ muốn cấu trúc như thế này:
├── my_project
└── index.php
Hoặc một số framework như Laravel thì cấu trúc sẽ tương tự như thế này:
├── my_project
├── app
...
├── public
│ └── index.php
...
└── vendor
Lúc này, không hề có thư mục htdocs
mà sẽ là thư mục public
.
Vậy làm thế nào đây? Bạn đừng lo, cách thực hiện rất đơn giản. Không những thế, tôi sẽ hướng dẫn bạn đến những hai cách.
htdocs
Cách này sẽ phù hợp cho cấu trúc đầu tiên:
├── my_project
└── index.php
Để thực hiện thì bạn chỉ cần mở tập tin .env
, tìm đến khóa HTTPD_DOCROOT_DIR
và xóa đi giá trị mặc định htdocs
.
HTTPD_DOCROOT_DIR=
Sau đó khởi động lại Devilbox, dưới đây chính là kết quả. Bạn có thể thấy đường dẫn ở mục DocumentRoot đã mất đi thư mục htdocs
.
htdocs
thành public
Cách này sẽ phù hợp với đại đa số các PHP framework hiện nay, ví dụ như Laravel:
├── my_project
├── app
...
├── public
│ └── index.php
...
└── vendor
Để thực hiện thì cũng giống như lúc nãy. Các bạn chỉ cần đổi giá trị khóa HTTPD_DOCROOT_DIR
thành public
, sau đó khởi động lại Devilbox là xong.
HTTPD_DOCROOT_DIR=public
Đây là kết quả trên trang Virtual Hosts:
Đương nhiên là bạn có thể đổi sang bất kỳ giá trị nào, để phù hợp với nhu cầu dự án. Tuy nhiên, lúc này chúng ta sẽ gặp vấn đề khó chịu hơn. Đó là cho dù có thay đổi như thế nào, thì giá trị này cũng sẽ ảnh hưởng lên toàn bộ tất các dự án có trong Devilbox. Để kiểm chứng, tôi đã tạo thêm một dự án nữa, và đây chính là kết quả:
Như bạn thấy đó, tất cả dự án đều dùng thư mục public
làm docroot
. Nhưng thực tế thì lại không như vậy. Ví dụ như với WordPress thì docroot
chính là thư mục dự án. Laravel thì là thư mục public
còn CakePHP thì là thư mục webroot
. Nhưng chỉ có một tập tin .env
thì làm thế nào để cấu hình mỗi dự án là một docroot
khác nhau đây?
Lúc này tính năng symlink
sẽ lên tiếng.
Symlink (Symbolic link) hiểu đơn giản là một lối tắt (shortcut) đến một thư mục hoặc tập tin cụ thể. Bạn có thể hình dung như nó giống shortcut ngoài desktop của hệ điều hành Windows. Mỗi khi mở chương trình thông qua shortcut cũng chính là thực thi tập tin exe với một đường dẫn cụ thể.
Hãy lấy ví dụ với cấu trúc đầu tiên:
├── my_project
└── index.php
Tôi sẽ sử dụng symlink để trỏ trực tiếp thư mục dự án đến thư mục public
. Lúc này, khi truy cập vào thư mục my_project
thì cũng như là đang truy cập vào thư mục public
. Để thực hiện, hãy truy cập vào PHP Container.
./shell.sh
Sau đó, chuyển vào thư mục dự án my_project
và thực hiện lệnh sau để tạo symlink:
ln -s . public
Nếu bạn chưa biết thì dấu .
đại diện cho thư mục hiện tại. Để kiểm tra xem có cài đặt symlink thành công chưa, bạn có thể dùng package tree:
sudo apt update
sudo apt install tree
tree -L 1
Như bạn thấy đó, ký tự →
cho biết đã tạo symlink thành công. Các bạn có thể thử tải lại trang dự án my_project
để xem nó đã hoạt động hay chưa.
Lưu ý, khi tạo thành công symlink, ví dụ ở đây là thư mục public
. Hệ thống sẽ xem nó như là thư mục thật sự. Do đó trong trường hợp muốn đẩy tập tin index.php ra ngoài để tái cấu trúc lại thư mục dự án, bạn sẽ không thể tạo lại thư mục public
hay xem nó là thư mục con trong dự án được nữa. Cách duy nhất là xóa bỏ symlink với lệnh rm:
rm public
Kiểm tra lại sơ đồ thư mục:
Như bạn thấy, symlink cho thư mục public
đã biến mất. Giờ bạn có thể tạo lại thư mục public
như bình thường.
Như vậy là chúng ta đã cũng nhau tái cấu trúc lại thư mục dự án trong Devilbox. Với cấu trúc mới này, các bạn sẽ dễ dàng quản lý dự án mới cũng như giữ nguyên cấu trúc dự án cũ. Ngoài ra, chúng ta còn cùng nhau thay đổi thư mục docroot
một cách linh động. Trong phần tiếp theo, tôi sẽ hướng dẫn cho các bạn một phần không kém quan trọng khi làm việc với PHP. Đó chính là cấu hình Xdebug. Let’s go!