Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть несколько форм запроса, каждая обрабатывается определённым методом одного (для всех этих методов) контроллера. Обращения к методам контроллера задаётся в самой форме запроса. При попытке прописать роуты с одним и тем же 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 менялся, можно без него в данном случае вообще обойтись?
Не в сети
Тогда вам придется сделать обработку данных форм в одном методе, если не хотите менять URI.
Не в сети
Спасибо за ответ. Это понятно, что пути обхода можно разные придумать, но это "огород", имхо. Да и вообще, наверное, в самой форме давать ссылку на маршрут безграмотно?
Вопрос-то в другом, в чём ошибка такой логики вообще?
Не в сети
Если отбросить подробности, у вас ссылка (адрес в форме) в итоге будет /my. Как по вашему, после отпраки данных, Laravel должен будет понять к какому контроллеру вы хотите обратиться? К aaa или bbb? Это явный конфликт и в Laravel это решается перезаписью маршрута на последний.
Изменено FrDR (22.06.2018 09:58:17)
Не в сети
Как по вашему, после отпраки данных, 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)
Не в сети
Имя маршрута это лишь помощь для вас, чтобы вы могли писать route('aaa'), вместо например action('MyController@aaa'). Итоговая ссылка (действие формы, action) у вас будет именно /my и ничего больше.
Не в сети
В общем, примерно понял почему так и как это работает. Если обращение к маршруту идёт изнутри кода, то ссылка на имя маршрута. Если же из адресной строки, то ссылка на этот URI. Например, форму можно было бы задать так:
<form class="form-signin" method="post" action="имя_сайта/My">
и выполнился бы маршрут с URI '/My', который поэтому должен быть уникальным. Верно?
Изменено SeriyKot (22.06.2018 10:32:56)
Не в сети
Когда вы вызываете route('aaa') происходит преобразование вашего обращения в урл. На выходе это тоже самое, что и если в форме вы напишите action='/my'
Когда приходит внешний запрос, то наоборот, происходит преобразование урл в ваше действие контроллера. И тут понятно, что url должен быть воспринят однозначно.
И там и там есть промежуточное звено, которое проверяет уникальность url, при необходимости перезаписывает, кидает ошибки типа Route [имя роута] not defined, чтобы предостеречь вас и дать вам понять, что выполнится на самом деле метод bbb. И вы не искали ошибку в aaa. Маршрута aaa, как бы теперь вообще не существует.
Не в сети
Всё понял, спасибо
Кстати, если я делаю 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?
Не в сети
если я в самой форме не буду делать метод "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)
Не в сети
Это не Laravel определяет, а браузер. Если маршрут в action не задан, то отправка производится по адресу страницы. Get это или Post определяет атрибут method. Если и method не задан, то используется Get.
Понял, спасибо
Изменено SeriyKot (22.06.2018 12:57:19)
Не в сети
Страницы 1