【问题标题】:How to move my controllers into a separate package folder in Laravel 5.2?如何将我的控制器移动到 Laravel 5.2 中的单独包文件夹中?
【发布时间】:2016-04-06 05:43:22
【问题描述】:

我使用 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/Https/Controllers App/Modules/Surveys

【问题讨论】:

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


    【解决方案1】:

    我想我明白了。

    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 将值硬编码在服务提供商中,而不是配置中的选项,但这个解决方案似乎有效!

    如果有一个动态的方法来覆盖该值,我会更好。

    【讨论】:

      【解决方案2】:

      默认控制器的命名空间是 App\Http\Controllers,它在 RouteServiceProvider 中定义并且有一个属性 $namespace 所以所有的控制器都应该在 App\Http\Controllers em> 控制器。

      我认为您有更多模块,而不仅仅是调查模块,您可以将 RouteServiceProvider 的 $namespace 属性设置为 'App\Modules' 并将您的路线定义为:

      Route::get('some/route', ['uses' => 'Surveys\Controllers\Frontend\SurveyController@someMethod']);
      

      如果您觉得每个路由上的巨大前缀命名空间很难看,您可以为每个模块创建一个 ModuleFooRouteServiceProvider 并像 RouteServiceProvicer 一样需要一个类似“routesModuleFoo.php”的文件,并在 config/app 上注册这些服务提供程序。 php 文件,如:

      'providers' => [
          ...
          App\Modules\Surveys\SurveysRouteServiceProvider::class,
          App\Modules\ModuleFoo\ModuleFooRouteServiceProvider::class,
          ...
      ]
      

      ModuleFooServiceProvider 看起来像:

      use Illuminate\Routing\Router;
      use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
      
      class ModuleFooServiceProvider extends ServiceProvider
      {
          protected $namespace = 'App/Modules/ModuleFoo/Controllers';
      
          public function boot(Router $router)
          {
              parent::boot($router);
          }
      
          public function map(Router $router)
          {
              $router->group(['namespace' => $this->namespace], function ($router)        {
                  require app_path('Http/routesModuleFoo.php');
              });
          }
      }
      

      您的该模块的路由将在 routesModuleFoo.php 中定义

      【讨论】:

      • 谢谢。我认为SP是我正在寻找的。我的 ModuleFooRouteServiceProvider 会是什么样子?
      猜你喜欢
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2015-10-16
      相关资源
      最近更新 更多