Я пытаюсь создать маршрут, который принимает один из двух параметров. Однако дд возвращает мне $b_id, null
вместо null, $b_id
. Как я могу передать только b в качестве параметра и опустить a?
веб.php
Route::get('myroute/{a?}/{b?}', [MyController::class, 'testFunction'])
->name('test.testFunction');
Контроллер
public function testFunction( $a = null, $b = null)
{
dd($a, $b);
// stuff
}
Аякс вызов
function test($b_id) {
$url = "{{ route('test.testFunction', ':b') }}";
$url = $url.replace(":b", $b_id);
$.ajax({
url: $url,
type: 'GET'
})}
Я нашел обходной путь: $url = "{{ route('test.testFunction', ['a'=>'null', 'b'=>':b']) }}"; Но это делает использование необязательных параметров бессмысленным
Да, такое связывание необязательных параметров никогда не поддерживалось в Laravel; если вы буквально не поместите /null/1
в URL-адрес (или /0/1
, /blank/1
и т. д.), Laravel не сможет узнать, что вы намереваетесь 1
быть {b?}
вместо {a?}
. В зависимости от того, какими должны быть a
и b
, вам может быть лучше использовать параметры строки запроса, то есть ?a=&b=1
($request->input('a')
будет null
, а $request->input('b')
будет 1
).
На данный момент это невозможно, но есть обходной путь.
Вы можете передать параметры в именованном массиве и изменить маршрут на просто Route::get('myroute' ...)
:
route('test.testFunction', ['a' => 'xyz', 'b' => 'yzt'])
===== creates
http://myroute?a=xyz&b=yzt
После этого вы можете проверить, присутствуют ли параметры a
или b
, и получить их обычным образом, если они есть.
Это почти то же самое, что отправить «a» и «b» в данных и иметь testFunction (Request $ request). Спасибо за ответ, жаль, что его еще нет.
Да точно, только с GET-запросом вместо POST-запроса :)
Не существует практического способа отличить
myroute/thisisB
отmyroute/thisisA
, вам нужен альтернативный подход. Возможно, вы слишком много требуете от своего маршрута.