在Laravel中创建类似CodeIgniter的路由

时间:2013-06-12 20:41:34

标签: laravel laravel-4

我正在尝试在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::controllermissingMethod()的组合,如下所示:

public function missingMethod( $params )
{
   call_user_func_array( [$this, array_shift($params)], $params );
}

但是我仍然想知道是否有一种方法可以做到这一点。

3 个答案:

答案 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)

尝试一下

步骤:

  1. 与发布或获取请求匹配的路线
  2. 使用的web / controllerName / MethodName / Parameter1 / parameter2 .. 数组中以$ params形式接收的所有参数。 web /就像一条路线 字首。如果没有传递任何方法,它将调用索引方法
  3. 展开参数
  4. 通过方法和参数调用控制器
  5. 为正则表达式匹配参数,允许使用字母数字和斜杠(URL)
  6. 通过访客中间件

创建了如下所述的控制器:

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