Tái cấu trúc thư mục dự án trong Devibox

Đây là phần thứ 4 trong tổng số 13 phần thuộc loạt bài nói về Devilbox

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?

Cấu trúc thư mục mới

Đâ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.

Thiết lập lại đường dẫn cho 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.

Thiết lập lại thư mục 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.

Loại bỏ thư mục 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.

Đổi thư mục 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.

Sử dụng symlink

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.

Kết luận

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!

© 2024 - 2025
Khuyên Nguyễn
Made with in CT