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是的,你是对的,我只是不这么认为,因为我没有想过通过正则表达式限制路线。