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 Show
Trình điều khiển trò chơi hiện tạiTạ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
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 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
để này
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 Đ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 đườngTrong 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 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
Các loại liên kết mô hình tuyến đường
Ràng buộc mô hình ngầm địnhChỉ 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àngBạ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')); });5Route::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')); });8Sự 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 đườngBạ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ậnNhư 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ị']); |