0

我正在尝试在 larvel 中重现 codeigniter 类型的路线。例如路由'about/directions'会加载 about 控制器和方向方法,而路由'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 );
}

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

4

3 回答 3

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 - 你真的在改变你的方向状态(改变数据库),还是你在查询字符串中隐藏用户输入?如果您正在更改状态,为什么在保存更改后不能将它们重定向回来?如果您只是隐藏查询字符串 - 为什么?

于 2013-06-12T22:24:08.447 回答
0

如何使用路由过滤器并将其传递给控制器​​:

Route::get('about/{slug}', 'PageController@showAbout')->where('slug', '[A-Za-z]+');
于 2013-06-13T18:08:22.253 回答
0

尝试这个

脚步:

  1. 与 post 或 get 请求匹配的路由
  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');
于 2018-12-20T12:40:00.887 回答