Laravel по-русски

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

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

#1 04.02.2022 17:17:41

Route not defined

Здравствуйте. Получаю ошибку "Route [admin_tournaments_index_edit] not defined."

В web.php есть 4 похожих маршрута:

    Route::post('/adm/tournaments',        'Adm\TournamentController@index_edit')->middleware(["admin"])->name("admin_tournaments_index_edit");
    Route::get('/adm/tournaments',        'Adm\TournamentController@index_add')->middleware(["admin"])->name("admin_tournaments_index_add");
    Route::post('/adm/tournaments',
        'Adm\TournamentController@save')->middleware(["admin"])->name("admin_tournaments_save");
    Route::post('/adm/tournaments',
        'Adm\TournamentController@edit')->middleware(["admin"])->name("admin_tournaments_edit");

В "php artisan route:list" только 2 маршрута отображается:

        | GET|HEAD  | adm/tournaments                          | admin_tournaments_index_add | App\Http\Controllers\Adm\TournamentController@index_add         | web,auth,admin |
|        | POST      | adm/tournaments                          | admin_tournaments_edit      | App\Http\Controllers\Adm\TournamentController@edit              | web,auth,admin |

вызов из blade.php:

<form method="post" action="{{ route("admin_tournaments_index_edit") }}">

Можно только по одному маршруту на каждый get или post? И как тогда переделать?

Не в сети

#2 04.02.2022 19:53:12

Re: Route not defined

Давай разберём твои маршруты и контроллеры и приведём всё это в надлежащий вид.

Покажи код вот этого контроллера:

Route::post('/adm/tournaments',        'Adm\TournamentController@index_edit')->middleware(["admin"])->name("admin_tournaments_index_edit");

Не в сети

#3 04.02.2022 23:36:33

Re: Route not defined

class TournamentController extends AdmController
{
    use ValidatesRequests;

    public function index_edit(Request $request)
    {
        $tourTypes = TournamentTypes::all();
        $oldTournament = Tournament::where("id", "=", $request->get('tournament_id'))->first();
        $accountTypes = AbstractAccount::getAllOperableAccounts();
        $tournaments = Tournament::all()->where("status", ">", -1);

        return view("adm.tournaments.index", [
            "tour_types" => $tourTypes,
            "old_tournament" => $oldTournament,
            "accountTypes" => $accountTypes,
            "tournaments" => $tournaments,
            "edit" => true
        ]);
    }
...
}

если целиком, то

<?php

namespace App\Http\Controllers\Adm;

use App\Models\Accounts\BaseAccounts\AbstractAccount;
use App\Tournament;
use App\TournamentTypes;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class TournamentController extends AdmController
{
    use ValidatesRequests;

    public function index_edit(Request $request)
    {
        $tourTypes = TournamentTypes::all();
        $oldTournament = Tournament::where("id", "=", $request->get('tournament_id'))->first();
        $accountTypes = AbstractAccount::getAllOperableAccounts();
        $tournaments = Tournament::all()->where("status", ">", -1);

        return view("adm.tournaments.index", [
            "tour_types" => $tourTypes,
            "old_tournament" => $oldTournament,
            "accountTypes" => $accountTypes,
            "tournaments" => $tournaments,
            "edit" => true
        ]);
    }

    public function index_add()
    {
        $tourTypes = TournamentTypes::all();
        $oldTournament = Tournament::where("id", ">", 0)->orderBy("id", "DESC")->first();
        $accountTypes = AbstractAccount::getAllOperableAccounts();
        $tournaments = Tournament::all()->where("status", ">", -1);

        return view("adm.tournaments.index", [
            "tour_types" => $tourTypes,
            "old_tournament" => $oldTournament,
            "accountTypes" => $accountTypes,
            "tournaments" => $tournaments,
            "edit" => false
        ]);
    }    

    public function save(Request $request)
    {

        $rules = [
            'title' => ['string', 'min:3', 'max:255'],
            'game_type' => ['integer', 'min:0'],
            'rebay' => ['array', 'nullable'],
            'win_in_match' => ['integer', 'min:0'],
            'money_type' => ['integer', 'min:0'],
            'buy_in' => ['integer', 'min:0'],
            'prize' => ['integer', 'min:0'],
            'bounty' => ['integer', 'min:0'],
            'bounty_percent' => ['integer', 'min:0'],
            'date' => ['date'],
            'registration_date' => ['date'],
            'min_players' => ['integer', 'min:1'],
            'game_time' => ['integer', 'min:0', 'max:2'],
            'regards' => ['array'],
            'color' => ['string','max:255'],
            'type_id'  => ['integer'],
            'is_repeat'  => ['integer',"nullable"],
            'is_spectate'  => ['integer',"nullable"],
        ];

        $this->validate($request, $rules);


        DB::beginTransaction();

        try {
            $tour = new Tournament();

            $tour->game_type = $request->get('game_type');
            $tour->win_in_match = $request->get('win_in_match');
            $tour->money_type = 2; // $request->get('money_type')
            $tour->title = $request->get('title');
            $tour->prize = $request->get('prize');
            $tour->bounty = $request->get('bounty');
            $tour->bounty_percent = $request->get('bounty_percent');
            $tour->buy_in = $request->get('buy_in');
            $tour->status = 0;
            $tour->date = $request->get('date');
            $tour->registration_date = $request->get('registration_date');
            $tour->game_time = $request->get('game_time');
            $tour->min_players = $request->get('min_players');
            $tour->regards = json_encode(array_filter($request->get('regards')));
            $tour->color = $request->get('color');
            $tour->type_id = $request->get('type_id');
            $tour->prize_type = $request->get('prize_type');
            $tour->is_repeat = $request->get('is_repeat') ?? 0;
            $tour->save();

            if (!$tour->generateTours()) {
                throw new \Exception("Error with generate tours");
            }

        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->route("admin_tournaments_index_add")->withErrors($e->getMessage());
        }
        DB::commit();

        //return redirect()->route("admin_tournaments_index");
        return view("adm.tournaments.tour_saved", []);
    }

    public function edit(Request $request)
    {

        $rules = [
            'title' => ['string', 'min:3', 'max:255'],
            'game_type' => ['integer', 'min:0'],
            'rebay' => ['array', 'nullable'],
            'win_in_match' => ['integer', 'min:0'],
            'money_type' => ['integer', 'min:0'],
            'buy_in' => ['integer', 'min:0'],
            'prize' => ['integer', 'min:0'],
            'bounty' => ['integer', 'min:0'],
            'bounty_percent' => ['integer', 'min:0'],
            'date' => ['date'],
            'registration_date' => ['date'],
            'min_players' => ['integer', 'min:1'],
            'game_time' => ['integer', 'min:0', 'max:2'],
            'regards' => ['array'],
            'color' => ['string','max:255'],
            'type_id'  => ['integer'],
            'is_repeat'  => ['integer',"nullable"],
            'is_spectate'  => ['integer',"nullable"],
        ];

        $this->validate($request, $rules);


        DB::beginTransaction();

        try {
            $oldTournament = Tournament::where("id", "=", $request->get('tournament_id'))->first();
            $tour = $oldTournament;            

            $tour->game_type = $request->get('game_type');
            $tour->win_in_match = $request->get('win_in_match');
            $tour->money_type = 2; // $request->get('money_type')
            $tour->title = $request->get('title');
            $tour->prize = $request->get('prize');
            $tour->bounty = $request->get('bounty');
            $tour->bounty_percent = $request->get('bounty_percent');
            $tour->buy_in = $request->get('buy_in');
            $tour->status = 0;
            $tour->date = $request->get('date');
            $tour->registration_date = $request->get('registration_date');
            $tour->game_time = $request->get('game_time');
            $tour->min_players = $request->get('min_players');
            $tour->regards = json_encode(array_filter($request->get('regards')));
            $tour->color = $request->get('color');
            $tour->type_id = $request->get('type_id');
            $tour->prize_type = $request->get('prize_type');
            $tour->is_repeat = $request->get('is_repeat') ?? 0;
            $tour->save();

            if (!$tour->generateTours()) {
                throw new \Exception("Error with generate tours");
            }

        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->route("admin_tournaments_index_edit")->withErrors($e->getMessage());
        }
        DB::commit();

        //return redirect()->route("admin_tournaments_index");
        return view("adm.tournaments.tour_edited", []);
    }    
}

Не в сети

#4 05.02.2022 10:06:52

Re: Route not defined

Предлагаю переписать данный код.
В контроллере можно создать метод index (или show) см. пример из документации 
Далее создаем метод edit - в нём осуществляем редактирование записи.(GET)
Метод update - будет отвечать за обновление записи (POST)

Необходимо вынести валидацию из контроллера в Request классы пример

<form method="post" action="{{ route("admin_tournaments_index_edit") }}">

Лучше переписать на вот это (не забываем про @csrf) :

<form method="post" action="{{ route("admin.tournaments.store") }}">

- сохранение после добавления  новой записи.

Не в сети

#5 06.02.2022 19:59:37

Re: Route not defined

Спасибо! Вместо 4-х маршрутов сделал 3, теперь пишет Route [admin_tournaments_save] not defined. Тогда должно быть только 2? Но там 3 состояния (или больше). 1 - список всех турниров, 2 - редактирование, 3 - добавление нового, 4 - сохранение. Сейчас добавления нового вообще нету, и уже не работает.
то есть, список - это "index", редактирование или добавление - это "edit" с параметром (bool edit) в request, сохранение - это "save" (с параметром, новая ли это запись, или старая - тот же bool edit в request)

сейчас такие

    Route::get('/adm/tournaments',        'Adm\TournamentController@index')->middleware(["admin"])->name("admin_tournaments_index");
    Route::post('/adm/tournaments',        'Adm\TournamentController@save')->middleware(["admin"])->name("admin_tournaments_save");
    Route::post('/adm/tournaments',        'Adm\TournamentController@edit')->middleware(["admin"])->name("admin_tournaments_edit");  

то есть, он хочет по одному на каждый get  и post?

Далее создаем метод edit - в нём осуществляем редактирование записи.(GET)

а почему "edit" - get, а не post? тогда пропадёт index? он, вроде, оставляет последний из указанных

валидацию пока не выносил

Изменено ter (06.02.2022 20:04:46)

Не в сети

#6 07.02.2022 10:03:06

Re: Route not defined

Слушай, ведь есть хороший пример в документации

то есть, он хочет по одному на каждый get  и post?

Не понимаю тебя.

Простой пример:

public function index() // выводим список постов в блоге (допустим в админке)
{
        $blogs = Post::orderBy(‘id’, ‘DESC’)->paginate(10);
        return return view('blogs.index', compact('blogs'));
}

public function edit($id) //по клику на кнопке 'редактировать' со страницы 'index' переходим во view'post.edit'
{
     $post = Post::find($id);
     return return view('post.edit', compact('blogs'));
}

Соответственно для edit - метод GET. На этой странице можем выполнить редактирование и по клику на кнопке сохранить - задействуем метод контроллера 'update' который отвечает за сохранение обновленной записи. Конечно необходима валидация, а логику выносим в сервис-классы.

->name("admin_tournaments_save")

Нэйминг через точку!

После изменений чистим кэш и делаем composer du

Не в сети

#7 07.02.2022 18:24:42

Re: Route not defined

дело не в контроллере, а в том, что не даёт повесить 3 маршрута на один контроллер.
также

задействуем метод контроллера 'update'

- это будет 3-й метод (или маршрут) (кроме index и edit), и тоже не будет работать

чем сейчас он неправильный (именно контроллер)?

Не в сети

#8 07.02.2022 18:40:41

Re: Route not defined

дело не в контроллере, а в том, что не даёт повесить 3 маршрута на один контроллер.

Тебе нужно только 2 маршрута в контроллере GET и POST. Но может быть 3й маршрут с параметрами, например

DELETE	/photos/{photo}

и т.п., см пример в документации.

class TournamentController extends AdmController

Также ты своим контроллером расширяешь AdmController - необходимо это также учитывать.

Не в сети

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