Bộ điều khiển liên kết mô hình định tuyến của Laravel

Ràng buộc mô hình tuyến đường là gì? . Đó chính xác là những gì chúng ta sẽ xem xét trong bài viết này. Cho đến nay, chúng tôi đã thử nghiệm nhiều tính năng khác nhau của khung Laravel khi chúng tôi xây dựng một ứng dụng đơn giản cho phép chúng tôi theo dõi các trò chơi trong cơ sở dữ liệu. Cho đến nay, chúng tôi đã tạo hai tuyến đường và một trong số đó chấp nhận id để chúng tôi có thể tìm nạp một trò chơi cụ thể từ cơ sở dữ liệu của mình. Với liên kết mô hình tuyến đường, chúng tôi sẽ biến bước này thành một quy trình tự động. Hãy xem nó hoạt động như thế nào


Trình điều khiển trò chơi hiện tại

Tại thời điểm này, chúng tôi sử dụng bộ điều khiển trò chơi chuyên dụng, chính bộ điều khiển này sử dụng mô hình Trò chơi để tìm dữ liệu trong cơ sở dữ liệu. Đặc biệt chú ý đến phương pháp show() bên dưới


 $games]);
    }
    
    public function show($id)
    {
        $game = Game::find($id);
        return view('games.show', ['game' => $game]);
    }
}

Lưu ý rằng chúng tôi phải chuyển vào $id của trò chơi mà chúng tôi đang muốn tìm. Trong tệp tuyến đường của chúng tôi, tuyến đường này. get('games/{id}', 'GamesController@show'); . Vì vậy, nếu ai đó nhập /games/3 vào trình duyệt, thì {id} sẽ được ghi là số 3. Con số đó được chấp nhận trong phương thức show($id) và trò chơi chúng tôi muốn được tìm thấy bằng Game. tìm($id);


Di chuyển đến liên kết mô hình tuyến đường

Để đơn giản hóa quá trình tìm nạp trò chơi này, chúng ta có thể sử dụng Ràng buộc Mô hình Tuyến đường. Ràng buộc mô hình định tuyến sử dụng Dependency Injection để tự động tìm trò chơi mà chúng tôi đang tìm kiếm

Thay đổi phương thức show() từ cái này


    public function show($id)
    {
        $game = Game::find($id);
        return view('games.show', ['game' => $game]);
    }

để này


    public function show(Game $id)
    {
        return view('games.show', ['game' => $id]);
    }

Chúng tôi có thể xóa toàn bộ dòng mã này $game = Game. find($id);, và chỉ cần đặt từ Game trước $id như vậy. hiển thị(Trò chơi $id). Đây là một ví dụ về việc sử dụng thứ gọi là Gợi ý Loại. Chúng tôi đang chuyển một $id, nhưng chúng tôi đang gợi ý rằng chúng tôi muốn nó là một phiên bản của mô hình Trò chơi. Khi chúng tôi quay lại và kiểm tra mọi thứ, có vẻ như mọi thứ vẫn hoạt động như trước. Mát lạnh

Bộ điều khiển liên kết mô hình định tuyến của Laravel

Điều quan trọng cần lưu ý là tên ký tự đại diện trong tệp tuyến đường phải khớp chính xác với biến gợi ý loại được truyền cho hàm trong bộ điều khiển. Trong trường hợp của chúng tôi /games/{id} tương ứng với show(Game $id). Thay vào đó, nếu chúng tôi đã cố gắng làm điều gì đó như show(Game $game), ràng buộc mô hình tuyến đường sẽ không hoạt động

Theo mặc định, Laravel đang sử dụng khóa chính để tìm bản ghi khi sử dụng liên kết mô hình định tuyến. Nếu bạn cần tùy chỉnh điều này để hoạt động thay vì với thứ gì đó như tìm kiếm bằng sên, điều này có thể thực hiện được bằng cách tùy chỉnh tên khóa trong mô hình Trò chơi


Tóm tắt ràng buộc mô hình tuyến đường

Trong hướng dẫn nhanh này, chúng tôi đã giới thiệu về liên kết mô hình định tuyến trong Laravel. Chúng tôi thấy rằng đó là một cách giúp việc tìm kiếm các bản ghi cụ thể trong cơ sở dữ liệu trở nên hợp lý hơn, cho phép chúng tôi xóa truy vấn thủ công khỏi phương thức show() trong bộ điều khiển của mình

Laravel có rất nhiều tính năng giúp việc phát triển trở nên dễ dàng hơn. Một trong những tính năng này là liên kết Mô hình tuyến đường, vì vậy thay vì sử dụng khóa chính của bảng để tìm nạp dữ liệu của một mục, chúng ta có thể tận dụng lợi thế của liên kết mô hình tuyến đường như bên dưới

 

Hãy chứng minh điều này bằng một ví dụ. Hãy xem xét chúng tôi có một bảng bài viết và chúng tôi có một mô hình bài đăng. Để hiển thị bài đăng theo id, chúng ta có thể làm như thế này

// the route parameter is the id of the post
// for example http://example.com/posts/53
Route::get('posts/{id}', function ($id) {

    // we have to find the post using the $id
    $post = Post::find($id);

    // if there is no post, 404
    if (!$post) return abort(404);

    // return the view and the post
    return view('post.show', compact('post'));
});

Trong đoạn mã trên, trước tiên, chúng tôi truy vấn bài đăng theo id, sau đó kiểm tra xem nó đã tồn tại chưa, cuối cùng chúng tôi đã hiển thị chế độ xem

Để đơn giản hóa mọi thứ hơn một chút

// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});

Nhưng với Route Model Binding, chúng ta có thể đơn giản hóa việc này như hình bên dưới

// by using $post, we can inject the Post object
Route::get('posts/{post}', function ($post) {

    // we now have access to the $post object! no code necessary

    // return the view and the post
    return view('post.show', compact('post'));
});

Vì vậy, trong đoạn mã trên, Laravel sẽ đưa một mô hình Post vào bất kỳ bộ điều khiển tuyến đường nào có tham số {post} được đính kèm với nó.

 

Các loại liên kết mô hình tuyến đường

  • Ràng buộc mô hình ngầm định
  • Ràng buộc mô hình rõ ràng

 

Ràng buộc mô hình ngầm định

Chỉ cần gõ một tham số trong route Closure (hoặc phương thức điều khiển của bạn) và đặt tên cho tham số giống với tham số route, và nó sẽ tự động coi nó như một liên kết mô hình route

Route::get('posts/{post}', function (App\Post $post) {
    // be awesome. enjoy having the $post object
});

Laravel đủ thông minh để biết rằng vì một mô hình

// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
0 đang được đưa vào phần đóng của bộ điều khiển, nên nó sẽ lấy tham số
// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
1 từ tuyến đường và lấy thông tin chi tiết cho người dùng

Bây giờ bạn có thể truy cập bài đăng dưới dạng http. //thí dụ. com/bài viết/3

 

Nhưng nếu bạn muốn sử dụng khóa định tuyến khác với id thì sao?. Bạn có thể làm điều này thông qua

// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
2 trong mô hình Eloquent

// here we used a slug instead of the 
// id in the route model binding

class Post extends Model {
    
    public function getRouteKeyName() {
        return 'slug';
    }
}

Sau đó, chúng tôi có thể truy cập tuyến đường của mình bằng cách sử dụng

// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
3 thay vì
// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
4

 

Ràng buộc mô hình rõ ràng

Bạn phải nói rõ ràng với laravel rằng bạn muốn nó liên kết một tham số url với một mô hình cụ thể. Có hai cách để thực hiện việc này, chúng ta có thể liên kết tham số với mô hình bằng cách sử dụng mặt tiền

// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
5 được cung cấp hoặc thực hiện liên kết này trong
// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
6

Sử dụng Mặt tiền // the route parameter is the id of the post // for example http://awesome.dev/posts/53 Route::get('posts/{id}', function ($id) { // find the post or 404 if not found $post = Post::findOrFail($id); // return the view and the post return view('post.show', compact('post')); });5

Route::bind('post', 'App\Post');

Sử dụng // the route parameter is the id of the post // for example http://awesome.dev/posts/53 Route::get('posts/{id}', function ($id) { // find the post or 404 if not found $post = Post::findOrFail($id); // return the view and the post return view('post.show', compact('post')); });8

Sự khác biệt duy nhất giữa việc sử dụng lớp

// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
5 và lớp
// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
8 là – việc đăng ký các ràng buộc của bạn được thực hiện trong phương thức
// by using $post, we can inject the Post object
Route::get('posts/{post}', function ($post) {

    // we now have access to the $post object! no code necessary

    // return the view and the post
    return view('post.show', compact('post'));
});
1 của lớp
// the route parameter is the id of the post
// for example http://awesome.dev/posts/53
Route::get('posts/{id}', function ($id) {

    // find the post or 404 if not found
    $post = Post::findOrFail($id);

    // return the view and the post
    return view('post.show', compact('post'));
});
8 (vị trí là thư mục
// by using $post, we can inject the Post object
Route::get('posts/{post}', function ($post) {

    // we now have access to the $post object! no code necessary

    // return the view and the post
    return view('post.show', compact('post'));
});
3) và phương thức
// by using $post, we can inject the Post object
Route::get('posts/{post}', function ($post) {

    // we now have access to the $post object! no code necessary

    // return the view and the post
    return view('post.show', compact('post'));
});
4 được gọi trên đối tượng
// by using $post, we can inject the Post object
Route::get('posts/{post}', function ($post) {

    // we now have access to the $post object! no code necessary

    // return the view and the post
    return view('post.show', compact('post'));
});
5 được đưa vào phương thức

public function boot(Router $router)
{
    parent::boot($router);

    $router->bind('post', function ($value) {
        return App\Post::find($value)->where('status', '=', 'published')->first();
    });
}

 

Ngoại lệ tùy chỉnh cho ràng buộc mô hình tuyến đường

Bạn cũng có thể tùy chỉnh các ngoại lệ mà các liên kết mô hình định tuyến đưa ra (ví dụ: nếu chúng không thể tìm thấy phiên bản của mô hình đó) bằng cách chuyển một Đóng làm tham số thứ ba

$router->model('posts', 'App\Post', function () {
    throw new NotFoundHttpException;
});

 

Phần kết luận

Như bạn đã thấy trong hướng dẫn này, Ràng buộc mô hình định tuyến giúp bạn không phải viết nhiều mã mà bạn phải lặp lại hàng ngày trong các hành động tìm nạp một bản ghi duy nhất, nó cũng làm cho mã dễ đọc và có tổ chức hơn

Liên kết mô hình tuyến đường nào được hỗ trợ trong Laravel?

Laravel hiện hỗ trợ hai loại liên kết mô hình định tuyến. Chúng ta có. Ràng buộc mô hình ngầm định . ràng buộc mô hình rõ ràng .

Tuyến điều khiển trong Laravel là gì?

Bộ điều khiển tài nguyên . Ví dụ: bạn có thể muốn tạo bộ điều khiển xử lý tất cả các yêu cầu HTTP cho "ảnh" được ứng dụng của bạn lưu trữ. assigns the typical "CRUD" routes to a controller with a single line of code. For example, you may wish to create a controller that handles all HTTP requests for "photos" stored by your application.

Làm cách nào để truyền dữ liệu từ tuyến điều khiển trong Laravel?

Chúng ta có thể truyền dữ liệu trực tiếp từ các tuyến đường hoặc thông qua bộ điều khiển. .
Sử dụng chế độ xem()
Sử dụng với()
Sử dụng nhỏ gọn()
Sử dụng lớp điều khiển

Cách chính xác để đính kèm phương thức điều khiển vào một tuyến đường cụ thể trong Laravel là gì?

Bạn có thể xác định tuyến đường đến phương thức điều khiển này như sau. sử dụng App\Http\Controllers\UserController; Route. get('/user/{id}', [UserController. lớp, 'hiển thị']);