我有很多模块,我的源代码被组织到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。
答案 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');
});
...
?>