【问题标题】:How to handle routing in laravel modular application如何在 laravel 模块化应用程序中处理路由
【发布时间】:2016-10-03 04:34:12
【问题描述】:

我知道模块中有路由问题/答案。但我已经尝试了所有这些,但我无法找到任何解决方法。

让我展示一下我做了什么。

我的文件夹结构

我的 ModuleServiceProvider.php

namespace App\Modules;

class ModulesServiceProvider extends \Illuminate\Support\ServiceProvider
{
    /**
     * Will make sure that the required modules have been fully loaded
     * @return void
     */

    public function boot()
    {

        if ($module = $this->getModule(func_get_args())) {
             include __DIR__.'/'.$module.'/routes.php';
        }
        $this->loadViewsFrom(__DIR__.'/'.$module.'/Views', 'core');
    }

    public function register()
    {
        if ($module = $this->getModule(func_get_args())) {

        }
    }

    public function getModule($args)
    {
        $module = (isset($args[0]) and is_string($args[0])) ? $args[0] : null;

        return $module;
    }
}

我的 BlogServiceProvider.php

namespace App\Modules\Blog;

class BlogServiceProvider extends \App\Modules\ModulesServiceProvider {

    public function register()
    {
        parent::register('Blog');
    }

    public function boot()
    {
        parent::boot('Blog');
    }
}

在 app\config\app.php 中

'App\Modules\Blog\BlogServiceProvider', //添加到提供者数组中

在应用\配置中

module.php 已创建

return  [
    'modules' => [
       'Blog',
    ]
];

在 composer.json 中

"autoload": {
        "classmap": [
            "database",
            "app/Modules"
        ],
        "psr-4": {
            "App\\": "app/",
             "Modules\\": "Modules/"
        }
    },

一切似乎都很完美,但我被困在了路线中。

在我的应用\Modules\Blog\routes.php 中

    Route::group(['namespace' => array('Modules\Blog')], function() {
      Route::get('/',['as' => 'home', 'uses' => 'PostController@index']);
    });
Route::get('/', ['as' => 'home', 'uses' => 'App\Modules\Blog\Controllers\PostController@index']);

我收到 PostController 不存在错误

我的控制器命名空间

 namespace App\Modules\Blog\Controllers;

我在两条路线上都遇到了这个错误。我是否指定控制器路径。请提供任何帮助。如何在模块化应用中布线。

【问题讨论】:

  • 我认为 composer.json 上的这一行:"Modules\\": "Modules/" 应该是 "Modules\\": "app/Modules/"。并且不要忘记做composer dump-autoload。编辑:见@Ruffles 答案。您已经在 app/ 中拥有 Modules 文件夹。
  • 根据 laravel-modules 的文档,指示将 Modules 目录作为 app 目录的兄弟,而不是其子目录。因为模块中命名空间的默认配置设置为以这种方式派生,并且更改它会导致为其配置中的每个模块指定自定义命名空间。

标签: php laravel module routes


【解决方案1】:

尝试将路由组中的命名空间从['namespace' => array('Modules\Blog')] 更改为['namespace' => 'App\Modules\Blog\Controllers'],看看是否可行。

【讨论】:

    【解决方案2】:

    1 编辑您的 composer.json 文件并将您的 prs-4 自动加载更正为:

     "psr-4": {
            "App\\": "app/",
            "Modules\\": "app/Modules/"
      }
    

    2通过删除“App\”来更新文件的命名空间 和 3 做一个 composer dump-autoload

    【讨论】:

    • 这行得通,但是当我写 Route::get('new-post',['as' => 'homenew', 'uses' => 'App\Modules\Blog\Controllers\PostController@create']); 时。这给我错误请求的页面不起作用。
    • 尝试 'uses' => '\Modules\Blog\Controllers\PostController@create'])
    【解决方案3】:

    转到 RouteServiceProvider 上的 map 方法。你可以告诉 laravel 根据命名空间加载你的路由。

    $router->group(['namespace' => 'App\Controllers'], function ($router)   {
            require app_path('Http/routes.php');
        });
    
    $router->group(['namespace' => 'App\Modules\MyModuleControllers'], function ($router) {
            require app_path('Modules/MyModule/routes.php');
        });
    

    【讨论】:

    • 不工作。我们是否需要在父 app\Http\route.php 中定义相同的路由?如果我在 app\Http\route.php 中使用相同的路由,这可行。但在 Blog\routes.php 中不起作用
    • 这里我们告诉 laravel 查看路由并加载适当的控制器类。如果您有多个命名空间(多个模块),则需要循环它们并多次调用它。无需在主 routes.php 中定义相同的路由。你的问题一定是命名空间没有正确解析。在检查路由之前,确保可以解析博客模块类命名空间。
    • 不知道怎么回事。但是当在 main route.php 中添加 require_once base_path()."/app/Modules/Blog/routes.php" 时。它有效。
    【解决方案4】:

    最后我得到了解决方案。我改变了 ModuleServiceProvider

    namespace App\Modules;
    
    class ModulesServiceProvider extends \Illuminate\Support\ServiceProvider
    {
        /**
         * Will make sure that the required modules have been fully loaded
         * @return void
         */
    
        public function boot()
        {
    
            if ($module = $this->getModule(func_get_args())) {
                 require_once __DIR__.'/'.$module.'/routes.php';
            }
            $this->loadViewsFrom(__DIR__.'/'.$module.'/Views', 'core');
        }
    
        public function register()
        {
            if ($module = $this->getModule(func_get_args())) {
    
            }
        }
    
        public function getModule($args)
        {
            $module = (isset($args[0]) and is_string($args[0])) ? $args[0] : null;
    
            return $module;
        }
    }
    

    我在boot 函数中替换了require_once 而不是include。以及它的工作原理。

    在我给的路线上

    Route::get('new-post',['uses' => 'App\Modules\Blog\Controllers\PostController@create']);
    

    希望对他人有所帮助!!

    【讨论】:

      【解决方案5】:

      看看这个包,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多