参数不是来自网址的laravel路由

时间:2015-10-28 18:40:07

标签: php routing laravel-5.1

我有多条看起来像这样的路线:

Route::get('pending-submit', 'CasesController@cases');
Route::get('submited', 'CasesController@cases');
Route::get('closed', 'CasesController@cases');

我甚至在路由器API文档中一直在寻找,除了在控制器中创建多个方法之外,我找不到我的要求的解决方案。除了添加where子句以识别每个case之间的不同状态之外,该方法执行完全相同的查询,我试图做的是有这样的方法

public function cases($whereStatus = 0){
    return Cases::where('status', $whereStatus)->get();
}

而不是这样做:

public function pendingCases(){
    return Cases::where('status', 0)->get();
}

public function submitedCases(){
    return Cases::where('status', 1)->get();
}

public function closedCases(){
    return Cases::where('status', 2)->get();
}

但是我可以找到一种方法将该参数传递给路径中的方法,所以我现在必须为每条路径创建一个对我来说似乎没必要的方法。我知道我可以生成带有get参数的url但是我想让它更干净,有没有办法让我添加该参数而不在url中?

顺便说一下,我也试过这样的东西,但没有做过:

Route::get(
    'pending-submit',
    array(
        'uses'   => 'CasesController@cases',
        'params' => array(
            'filter' => 0
        )
    )
);

编辑:

我知道我可以制作https://someurl.com/cases?status=0之类的网址,也可以使用https://someurl.com/cases等网址,这些网址要求每条路线使用不同的方法,但我想要的是https://someurl.com/cases之类的网址,并且只有一个路由器传递参数的方法,而不是我从请求中获取参数,所以我可以这样做:

public function myMethod($param){
    /*
     * Here I access the $param without calling Request::input('someparam');
     * or without Request::path() where then I have to check what path is it
    */
    echo $param; /* this should already have the param from the route */
}

编辑:

@AndyNoelker我所拥有的是3个不同的值0,1或2

我希望有这样的东西

Route::get(
    'cases',
    array(
        'uses'   => 'CasesController@cases',
        'status' => 0 /* this is what I need */
    )
);

如果没有来自routes.php的话,那很好,我只是想知道,你给我的所有其他方法都不是我想要或要求的,因为我已经知道如何做了。

4 个答案:

答案 0 :(得分:4)

您将不得不通过URL传递所需的状态 - 否则路线将无法知道您想要的状态。您可以通过URL查询参数或作为完全成熟的路由参数来执行此操作。我个人建议在这种情况下使用查询参数,但我会告诉你们两个。

使用查询参数

URL

example.com/cases?status=1

路线

Route::get('cases', CasesController@cases);

CasesController

public method cases(Request $request)
{
    $input = $request->all();
    $status = $input['status'];

    return Cases::where('status',$status)->get();
}

使用路线参数

URL

example.com/cases/1

路线

Route::get('cases/{id}', CasesController@cases);

CasesController

public method cases($id)
{
    return Cases::where('status',$id)->get();
}

当然,如果您更喜欢在路线中使用slug或其他ID,那么您必须在查询中对其进行调整,但这应该是正确的想法。

答案 1 :(得分:2)

我认为您正在寻找路线参数:

Route::get("/cases/{case}", "CasesController@cases");

这将符合以下任何一项:

some_url/cases/pending-submit
some_url/cases/submited
some_url/cases/closed
...

然后,public function cases中的函数CasesController将如下所示:

public function cases($case){
    if($case == "pending-submit"){
      // Do Something
    } else if($case == "submited") {
      // Do Something Else
    }

    // OR
    return Cases::where('status', $case)->get();
}

等等。请在此处查看url参数:Documentation

答案 2 :(得分:0)

  Route::get('pending-submit', array('status' => 0, 'uses' => function(){
   $CasesController = $app->make('CasesController');
   return $CasesController->callAction('cases', $parameters = array());
 }));

答案 3 :(得分:0)

如果我正确理解你的问题,这应该有用。

网络路线

Route::get('pending-submit', [
    'as'        => 'pending',
    'uses'      => 'CasesController@cases',
    'status-id' => '0'
]);

并且,您可以访问通过以下路径传递的参数,

在控制器中

$request->route()->getActions('status-id')

在视图中

{{ request()->route()->getAction('status-id') }}

经过测试,完美适用于L5.6