laravel Không thể chuẩn bị tuyến đường… để tuần tự hóa. Sử dụng Đóng cửa


81

Khi tôi xóa bộ nhớ đệm trong dự án Laravel 5.2 của mình, tôi thấy thông báo lỗi này:

[LogicException] Không thể chuẩn bị tuyến đường [bảng điều khiển] để tuần tự hóa. Sử dụng Đóng cửa.

Tôi nghĩ rằng nó liên quan đến một tuyến đường

Route::get('/article/{slug}', 'Front@slug');

được liên kết với một phương thức cụ thể trong bộ điều khiển của tôi:

public function slug($slug) {
    $article = Article::where('slug',$slug)->first();

    $id = $article ->id_article ;

    if ( ($article=== null) || (is_null($id)) ) return view('errors/Db');

    else return view('detail')->with(array('article'=> $article,  'title'=>'My title - '.$article->title)); 
}`

Tóm lại, từ chế độ xem chính, tôi chuyển $ slug, đó là một liên kết ngắn đến bài viết, với $ slug, là duy nhất trong cơ sở dữ liệu, tôi xác định bản ghi và sau đó tôi chuyển nội dung của nó vào chế độ xem chi tiết.

Tôi không gặp bất kỳ vấn đề gì khi viết phương thức, nó hoạt động như một sự quyến rũ, nhưng sau khi tôi làm sạch bộ nhớ cache, tôi gặp lỗi đó và các liên kết trong chế độ xem chính không hiển thị bất kỳ mã ngắn nào.

Tôi đang làm sai ở đâu?


Hãy chỉnh sửa câu hỏi của bạn để bao gồm các phần còn lại của tuyến đường của bạn (đặc biệt là các tuyến đường panel)
Chris Forrence

Câu trả lời:


130

Tôi nghĩ rằng nó liên quan đến một tuyến đường

Route::get('/article/{slug}', 'Front@slug');

được liên kết với một phương thức cụ thể trong bộ điều khiển của tôi:

Không, đấy không phải nó. Thông báo lỗi đến từ route:cachelệnh, không rõ tại sao việc xóa bộ nhớ cache lại gọi điều này tự động.

Vấn đề là một tuyến sử dụng một Đóng thay vì một bộ điều khiển, trông giống như sau:

//                       Thats the Closure
//                             v 
Route::get('/some/route', function() {
    return 'Hello World';
});

Vì Closures không thể được tuần tự hóa, bạn không thể lưu vào bộ nhớ cache của các tuyến khi bạn có các tuyến sử dụng các hàm đóng.


3
vậy lệnh => php Artian route: cache không hoạt động trên laravel? một lỗi?
robspin

3
@robspin Tôi không nghĩ rằng đó là một lỗi, vì nó nói rõ ràng trong Laravel docs laravel.com/docs/5.7/deployment#optimization (phần kiểm tra tối ưu hóa Route tải)
Anatoliy Arkhipov

4
Vì tính năng này sử dụng tuần tự hóa PHP, bạn chỉ có thể lưu vào bộ đệm các tuyến cho các ứng dụng sử dụng riêng các tuyến dựa trên bộ điều khiển. PHP không thể tuần tự hóa Closures. Vì vậy, không sử dụng tuyến đường nghệ nhân php: bộ nhớ cache là cách đúng! Chỉ cần sử dụng bộ nhớ cache php nghệ nhân: rõ ràng
robspin

2
vì vậy, bất kỳ giải pháp?
zukijuki

xem giải pháp IBRAHIM EZZAT bên dưới. Về cơ bản cần phải thay thế bất kỳ đóng cửa với các phương pháp điều khiển trong các tập tin tuyến đường của bạn
Alistair R

51

Nếu không có tuyến đường nào của bạn bị đóng, nhưng bạn vẫn gặp lỗi này, vui lòng kiểm tra

route / api.php

Laravel có một tuyến api xác thực mặc định trong tệp trên.

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

có thể được nhận xét hoặc thay thế bằng phương thức gọi tới bộ điều khiển nếu được yêu cầu.


34

Đây chắc chắn là một lỗi .aravel cung cấp mã được xác định trước trong các tuyến / api.php

Route::middleware('auth:api')->get('/user', function (Request $request) { 
     return $request->user(); 
});

không được phép xử lý bởi:

php artisan route:cache

Điều này chắc chắn sẽ được nhóm Laravel khắc phục. (Kiểm tra liên kết ),

đơn giản là nếu bạn muốn sửa nó, bạn nên thay thế mã route \ api.php bằng một số thứ như:

Route::middleware('auth:api')->get('/user', 'UserController@AuthRouteAPI');

và trong UserController đặt phương thức này:

 public function AuthRouteAPI(Request $request){
    return $request->user();
 }

1
Có vẻ như thực sự là một lỗi. Nếu họ có thể sử dụng các bao đóng trong các tuyến thì họ nên sửa các lệnh thủ công để ít nhất chúng không đưa ra bất kỳ lỗi nào.
Arno van Oordt

Đây là PR có liên quan, đã bị đóng :( github.com/laravel/laravel/pull/4601
William Turrell

6

Kiểm tra các tuyến đường / web.phpcác tuyến đường / api.php của bạn

Laravel đi kèm với tính năng đóng tuyến mặc định trong các route / web.php:

Route::get('/', function () {
    return view('welcome');
});

và các tuyến đường / api.php

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

nếu bạn xóa nó thì hãy thử lại để xóa bộ nhớ cache của tuyến đường.


6

Giải pháp thực tế của vấn đề này là thay đổi dòng đầu tiên trong web.php

Chỉ cần thay thế tuyến Chào mừng bằng tuyến sau

Route::view('/', 'welcome');

Nếu vẫn gặp lỗi tương tự như bạn thử nghiệm


4

sự cạn kiệt khi chúng ta sử dụng các tuyến đường như thế này:

Route::get('/', function () {
    return view('welcome');
});

laravel gọi chúng là Đóng cửa để bạn không thể tối ưu hóa các tuyến sử dụng vì Đóng cửa, bạn phải định tuyến đến bộ điều khiển để sử dụng php artisan optimize


2

Nếu ai đó vẫn đang tìm kiếm câu trả lời, đối với tôi, vấn đề nằm trong tệp tin route / web.php. Thí dụ:

Route::get('/', function () {
    return view('welcome');
});

Nó cũng là Route, nên vâng ... Chỉ cần loại bỏ nó nếu không cần thiết và bạn có thể đi! Bạn cũng nên làm theo các câu trả lời được cung cấp ở trên.


1
Xin chào Aline Matos, không sao. Tôi đã mất cả ngày để tìm ra điều gì sai ... Rất vui vì nó đã giúp được.
DM phát triển

4
nếu cần thì sao?
Aziz

1
@Aziz chỉ cần chuyển nó vào một bộ điều khiển
Binar Web

0

kiểm tra xem tệp web.php của bạn có phần mở rộng này không

use Illuminate\Support\Facades\Route;

vấn đề của tôi đã được khắc phục bằng cách này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.