我使用laravel 5.2构建一个小应用程序。我将所有文件放在位于App/Modules/Surveys
的名为Surveys的文件夹中。 "不用担心,我打算将模块移出App文件夹,我只需要让控制器工作"
目前我的控制器位于App/Http/Controllers/SurveysController
我想移动我的控制器文件夹,使其位于App/Modules/Surveys/Controllers/Frontend/SurveysController
我如何告诉laravel从这条路径App/Modules/Surveys/Controllers/Frontend/
而不是App/Http/Controllers
解析控制器?
我尝试将此做到服务提供商,但它仍无法正常工作
<?php
namespace App\Modules\Surveys\Providers;
use Illuminate\Support\ServiceProvider;
class PackageServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
if (! $this->app->routesAreCached()) {
require __DIR__.'/../routes.php';
}
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->make('Modules\Surveys\Controllers\Frontend\SurveyController');
}
}
如何使路线指向正确的控制器?
为了清楚起见,我的应用指导员从App
开始 App/Https/Controllers
App/Modules/Surveys
答案 0 :(得分:4)
我想我已经明白了。
在App/Providers/RouteServiceProvider
文件中,我将$namespace
变量的值更改为这样的空字符串
更改了以下行
protected $namespace = 'App\Http\Controllers';
对此
protected $namespace = '';
然后在我的routes.php文件中,我使用了这样的命名空间
Route::group([
'namespace' => 'Modules\Vendname\Surveys\Controllers\Frontend',
], function()
{
Route::get('/survey', ['as' =>'survey.index', 'uses' => 'SurveysController@index']);
});
我不确定为什么Taylor在服务提供商中具有硬编码的值,而不是配置中的选项,但这个解决方案似乎有效!
如果有动态方法来覆盖该值,我会更好。
答案 1 :(得分:0)
默认情况下,控制器的命名空间是App \ Http \ Controllers,它在RouteServiceProvider中定义,并且具有属性 $ namespace ,因此所有控制器都应该在 App \ Http \ Controllers中 controller。
我认为你有更多模块而不仅仅是Surveys模块,你可以将RouteServiceProvider的 $ namespace 属性设置为'App \ Modules'并将你的路由定义为:
s
如果你觉得每条路线上的一个巨大的前缀命名空间是丑陋的,你可以为每个模块创建一个ModuleFooRouteServiceProvider,并且需要一个像“routesModuleFoo.php”这样的文件,与RouteServiceProvicer一样,并在config / app上注册这些服务提供者。 php文件如:
Route::get('some/route', ['uses' => 'Surveys\Controllers\Frontend\SurveyController@someMethod']);
ModuleFooServiceProvider看起来像:
'providers' => [
...
App\Modules\Surveys\SurveysRouteServiceProvider::class,
App\Modules\ModuleFoo\ModuleFooRouteServiceProvider::class,
...
]
该模块的路由将在routesModuleFoo.php上定义