Передать несколько необязательных параметров в Laravel 9

Я пытаюсь создать маршрут, который принимает один из двух параметров. Однако дд возвращает мне $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'
    })}

Не существует практического способа отличить myroute/thisisB от myroute/thisisA, вам нужен альтернативный подход. Возможно, вы слишком много требуете от своего маршрута.

apokryfos 18.03.2022 12:54

Я нашел обходной путь: $url = "{{ route('test.testFunction', ['a'=>'null', 'b'=>':b']) }}"; Но это делает использование необязательных параметров бессмысленным

pnonnen 18.03.2022 13:00

Да, такое связывание необязательных параметров никогда не поддерживалось в 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).

Tim Lewis 18.03.2022 14:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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). Спасибо за ответ, жаль, что его еще нет.

pnonnen 18.03.2022 14:20

Да точно, только с GET-запросом вместо POST-запроса :)

Aless55 18.03.2022 14:32

Другие вопросы по теме