代码之家  ›  专栏  ›  技术社区  ›  cm4l

在请求对象上重写laravel 5.1控制器动作路由

  •  0
  • cm4l  · 技术社区  · 7 年前

    我的源代码中有许多模块被组织到 App\Http\Controllers 例如 App\Http\Controllers\ModuleOne .

    这个 基本控制器 都在 应用程序\Http\控制器 模块控制器扩展了这些基本控制器 . 如果我不想在使用特定模块时自定义基本控制器,那么模块控制器可能不存在。

    我想写一个逻辑,其中路由检查模块控制器是否存在。如果路由不存在,则应将操作路由到 BaseController .

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

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

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

    App\Http\Controller\module1\module1_AppleController.php
    

    存在。

    如果有,就用它。如果没有,则应路由到基本控制器操作,即。 App\Http\Controller\AppleController .

    似乎不知道在哪里使用高效的代码来实现这一点。重写可以在 RouteServiceProvider

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   McGo    7 年前

    如果正确使用名称空间,可以这样组织控制器。通过将控制器从公共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()函数,您可以在路由中做一些很酷的事情。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');
    
        });
    
    ...
    
    ?>