如何将我的控制器移动到Laravel 5.2中的单独包文件夹中?

时间:2016-01-01 21:23:29

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

我使用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

2 个答案:

答案 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上定义