Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.02.2022 13:44:26

Редирект в route (синтаксис)

Всем доброго дня!
Помогите новичку разобраться с синтаксисом 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');
        }
    }

Помогите разобраться, что я делаю не правильно?
Любая помощь новичку будет важна и полезна: методическая, ссылка на док или правка кода. Заранее спасибо!

Не в сети

#2 05.02.2022 17:46:30

Re: Редирект в route (синтаксис)

На всякий случай укажи версию Laravel и php.

А теперь распиши по шагам, что по-твоему делает данный код:

public function getRandomProduct()
    {
        $product = Products::getRandomProduct();
        if ($product) {
           return view('product', $product);
        } else {
            abort('404');
        }
    }

Не в сети

#3 05.02.2022 19:52:06

Re: Редирект в route (синтаксис)

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
        }
    }

Не в сети

#4 07.02.2022 10:35:18

Re: Редирект в route (синтаксис)

Здесь у тебя скоуп? Убедись, что он возвращает то, что ты хочешь.

$product = Products::getRandomProduct();

Та же самая ошибка: InvalidArgumentExceptionAction App\Http\Controllers\AppController@getRandomProduct not defined.

А теперь подумай, откуда Laravel возьмёт url ?
У тебя нигде не задан url, на который ты должен сделать редирект и вывести рандомный продукт на странице.

Ну и параметры ты должен передать согласно документации:

return redirect()->action(
    [UserController::class, 'profile'], ['id' => 1]
);

Не в сети

Подвал раздела