Php 参数不来自url的laravel路由

Php 参数不来自url的laravel路由,php,routing,laravel-5.1,Php,Routing,Laravel 5.1,我有多条如下所示的路线: Route::get('pending-submit', 'CasesController@cases'); Route::get('submited', 'CasesController@cases'); Route::get('closed', 'CasesController@cases'); public function myMethod($param){ /* * Here I access the $param without call

我有多条如下所示的路线:

Route::get('pending-submit', 'CasesController@cases');
Route::get('submited', 'CasesController@cases');
Route::get('closed', 'CasesController@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 */
}
public function cases($case){
    if($case == "pending-submit"){
      // Do Something
    } else if($case == "submited") {
      // Do Something Else
    }

    // OR
    return Cases::where('status', $case)->get();
}
我一直在寻找路由器API文档,除了在控制器中创建多个方法之外,我找不到满足我需求的解决方案。该方法执行完全相同的查询,只是添加了一个where子句来标识每个案例之间的不同状态,我尝试的是使用这样一个方法

public function cases($whereStatus = 0){
    return Cases::where('status', $whereStatus)->get();
}
Route::get(
    'cases',
    array(
        'uses'   => 'CasesController@cases',
        'status' => 0 /* this is what I need */
    )
);
而不是这样做:

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

编辑:

我知道我可以创建类似URL的URL,也可以创建类似URL的URL,每个路由需要不同的方法,但是我想要的是创建类似URL的URL,并创建一个方法,其中参数由路由器传递,而不是从请求中获取,因此我可以这样做:

Route::get('pending-submit', 'CasesController@cases');
Route::get('submited', 'CasesController@cases');
Route::get('closed', 'CasesController@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 */
}
public function cases($case){
    if($case == "pending-submit"){
      // Do Something
    } else if($case == "submited") {
      // Do Something Else
    }

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

编辑:

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

我想要这样的东西

public function cases($whereStatus = 0){
    return Cases::where('status', $whereStatus)->get();
}
Route::get(
    'cases',
    array(
        'uses'   => 'CasesController@cases',
        'status' => 0 /* this is what I need */
    )
);

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

你必须通过URL传递所需的状态,否则路由将无法知道你想要的状态。您可以通过URL查询参数或作为一个成熟的路由参数来完成。我个人建议在这种情况下使用查询参数,但我将向您展示这两个参数

使用查询参数 网址

路线

Route::get('cases', CasesController@cases);
Route::get('cases/{id}', CasesController@cases);
案件控制员

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

    return Cases::where('status',$status)->get();
}
public method cases($id)
{
    return Cases::where('status',$id)->get();
}
使用路线参数 网址

路线

Route::get('cases', CasesController@cases);
Route::get('cases/{id}', CasesController@cases);
案件控制员

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

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

当然,如果您希望他们在路由中使用slug或唯一id以外的其他内容,那么您必须在查询中对此进行调整,但这应该会给您提供正确的想法。

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

  Route::get('pending-submit', array('status' => 0, 'uses' => function(){
   $CasesController = $app->make('CasesController');
   return $CasesController->callAction('cases', $parameters = array());
 }));
Route::get("/cases/{case}", "CasesController@cases");
这将匹配以下任何一项:

some_url/cases/pending-submit
some_url/cases/submited
some_url/cases/closed
...
然后,您在
CasesController
中的函数
public function cases
将如下所示:

Route::get('pending-submit', 'CasesController@cases');
Route::get('submited', 'CasesController@cases');
Route::get('closed', 'CasesController@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 */
}
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
参数的信息:

如果我正确理解了您的问题,这应该是可行的

网络路线

Route::get('pending-submit', [
    'as'        => 'pending',
    'uses'      => 'CasesController@cases',
    'status-id' => '0'
]);
并且,您可以访问通过如下路径传递的参数

在控制器中

$request->route()->getActions('status-id')
在视图中

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

在L5.6中经过测试并完美运行

抱歉@AndyNoelker,但这并不能回答问题,我知道我可以使用它,甚至在我的问题中也提到了这一点,这正是我试图避免的。您的问题表明,您觉得必须在控制器中为每个状态创建一个新方法。这表明您不需要这样做——它可以用一种方法处理。您可以选择如何通过路由传递数据。你能澄清一下你的问题吗?这是一个同样在主要问题中的问题:“我知道我可以用get参数生成url,但我想让它更简洁,有没有一种方法可以让我添加该参数而不在url中?”你必须有某种方法通过路由传递数据,这将需要URL中的某些内容。你是否想为每种情况制定完全不同的路线,就像你在文章顶部展示的那样?如果是的话,我可以编辑我的答案。现在查看。这就是您的意思吗?如果您不希望通过路由传入任何数据,并且希望使用完全相同的路由来检索不同的结果,那么您希望在何处传入数据(告知状态)?它是否保存给已登录的用户?你的控制器需要从某个地方访问它。如果不在路由本身中,您希望它位于何处?这正是我所寻找的,我使用它时是这样的:route::get(“{type}”,”CasesController@cases“”->其中('type'、'pending submit | pending review | read | storage');嗯,我从来没有见过这样做,但它很聪明。很高兴我能帮忙!这正是我在“使用路线参数”部分的原始答案中向您展示的内容。我猜你没有读我的全部答案。我把它改回去作为参考。@AndyNoelker嗯。你完全改了,现在我为发布这个感到难过,因为你已经编辑了你的问题,我没有看到你已经发布了同样的东西。我将投票赞成你的答案。对不起@AndyNoelker是的,你是对的,我只是不这么认为,因为我没有想过通过正则表达式限制路线。