Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем доброго дня!
Помогите новичку разобраться с синтаксисом Route.
Задача: При вводе URL, например, http://site.ru/random должна отображаться случайная страница товара.
При этом URL в браузере тоже должен меняться на URL этой случайной страницы, ну например на http://site.ru/product/123, т.е. редирект 301.
Как работает сейчас:
в файле web.php
Route::get('/random', [AppController::class, 'getRandomProduct']);
Перенаправляет на случайную страницу, но в браузере URL остается тот же http://site.ru/random.
Команда php artisan route:list показывает этот маршрут и в Action прописан правильно контроллер.
Теперь я хочу сделать редирект. Меняю Route. Для теста сначала хочу просто перенаправить на главную страницу
Route::get('/random', function() {
return redirect()->action([AppController::class, 'getIndexPage']);
});
Этот код работает, перенаправляет на главную и URL в браузере меняется. Но в route:list Action теперь Closer, он не видит контроллер.
Ну и когда подключаю нужный котроллер к Route
Route::get('/random', function() {
return redirect()->action([AppController::class, 'getRandomProduct']);
});
То Laravel показывает ошибку:
InvalidArgumentException
Action App\Http\Controllers\AppController@getRandomProduct not defined.
И в route:list Action теперь тоже Closer, он не видит контроллер.
Пробовал посмотреть URL который возвращает контроллер, как описано в доках:
$url = action([AppController::class, 'getRandomProduct']);
Та же самая ошибка: InvalidArgumentException
Action App\Http\Controllers\AppController@getRandomProduct not defined.
Код контроллера:
public function getRandomProduct()
{
$product = Products::getRandomProduct();
if ($product) {
return view('product', $product);
} else {
abort('404');
}
}
Помогите разобраться, что я делаю не правильно?
Любая помощь новичку будет важна и полезна: методическая, ссылка на док или правка кода. Заранее спасибо!
Не в сети
На всякий случай укажи версию Laravel и php.
А теперь распиши по шагам, что по-твоему делает данный код:
public function getRandomProduct()
{
$product = Products::getRandomProduct();
if ($product) {
return view('product', $product);
} else {
abort('404');
}
}
Не в сети
Laravel 8.10.0
PHP 7.4.11
public function getRandomProduct()
{
$product = Products::getRandomProduct(); // Из БД выбирает случайную запись, и возвращает в массиве title, producty_name и др. поля, иначе false
if ($product) { // проверка, есть ли в массиве записи, можно было бы и if (empty($product)) или if (count($product)) это не важно
return view('product', $product); // подключает шаблон Blade для отображения, передает туда массив
} else {
abort('404'); // если из БД ничего не выбрано то выводится шаблон для страницы ошибки 404
}
}
Не в сети
Здесь у тебя скоуп? Убедись, что он возвращает то, что ты хочешь.
$product = Products::getRandomProduct();
Та же самая ошибка: InvalidArgumentExceptionAction App\Http\Controllers\AppController@getRandomProduct not defined.
А теперь подумай, откуда Laravel возьмёт url ?
У тебя нигде не задан url, на который ты должен сделать редирект и вывести рандомный продукт на странице.
Ну и параметры ты должен передать согласно документации:
return redirect()->action(
[UserController::class, 'profile'], ['id' => 1]
);
Не в сети
Страницы 1