laravel Неможливо підготувати маршрут ... для серіалізації. Використовує закриття


84

Коли я очищаю кеш-пам’яті у своєму проекті Laravel 5.2, я бачу таке повідомлення про помилку:

[LogicException] Не вдається підготувати маршрут [панель] до серіалізації. Використовує закриття.

Я думаю, що це пов’язано з маршрутом

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

пов'язаний з певним методом у моєму контролері:

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)); 
}`

Коротше кажучи, з головного подання я передаю $ slug, тобто коротке посилання на статтю, з $ slug, який є унікальним у базі даних, я ідентифікую запис, а потім передаю його вміст до детального подання.

У мене не було жодних проблем, коли я писав метод, насправді він працював як шарм, але після того, як я очистив кеш-пам'ять, я отримую цю помилку, і посилання в основному поданні не відображають жодного шорткоду.

Де я роблю неправильно?


Будь ласка, відредагуйте своє запитання, щоб включити решту ваших маршрутів (особливо панельний)
Кріс Форренс,

Відповіді:


133

Я думаю, що це пов’язано з маршрутом

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

пов'язаний з певним методом у моєму контролері:

Ні, це не це. Повідомлення про помилку надходить від route:cacheкоманди, не впевнений, чому очищення кешу викликає це автоматично.

Проблема полягає в маршруті, який використовує Закриття замість контролера, який виглядає приблизно так:

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

Оскільки Закриття не можна серіалізувати, Ви не можете кешувати свої маршрути, коли у Вас є маршрути, які використовують закриття.


3
отже, команда => php artisan route: кеш не працює на laravel? Жук?
Роббспін

3
@robspin Я не думаю, що це помилка, оскільки це прямо сказано в документах Laravel laravel.com/docs/5.7/deployment#optimization (перевірте розділ Оптимізація завантаження маршруту)
Анатолій Архипов

4
Оскільки ця функція використовує серіалізацію PHP, ви можете кешувати маршрути лише для програм, які використовують виключно маршрутизатори на основі контролера. PHP не може серіалізувати закриття. Тому не використовуйте php artisan route: кеш - це правильний шлях! Просто використовуйте кеш-пам’ять php: clear
robspin

2
отже, будь-яке рішення?
zukijuki

1
див. рішення IBRAHIM EZZAT нижче. По суті, потрібно замінити будь-яке закриття методами контролера у файлах маршрутів
Alistair R

52

Якщо жоден із ваших маршрутів не містить перекриття, але ви все ще отримуєте цю помилку, перевірте

маршрути / api.php

У наведеному вище файлі Laravel має за замовчуванням автентифікуючий api-маршрут.

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

який можна прокоментувати або замінити методом виклику контролера, якщо потрібно.


37

Це, безумовно, помилка. Ларавел пропонує заздалегідь визначений код у маршрутах / api.php

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

який не може бути оброблений:

php artisan route:cache

Це однозначно має виправити команда Laravel. (Перевірте посилання ),

просто якщо ви хочете це виправити, вам слід замінити код route \ api.php на щось, наприклад:

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

а в UserController помістіть цей метод:

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

2
Насправді здається помилкою. Якщо вони дозволяють використовувати замикання на маршрутах, вони повинні виправити команди майстра, щоб вони принаймні не давали помилок.
Арно ван Оордт

Ось відповідний PR, який був закритий :( github.com/laravel/laravel/pull/4601
Вільям

7

Фактичним рішенням цієї проблеми є зміна першого рядка в web.php

Просто замініть вітальний маршрут наступним маршрутом

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

Якщо все одно отримуєте таку ж помилку, ніж ви ймовірно


6

Перевірте свої маршрути / web.php та routes / api.php

Laravel постачається із закритим маршрутом за замовчуванням у routes / web.php:

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

та маршрути / api.php

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

якщо ви видалите це, спробуйте ще раз очистити кеш маршруту.


4

рішення, коли ми використовуємо такі маршрути:

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

laravel називають їх Закриттям, щоб Ви не могли оптимізувати використання маршрутів, оскільки Закриття Ви повинні направити до контролера, щоб використовувати php artisan optimize


2

Якщо хтось все ще шукає відповіді, для мене проблема полягала у файлі routes / web.php. Приклад:

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

Це також маршрут, так що так ... Просто видаліть його, якщо це не потрібно, і ви готові їхати! Ви також повинні слідувати відповідям, наданим вище.


1
Привіт Аліне Матос, не проблема. Мені знадобився цілий день, щоб зрозуміти, що не так ... Радий, що це допомогло.
DM розвивається

4
що якщо це потрібно?
Азіз

1
@Aziz просто перенесіть його в контролер
Binar Web

0

переконайтесь, що у файлі web.php є це розширення

use Illuminate\Support\Facades\Route;

моя проблема вирішена таким чином.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.