我正在尝试在larvel中重现codeigniter类型的路由。例如,路线'about/directions'
将加载约束控制器和路线方法,而路线'about/directions/fastest'
将使用参数'fastest'
调用方法。
我到目前为止最接近的是以下列方式使用Route::group
:
Route::group( ['prefix'=>'about'], function()
{
Route::get( 'directions/{optional?}', 'about@directions' );
});
哪个有效但仍需要我在每个控制器上手动插入每条路径。我也尝试了Route::controller()
方法。这似乎更接近,但要求我在'get'或'post'前面添加我的方法名称,并且似乎没有一个方法响应所有HTTP动词。
那么可以使用Route::controller
并使一个方法响应所有动词吗?或者是否有其他解决方案使路由以这种方式工作?
经过一些额外的讨论后,我发现我可以使用Route::controller
和missingMethod()
的组合,如下所示:
public function missingMethod( $params )
{
call_user_func_array( [$this, array_shift($params)], $params );
}
但是我仍然想知道是否有一种方法可以做到这一点。
答案 0 :(得分:2)
您可以使用Route::controller('about', 'AboutController')
连接控制器。
在控制器中添加以HTTP动词为前缀的方法(get,post,put,delete)。你想要为GET和POST使用相同的代码的原因很少(更不用说PUT,PATCH,DELETE和OPTIONS了) - 通常这会显示出一些糟糕的设计 - 但是如果你真的那么做就可以使用响应任何动词的动作的any
前缀......
class AboutController extends BaseController {
public function anyDirections($approach = 'fastest')
{
// Build and return a Response
}
}
但请考虑一下您需要POST的原因 - 您是否真的在更改路线状态(更改数据库),或者您是否隐藏了查询字符串中的用户输入?如果您要更改状态,为什么在保存更改后不能将它们重定向?如果你只是隐藏在查询字符串中 - 为什么?
答案 1 :(得分:0)
如何使用路由过滤器并将其传递给控制器:
Route::get('about/{slug}', 'PageController@showAbout')->where('slug', '[A-Za-z]+');
答案 2 :(得分:0)
尝试一下
步骤:
创建了如下所述的控制器:
class SomeController extends Controller
{
public function index($param1,$param2,$param3)
{
return 'index'.$param1.$param2.$param3;
}
}
Route::match(['get','post'],'/web/{controller}/{method?}/{params?}',
function ($controller, $method='index', $params=array()) {
$params = explode('/', $params);
$controller = app()->make("\App\Http\Controllers\\".
ucwords($controller).'Controller' );
return $controller->callAction($method, $params);
})->where('params', '[A-Za-z0-9/]+')->middleware('guest');