Laravel по-русски

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

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

#1 20.06.2018 15:18:16

Связь формы с маршрутом

Есть несколько форм запроса, каждая обрабатывается определённым методом одного (для всех этих методов) контроллера. Обращения к методам контроллера задаётся в самой форме запроса. При попытке прописать роуты с одним и тем же URI, но с разными именами выпадает ошибка Route [имя роута] not defined.
Причём, если в запросы прописать обращение только к последнему роуту в файле маршрутов, то ошибки нет.

Обращение к роуту:

<form class="form-signin" method="post" action="{{route('имя роута')}}"> // Например, route('ааа')

Контроллер:
class MyController extends Controller
{
    public function aaa(Request $request){
        print ('route A');
    }

    public function bbb(Request $request){
        print ('route B');
    }
}
Роуты:

    Route::post('/My', array('as' => 'aaa', 'uses' => 'MyController@aaa'));
    Route::post('/My', array('as' => 'bbb', 'uses' => 'MyController@bbb'));
 
Причём, если указать в форме запроса имя роута "bbb", либо в "aaa" изменить URI, то ошибки не возникает.
Как работает эта схема вообще, подскажите, плз. Мне не нужно, чтобы у меня в адресной строке URI менялся, можно без него в данном случае вообще обойтись?

Не в сети

#2 21.06.2018 09:33:20

AlexForever
Откуда: Кишинев
Сообщений: 31

Re: Связь формы с маршрутом

Тогда вам придется сделать обработку данных форм в одном методе, если не хотите менять URI.

Не в сети

#3 22.06.2018 07:47:01

Re: Связь формы с маршрутом

Спасибо за ответ. Это понятно, что пути обхода можно разные придумать, но это "огород", имхо. Да и вообще, наверное, в самой форме давать ссылку на маршрут безграмотно?
Вопрос-то в другом, в чём ошибка такой логики вообще?

Не в сети

#4 22.06.2018 09:44:27

Re: Связь формы с маршрутом

Если отбросить подробности, у вас ссылка (адрес в форме) в итоге будет /my. Как по вашему, после отпраки данных, Laravel должен будет понять к какому контроллеру вы хотите обратиться? К aaa или bbb? Это явный конфликт и в Laravel это решается перезаписью маршрута на последний.

Изменено FrDR (22.06.2018 09:58:17)

Не в сети

#5 22.06.2018 10:00:24

Re: Связь формы с маршрутом

Как по вашему, после отпраки данных, Laravel должен будет понять к какому контроллеру вы хотите обратиться? К aaa или bbb?

Ну, я так понимаю, по имени маршрута, 'as' => 'aaa' или 'as' => 'bbb'. Ну, или если в другом формате записать:
Route::post('/My', 'MyController@aaa')->name('aaa');
Route::post('/My', 'MyController@bbb')->name('bbb');
А ссылка одна и та же, контроллер один и тот же, просто методы в нём выполняются разные. Такого разве не может быть?

Я вот так понимаю, как это работает: по ссылке на имя маршрута ищется этот маршрут, а сам URI может быть каким угодно. Этот URI он что вообще определяет? Я подставляю туда кракозябру вообще, ни папки такой с какими-то скриптами, ни исполняемых фалов таких нет. Иначе говоря, внешне только видно, что формируется просто адресная строка без каких-либо действий. Так вот какой в нём тайный смысл в URI этом?

Изменено SeriyKot (22.06.2018 10:18:59)

Не в сети

#6 22.06.2018 10:07:13

Re: Связь формы с маршрутом

Имя маршрута это лишь помощь для вас, чтобы вы могли писать route('aaa'), вместо например action('MyController@aaa'). Итоговая ссылка (действие формы, action) у вас будет именно /my и ничего больше.

Не в сети

#7 22.06.2018 10:30:33

Re: Связь формы с маршрутом

В общем, примерно понял почему так и как это работает. Если обращение к маршруту идёт изнутри кода, то ссылка на имя маршрута. Если же из адресной строки, то ссылка на этот URI. Например, форму можно было бы задать так:
<form class="form-signin" method="post" action="имя_сайта/My">
и выполнился бы маршрут с URI '/My', который поэтому должен быть уникальным. Верно?

Изменено SeriyKot (22.06.2018 10:32:56)

Не в сети

#8 22.06.2018 10:54:28

Re: Связь формы с маршрутом

Когда вы вызываете route('aaa') происходит преобразование вашего обращения в урл. На выходе это тоже самое, что и если в форме вы напишите action='/my'

Когда приходит внешний запрос, то наоборот, происходит преобразование урл в ваше действие контроллера. И тут понятно, что url должен быть воспринят однозначно.

И там и там есть промежуточное звено, которое проверяет уникальность url, при необходимости перезаписывает, кидает ошибки типа Route [имя роута] not defined, чтобы предостеречь вас и дать вам понять, что выполнится на самом деле метод bbb. И вы не искали ошибку в aaa. Маршрута aaa, как бы теперь вообще не существует.

Не в сети

#9 22.06.2018 11:52:47

Re: Связь формы с маршрутом

Всё понял, спасибо smile

Кстати, если я делаю 2 роута с одинаковым URI, но с разными методами вызова - для показа формы get, для обработки post, то laravel не путается и однозначно определяет маршрут, который следует выполнить при вызове из адресной строки (соответственно, get), и по имени роута изнутри. Но вот вопрос, если я в самой форме не буду делать метод "action" вообще, каким образом laravel "узнаёт", что данные для обработки вызываемого метода в маршруте с post нужно взять из маршрута с get? Я правильно понял, что в таком случае вызов формы и её обработка как раз связаны этим одинаковым URI?
Просто сейчас вот изучаю, как, например, делать авторизацию.
В первом маршруте указан вызов формы в методе контроллера:
    Route::get('/login', 'Auth\LoginController@showLoginForm');
во втором обработка:
    Route::post('/login', 'Auth\LoginController@login')->name('login');
И я не могу понять, как они связаны, ведь в методе обработки формы никаких указателей на саму форму нет. И в самой форме на роут с методом обработки тоже. Неужели потому что у них одинаковый URI?

Не в сети

#10 22.06.2018 12:20:00

Re: Связь формы с маршрутом

если я в самой форме не буду делать метод "action" вообще, каким образом laravel "узнаёт", что данные для обработки вызываемого метода в маршруте с post нужно взять из маршрута с get?

Это не Laravel определяет, а браузер. Если маршрут в action не задан, то отправка производится по адресу страницы. Get это или Post определяет атрибут method. Если и method не задан, то используется Get.

...ведь в методе обработки формы никаких указателей на саму форму нет. И в самой форме на роут с методом обработки тоже...

Auth\LoginController использует трейт Illuminate\Foundation\Auth\AuthenticatesUsers:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers; //<----------------------------------Trait

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers; //<----------------------------------------------------------Trait

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
}

Код трейта можете посмотреть тут:
/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

В нем и определены методы showLoginForm, login, etc.

Изменено FrDR (22.06.2018 12:23:25)

Не в сети

#11 22.06.2018 12:56:33

Re: Связь формы с маршрутом

Это не Laravel определяет, а браузер. Если маршрут в action не задан, то отправка производится по адресу страницы. Get это или Post определяет атрибут method. Если и method не задан, то используется Get.

Понял, спасибо smile

Изменено SeriyKot (22.06.2018 12:57:19)

Не в сети

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