Tự tìm hiểu Route và mô hình MVC theo dạng Package/Module (Phần 2)

29th Aug 2021
Table of contents

Như ở phần 1, chúng ta tìm hiểu được cách để tạo ra một package đơn giản và khai báo package đó với ứng dụng. Hôm nay chúng ta sẽ tiếp tục tìm hiểu về Route và mô hình MVC tại package nhé.

Route và mô hình MVC

Mình đặt lại cấu trúc thư mục dưới đây để mọi người có thể hình dung lại cấu trúc của package đã được tạo từ phần 1:

packages
├── demo
│   ├── configs
│   │   └── demo.php
│   ├── helpers
│   │   └── functions.php
│   ├── migrations
│   ├── resources
│   │   └── assets
│   │   └── lang
│   │   └── views
│   ├── routes
│   │   └── routes.php
│   ├── src
│   │   └── Commands
│   │   └── Http
│   │   |   └── Controllers
│   │   |   |   └── DemoController.php
│   │   |   └── Middlewares
│   │   └── Models
│   │   |   └── Demo.php
│   │   └── Providers
│   │   |   └── DemoServiceProvider.php
│   ├── composer.json
│   ├── Readme.md
├── demo2
│   ├── ...

1. Route

Route chính là cửa ngõ dùng để điều hướng người dùng khi họ truy cập ứng dụng Laravel và Route tại package cũng có cấu trúc và cách dùng tương như như Route mặc định của ứng dụng. Route tại Package sẽ được cấu hình và định nghĩa tại tại "/packages/demo/routes/routes.php".

// packages/demo/routes/routes.php
<?php

Route::get('/demo', function () {
    return "Demo Package";
});

Sau khi cấu hình và định nghĩa routes xong chúng ta sẽ khai báo Route tại hàm "boot" ở "/packages/demo/src/Providers/DemoServiceProvider.php"

// packages/demo/src/Providers/DemoServiceProvider.php
<?php

namespace Package\Demo\Providers;

use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class DemoServiceProvider extends ServiceProvider
{

    /**
    * Register bindings in the container.
    */
    public function register()
    {
        //
    }

    public function boot()
    {
        $modulePath = __DIR__.'/../../';
        $moduleName = 'Demo';

        // boot route
        if (File::exists($modulePath."routes/routes.php")) {
            $this->loadRoutesFrom($modulePath."/routes/routes.php");
        }

    }

}

Sau khi khai báo xong hãy truy cập đường dẫn "/demo", nếu như hiển thị dòng chữ "Demo Package" nghĩa là chúng ta đã khai báo route thành công.

2. Mô hình MVC

Chắc mọi người không còn xa lạ gì với mô hình MVC nữa rồi. Laravel đã hỗ trợ rất đầy đủ và hoàn thiện mô hình MVC tại cấu trúc mặc định và với MVC tại package cũng vậy.

2.1. Khai báo Controller

Controller sẽ được khai báo tại thư mục "/packages/demo/src/Http/Controllers". Cấu trúc file controller sẽ giống với các file controller khác nhưng chú ý phải khai báo đúng namespace.

// packages/demo/src/Http/Controllers/DemoController.php
<?php

namespace Package\Demo\Http\Controllers;

use App\Http\Controllers;
use Illuminate\Http\Request;

class DemoController extends Controllers {
    ...
}

2.2. Khai báo Models

// packages/demo/src/Models/Demo.php
<?php

namespace Package\Demo\Models;

use Illuminate\Database\Eloquent\Model;

class Demo extends Model {
    ...
}

2.3. Khai báo View

Đầu tiên các bạn hay tạo file "/packages/demo/resources/views/index.blade.php" có nội dung bất kỳ.

Tiếp đến chúng ta sẽ khai báo views tại DemoServiceProvider

// packages/demo/src/Providers/DemoServiceProvider.php
...
public function boot()
{
    $modulePath = __DIR__.'/../../';
    $moduleName = 'Demo';

    ...
    // boot views
    if (File::exists($modulePath . "resources/views")) {
        $this->loadViewsFrom($modulePath . "resources/views", $moduleName);
    }
    ...

}
...

Để trả về view thì chúng ta có thể gọi: "view('Demo::index')" hoặc @include('Demo::index') (Với "Demo" trước dấu "::" chính là $moduleName)

3. Kết hợp Route và mô hình MVC

Đoạn code dưới đây sẽ giúp chúng ta hiểu được cách kết hợp Route với mô hình MVC. Bài toán: Khi truy cập vào đường dẫn "/demo" thì sẽ hiển thị giao diện được quy định tại "/packages/demo/resources/views/index.blade.php"

// packages/demo/routes/routes.php
<?php

$namespace = 'Package\Demo\Http\Controllers';

Route::namespace($namespace)->group(function() {
    Route::get('demo', 'DemoController@index');
});

// packages/demo/src/Models/Demo.php
<?php

namespace Package\Demo\Models;

use Illuminate\Database\Eloquent\Model;

class Demo extends Model {
    //
}

// packages/demo/src/Http/Controllers/DemoController.php
<?php

namespace Package\Demo\Http\Controllers;

use App\Http\Controllers;
use Illuminate\Http\Request;
use Package\Demo\Models\Demo;

class DemoController extends Controllers {
   
    public function index() {
        $data = Demo::all();
        return view('Demo::index', compact('data'));
    }

}

// packages/demo/resources/views/index.blade.php
This is demo page
@dd($data)

Như đoạn code trên thì chúng ta có thể thấy được cách khai báo Route với mô hình MVC không có nhiều thay đổi so với khai báo tại file ở cấu trúc thư mục mặc định của Laravel. Điều này giúp chúng ta dễ tiếp cận và phát triển hơn trong quá trình phát triển ứng dụng theo hướng Package.

Tổng kết

Như vậy là chúng ta đã tìm hiểu thêm được cách khai báo Route cũng như ứng dụng mô hình MVC tại package. Mình hi vọng bài viết có thế giúp các bạn hiểu được phần nào trong quá trình phát triển module theo dạng Package và trong bài viết tiếp theo chúng ta hãy cùng tìm hiểu về cách để khai báo: config, translate, helpers và migrations nhé.

Download source mẫu

Attach
Bạn thấy bài viết này như thế nào?
0 reactions

Add new comment

Image CAPTCHA
Enter the characters shown in the image.
Câu nói tâm đắc: “Điều tuyệt với nhất trong cuộc sống là làm được những việc mà người khác tin là không thể!”

Related Articles

Mỗi kết nối cơ sở dữ liệu được định nghĩa trong một mảng, với tên kết nối là khóa của mảng

Eager Loading là một kỹ thuật tối ưu hóa truy vấn cơ sở dữ liệu trong Laravel, giúp tăng tốc độ truy vấn và giảm số lượng truy vấn cần thiết để lấy dữ liệu liên quan đến một bản ghi.

Để sử dụng Eager Loading với điều kiện trong Laravel, bạn có thể sử dụng phương thức whereHas hoặc orWhereHas trong Eloquent Builder.

E hiểu đơn giản vầy nha. auth() hay Auth trong laravel là những function global hay class, nó cũng chỉ là 1 thôi

Xin chào các bạn, tuần này mình sẽ viết một bài về cách xử lý Real Time(thời gian thực) với Laravel và Pusher