Trong bài viết trước thì mình đã hướng dẫn các bạn thiết lập cấu trúc và đăng ký module đầu tiên khi phát triển ứng dụng Laravel theo mô hình này.

Trong bài viết này, mình sẽ hướng dẫn các bạn load view, controllers nhé.

1. Load views

Đầu tiên, hãy tạo ra file /core/demo/resources/views/index.blade.php với nội dung bất kỳ nhé.

Có thể thế này:


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Demo module</title>
</head>
<body>
    <h2>This is the first module of series about Laravel</h2>
</body>
</html>

 

Sau đó sửa lại /core/demo/src/Providers/DemoServiceProvider.php nhé.


<?php

namespace Botble\Demo\Providers;

use Illuminate\Support\ServiceProvider;

class DemoServiceProvider extends ServiceProvider
{
    public function boot()
    {
          $this->loadRoutesFrom(__DIR__ . '/../../routes/web.php');
          $this->loadViewsFrom(__DIR__ . '/../../resources/views', 'botble-demo');
    }
}

Trông nó sẽ như hình.

Trong bài viết trước, mình đã để việc load route trong hàm register nhưng thực sự thì nó nên để trong hàm boot nhé, hàm register được load đầu tiên nên nó chỉ nên để bind các service vào container nhé.

Load view ở trong function register quá sớm cũng không cần thiết, mặc dù nó vẫn chạy đúng.

Bây giờ, hãy sửa lại /core/demo/routes/web.php  nhé, chúng ta sẽ không return trực tiếp nội dung string như bài viết trước nữa mà sẽ trả ra view.


Route::get('/demo', function () {
     return view('botble-demo::index');
});

Hãy mở http://localhost:8000/demo bạn sẽ thấy nội dung được hiển thị theo view index.blade.php rồi nhé.

Mọi chuyện vẫn khá là dễ dàng phải không nào 😀

2. Tạo controllers

Bây giờ thì bạn có thể sử dụng thư mục source giống như thư mục /app mặc định của Laravel.

Để tạo controller thì ta tạo theo cấu trúc giống của Laravel luôn cho dễ quản lý nhé. Hãy tạo file /core/demo/src/Http/Controllers/DemoController.php với nội dung như sau:


<?php

namespace Botble\Demo\Http\Controllers;

use App\Http\Controllers\Controller;

class DemoController extends Controller
{
    /**
    * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
    */
    public function getIndex()
    {
         return view('botble-demo::index');
    }
}

Mình đã khai báo autoload thư mục /core/demo/src theo chuẩn psr-4 rồi, vì vậy lúc này namespace tính từ thư mục /src trở vào trong sẽ trùng với đường dẫn thư mục nhé.

Tiếp theo, hãy sửa lại /core/demo/routes/web.php để sử dụng controller mới tạo nào.


<?php

Route::group(['namespace' => 'Botble\Demo\Http\Controllers'], function () {
   Route::get('/demo', 'DemoController@getIndex');
});

Chúng ta bọc route /demo trong namespace Botble\Demo\Http\Controllers  thì chúng ta có thể viết ngắn gọn là sử dụng DemoController cho route /demo mà không cần viết toàn bộ namespace nhé, như vậy sẽ đỡ mất công khi chúng ta thêm vài routes mới.

Như vậy là chúng ta đã có thể sử dụng module demo với views và controllers rồi đó, việc sử dụng thêm models cho module này cũng tương tự như việc bạn tạo thêm model trong thư mục /app vậy chỉ cần lưu ý namespace của nó bây giờ là Botble/Demo chứ không phải là App nữa nhé.

Mình sẽ hướng dẫn tiếp về làm việc với database và model trong mô hình phát triển theo dạng modules/packages này trong bài viết sau nhé.

Toàn bộ những thay đổi trong source code so với phần trước các bạn có thể xem tại đây nhé: https://github.com/sangnguyenplus/laravel-package-demo/commit/3d2084c97b270d8efe8e13c496be048d8ff5ec22

Mọi thắc mắc xin để lại ở phần bình luận.

Cám ơn các bạn đã quan tâm tới series này!

Phần trước: [Laravel Tutorials] Tổ chức theo dạng packages/modules trong ứng dụng Laravel – Phần 1

 

 

Mình là 1 developer mới vào nghề, chưa có nhiều kinh nghiệm với lập trình web nhưng luôn muốn chia sẻ những hiểu biết của mình với các lập trình viên khác. Khá là gà và lười viết blog, chỉ ham code và chuyên Laravel.