Функция Laravel с необязательным параметром

В моем веб-файле есть маршрут, который принимает $id в качестве значения для передачи функции в моем PagesController. Однако я хочу, чтобы функция по-прежнему выполнялась и отображала предполагаемую форму, даже если $id не передается функции.

файл web.php

Route::get('/request/{id}', 'PagesController@makeRequest');

Файл PagesController.php

public function makeRequest($id)
{
   if (!empty($id)){
      $target = Partner::find($id);
   }
   return view('pages.makeRequest')->with('target', $target);
}

makeRequest.blade.php

<input type = "text" class = "form-control" value = "{{$target->inst_name}}" required disabled>  

Я хочу, чтобы на странице отображались сведения из базы данных с идентификатором $, если он указан, или были пустые места, если идентификатор $ не указан.

Поможет ли laravel.com/docs/5.7/routing#параметры-необязательные параметры? (И не забудьте сделать параметр метода необязательным/назначить его по умолчанию)

brombeer 19.02.2019 11:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
20 754
7

Ответы 7

Как указано в документации Laravel: используйте Дополнительные параметры следующим образом:

Route::get('/request/{id?}', 'PagesController@makeRequest'); //Optional parameter

Контроллер

public function makeRequest($id = null)
    {
        if (!empty($id)){
            $target = User::find($id);
            return view('pages.makeRequest')->with('target', $target); 
        } else {
            return view('pageslist'); ///set default list..
        }        
    }

Спасибо за ваш ответ. Я только что попробовал и получил ошибку. ``` Слишком мало аргументов для функции App\Http\Controllers\PagesController::makeRequest(), передано 0 и ровно 1 ожидается ```

Nana Qhuacy 19.02.2019 11:55

вы передали идентификатор в своем URL-адресе?

BILAL MALIK 19.02.2019 12:06

Я хочу, чтобы он работал как для экземпляров, т.е. переменная прошла или нет.

Nana Qhuacy 19.02.2019 12:10

Для необязательного идентификатора передачи параметра с ? в маршруте и укажите $id = null в параметре вашей функции следующим образом:

Route::get('/request/{id?}', 'PagesController@makeRequest'); //Optional parameter

makeRequest($id = null) {

// Code here...
...

}


в вашем файле маршрутов (web.php, как указано в вашем вопросе)

Route::get('/request/{id?}', 'PagesController@makeRequest');

и в вашем контроллере PagesController.php

public function makeRequest($id = null)
{

}

Чтобы узнать больше об этом, просто прочитайте https://laravel.com/docs/5.7/routing#параметры-необязательные параметры

Вы можете использовать параметр по желанию:

Route::get('/request/{id?}', 'PagesController@makeRequest');

Теперь, поскольку параметр является необязательным, при определении функции контроллера вам необходимо присвоить значение по умолчанию null в объявлении аргумента.

<?php 

public function makeRequest($id = null)
{
   if ($id){

        $target = Partner::findOrFail($id);

        return view('pages.makeRequest')->with(compact('target'));
   }

   // Return different view when id is not present
   // Maybe all targets if you want

   $targets = Partner::select('column1', 'column2')->get();

   return view('pages.all')->with('targets');

}

Я использую findOrFail вместо find. Это очень удобная функция Laravel, которая автоматически генерирует исключение ModelNotFound, а для внешнего пользователя выдает простую страницу 404.

Поэтому, если кто-то обращается к www.url.com/request/2, это действительный идентификатор, тогда он покажет действительную страницу с данными. Если получен доступ к URL-адресу www.url.com/request/blahblah, он выдаст 404. Это позволяет избежать усилий по обработке этого вручную.

Все ваши решения были полезны. Главное заключалось в том, что когда я вызывал только представление, не передавая $target в представление, страница выдавала ошибку. Вот что я сделал.

Route::get('/request/{id?}', 'PagesController@makeRequest');

Затем в контроллере

public function makeRequest(Request $request, $id=null)
    {
        if ($id != null) {
            $target = Partner::find($id);
            return view('pages.makeRequest')->with('target', $target);
        }
        return view('pages.makeNullRequest');
    }

Если вы не поняли, что произошло, я создал новое представление, в котором было это вместо того, что я разместил в вопросе.

<input type = "text" class = "form-control" value = "" required readonly> 

Извините, я не обновил вас, ребята, вовремя. Я думаю, что ближе всего к решению этой проблемы мне подошел Джиннеш Джойсар. очень ценю всех вас, ребята. ты просто потрясающий

Вот как я это сделал:

  Route::get('index', 'SeasonController@index');

// контроллер

 public function index(Request $request )
    {
        $id= $request->query('id');
    }

Как вы это называете:

localhost/api/index?id=7

Для меня ответ был в том порядке, в котором я перечислил маршруты в файле маршрутов.

Файл маршрутов вызовет первый, соответствующий шаблону.

Route::get('/ohmy/{id?}', 'OhMyController@show');
Route::get('/ohmy/all', 'OhMyController@all');   //never gets called

Вместо этого поместите необязательные параметры в конец списка:

Route::get('/ohmy/all', 'OhMyController@all'); 
Route::get('/ohmy/{id?}', 'OhMyController@show');

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