具有可选参数的Laravel函数

9
在我的Web文件中,有一条路由接受一个$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>  

我希望页面能够显示来自数据库的详细信息,当提供$id时,或者在$id未提供时保留空格。

3
https://laravel.com/docs/5.7/routing#parameters-optional-parameters 可以帮助吗?(别忘了将你的方法参数设为可选/给它一个默认值) - brombeer
8个回答

15

正如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() 函数参数太少,需要传递1个参数,但只传递了0个参数 - Nana Qhuacy
你在URL中传递了ID吗? - BILAL MALIK
1
我希望它能够同时适用于实例,即无论是否传递变量。 - Nana Qhuacy

3

你提供的所有解决方案都很有帮助。主要问题是当我调用视图而没有将$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> 

对不起我没有及时更新给大家。我认为Jignesh Joisar最接近帮助我解决这个问题了。非常感谢你们所有人,你们真的很棒。


3
这是我做的方式:
  Route::get('index', 'SeasonController@index');

// 控制器

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

你称呼它的方式:
localhost/api/index?id=7

2
你可以使用optional参数:
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。这避免了手动处理这个问题的努力。

1

答案已经说过了。只是顺便提一下:如果您正在使用资源路由,则可选参数将无法正常工作。 例如:

Route::resource('items',itemController::class)->except([
    'create',
]);

Route::get('/items/create/{category_id?}',function($category_id = 'abc'){
    dd($category_id);
});

如果我访问 "items/create/1",结果将是 "1"。 如果我访问 "items/create",它会返回 404。(但我们希望它显示 "abc"。)

这是因为以 "items" 开头的其他路由应该从 "resource" 功能中生成。

因此,如果您使用资源路由,应考虑到这一点。


1

对于可选参数,在路由中使用?传递id,并在函数参数中设置$id = null,如下所示:

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

makeRequest($id = null) {

// Code here...
...

}



1

1

对我来说,答案在路由文件中列出路由的顺序。

路由文件将调用与模式匹配的第一个路由。

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');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接