Đến cuối cùng thì, Sail chỉ là phiên bản tối giản của Docker. Và bạn có thể tự do chỉnh sửa gần như mọi thứ. Ở bài này, mình sẽ cố gắng cài cắm Laravel Mongodb vào project của chúng ta và sử dụng nhé.
Chỉnh sửa Dockerfile
Để lấy được file config Docker của Sail, các bạn cần gõ command
1 2 | php artisan sail:publish |
Lúc này một folder docker
đã xuất hiện thêm trong project của chúng ta
Ở đât các bạn sẽ thấy có 2 directory là 7.4
và 8.0
đại diện cho 2 phiên bản php mà Sail cho sẵn chúng ta xài, và mặc định đang xài bản 8.0 nha. Bây giờ chúng ta sẽ cố gắng cái php mongodb extension.
Các bạn mở file docker/8.0/Dockerfile
, tại đây đã sẽ có script hình thành nên container cho chúng ta. Tìm xuống phía dưới đoạn RUN apt-get update...
, đoạn này rất dài, chúng ta xuống phía dưới nó và thêm dòng dưới đây vào
1 2 | <span class="token keyword">RUN</span> pecl install mongodb && echo <span class="token string">"extension=mongodb.so"</span> <span class="token punctuation">></span> /etc/php/8.0/cli/php.ini |
file của chúng ta sẽ có dạng như này
Rồi bây giờ cần build lại docker bằng command
1 2 | sail build --no-cache |
Quá trình này có thể diễn ra từ vài chục phút tới vài phút
Cài đặt và sử dụng Laravel Mongodb
Sau khi thêm thành công php mongodb extension, việc cài đặt package https://github.com/jenssegers/laravel-mongodb hẳn sẽ không gây ra lỗ lầm gì
1 2 | sail composer require jenssegers/mongodb |
Tiếp theo chúng ta sẽ khởi tạo services mongodb bằng Takeout
1 2 | takeout enable mongo --default |
Như bài trước thì chúng ta đã biết tích hợp Takeout với Sail, thời điểm này mình sẽ lấy alias của services mongo, chính là mongo
luôn, nhét vào DB_HOST
trong .env
. Còn với DB_CONNECTION
thì cái này thuộc settings mongo, mình ko đi sâu vào phân tích vì ngoài phạm trù bài viết, mà chỉ đưa ra config của mình để đảm bảo nó sẽ hoạt động
Mặc định thì Takeout sẽ đưa chúng ta username và password của root mongo lần lượt là admin
và password
. Mình sẽ đăng nhập vào CLI admin mongo và tạo user mới bằng câu lệnh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mongo -u admin -ppassword --authenticationDatabase admin use example_app db.createUser( { user: "example_user", pwd: "example_user", roles: [ { role: "dbOwner", db: "example_app" } ], mechanisms:[ "SCRAM-SHA-1" ] } ) |
Trong config/database.php
, tìm tới index connections
, tại đây là nơi khai báo các thiết lập của database, mình sẽ thêm thiết lập cho mongo của chúng ta
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token single-quoted-string string">'mongodb'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'driver'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'mongodb'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'host'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_HOST'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'port'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_PORT'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'database'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_DATABASE'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'username'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_USERNAME'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'password'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_PASSWORD'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'options'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'database'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_DATABASE'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// required with Mongo 3+</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> |
Chúng ta đã có connection cho mongo rồi, giờ chỉ việc fill vào .env
thôi
1 2 3 4 5 6 7 | DB_CONNECTION=mongodb DB_HOST=mongo DB_PORT=27017 DB_DATABASE=example_app DB_USERNAME=example_user DB_PASSWORD=example_user |
Chạy thử
Để đảm bảo mọi thứ hoạt động thì mình sẽ tạo 1 model Product
1 2 | sail artisan make:model Product |
Bên trong app/Models/Product.php
thì setup nó sử dụng connection mongo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">AppModels</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateDatabaseEloquentFactoriesHasFactory</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">JenssegersMongodbEloquentModel</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Product</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">HasFactory</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$guarded</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span> |
Cuối cùng mở tinker lên tạo thử 1 product xem nào
1 2 3 4 | sail tinker AppModelsProduct::create<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Example App'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> |
Kết
Đây hẳn sẽ là bài viết cuối cùng của series này
Thật ra lượng kiến thức truyền tải của bài này không phải quá nhiều, phần lớn là biểu diễn một case khả năng cao sẽ gặp cho các bạn làm ví dụ thôi
Hi vọng bài viết và cả series này đã giúp ích cho các bạn! Hẹn gặp lại vào lần tới nhé