带有可选参数的Laravel函数

时间:2019-02-19 10:40:51

标签: php laravel

在我的Web文件中,我有一条路由,接受一个$ id作为要传递给我的PagesController中的函数的值。但是,即使$ id没有传递给函数,我仍希望函数仍然执行并显示预期的形式。

web.php文件

T.IntsAsVarchar < 15

PagesController.php文件

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

makeRequest.blade.php

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

我希望页面显示数据库中包含$ id的详细信息,如果不提供$ id则显示空白。

6 个答案:

答案 0 :(得分:2)

Laravel文档指出:像这样使用Optional Parameters

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

控制器

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

答案 1 :(得分:0)

对于带有?的可选参数传递ID,在路由中,并在函数的参数中给$ id = null,如下所示:

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

makeRequest($id = null) {

// Code here...
...

}


答案 2 :(得分:0)

在您的路由文件中(问题中提到的web.php)

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

以及您的控制器PagesController.php

public function makeRequest($id = null)
{

}

要了解更多信息,请阅读https://laravel.com/docs/5.7/routing#parameters-optional-parameters

答案 3 :(得分:0)

您可以使用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,它是一个有效的ID,那么它将显示一个包含数据的有效页面。如果访问的URL为www.url.com/request/blahblah,则它将抛出404。它避免了手动处理的工作。

答案 4 :(得分:0)

您所有的解决方案均会有所帮助。最主要的是,当我仅调用视图而不将$ 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最能帮助我解决这个问题。非常感谢你们。你真棒

答案 5 :(得分:0)

对我来说,答案是按照我在路线文件中列出路线的顺序。

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

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