【问题标题】:Rewriting laravel 5.1 controller action route on the Request object在 Request 对象上重写 laravel 5.1 控制器动作路由
【发布时间】:2018-04-07 23:13:18
【问题描述】:

我有很多模块,我的源代码在 App\Http\Controllers 内的子文件夹中组织,例如 App\Http\Controllers\ModuleOne

基本控制器位于App\Http\Controllers 中,模块控制器扩展了这些基本控制器。如果我不想在使用特定模块时自定义基本控制器,则模块控制器可能不存在。

我想编写一个逻辑来检查模块控制器是否存在。如果路由不存在,它应该将操作路由到BaseController

我尝试过制作中间件和其他解决方案,但似乎无法完成。

我想让所有控制器内部的路由使用相同的名称(因此忽略模块名称 - 将由 env 变量定义)。所以,为了简化我想调用的代码:

Route::get('apple','AppleController@view')

从这条路线它应该检查是否:

App\Http\Controller\module1\module1_AppleController.php

存在。

如果有,请使用它。如果不是,它应该路由到基本控制器操作,即App\Http\Controller\AppleController

似乎无法弄清楚在哪里使用高效的代码来执行此操作。可以在RouteServiceProvider在中间件或其他中进行重写吗?

另外,如果更新版本的 Laravel 可以提供 5.1 中没有的解决方案,我愿意升级,所以不要将答案限制在 5.1。

【问题讨论】:

    标签: laravel laravel-5 laravel-5.1 laravel-routing


    【解决方案1】:

    如果你正确使用命名空间,你可以像这样组织你的控制器。通过从通用 BaseController 扩展控制器以实现特定逻辑,您可以执行以下操作:

    <?php
    
    namespace App\Http\Controllers\Default;
    
    use Illuminate\Routing\Controller;
    
    class MyFruitController extends Controller {
      // Implement you callback methods, e.g.:
      public function getApples() {}
      public function getPeaches() {}
    }
    
    ?>
    

    在你的模块中:

    <?php
    
    namespace App\Http\Controllers\MyModuleA;
    
    class MyFruitController extends \App\Http\Controllers\Default\MyFruitController {
      // Implement those methods that should differ from default MyFruitController:
      public function getApples() {}
      // getPeaches() will be used from default MyFruitController 
    }
    
    ?>
    

    还有:

    <?php
    
    namespace App\Http\Controllers\MyModuleB;
    
    class MyFruitController extends \App\Http\Controllers\Default\MyFruitController  {
      // Implement those methods that should differ from default MyFruitController:
      public function getPeaches() {}
      // getApples() will be used from default MyFruitController 
    }
    
    ?>
    

    您可以对拥有的多个模块重复此操作。因此,您拥有相同的控制器名称,只是名称空间不同。通过使用路由组和 env() 函数,您可以在您的 routes.php 文件中做一些很酷的事情:

    <?php
    
    ...
    
    // Fruits
       Route::group([
            'namespace' => env('module', 'Default'),
            // And your other group options, like middleware, ..
        ], function () {
    
            Route::get('apples', 'MyFruitController@getApples');
            Route::get('peaches', 'MyFruitController@getPeaches');
    
        });
    
    ...
    
    ?>    
    

    【讨论】:

    • 感谢您的回答。实际上,我确实像您建议的那样,还添加了一个中间件来重写“url”或路由操作,以便在反射错误的情况下更精确(即,该模块中没有用于所需路由的控制器文件,因此我们重定向到默认值。使用Route::setAction 这是在中间件中完成的
    猜你喜欢
    • 2016-10-19
    • 2019-11-08
    • 2014-08-26
    • 1970-01-01
    • 2015-10-27
    • 2013-12-14
    • 2017-10-17
    • 2016-05-07
    • 2016-09-01
    相关资源
    最近更新 更多