在Request对象

时间:2017-10-26 14:07:37

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

我有很多模块,我的源代码被组织到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。

1 个答案:

答案 0 :(得分:0)

如果正确使用名称空间,您可以像这样组织控制器。通过从特定逻辑的公共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');

    });

...

?>