【问题标题】:Use Models / Controllers from a sub directory in new project在新项目的子目录中使用模型/控制器
【发布时间】:2022-01-21 12:57:17
【问题描述】:

所以我被要求在 Laravel (5.4) 中创建一个新项目。该项目需要加载一个“平台”,该平台也是在 Laravel 5.4 中构建的,并且包含已经编写好的控制器和模型。

我目前正在 composer 中自动加载平台:

"psr-4": {
            "App\\": "app/",
            "Frontend\\": "app/Modules/Frontend/",
            "Admin\\": "app/Modules/Admin/",
            "Platform\\": "../platform/Modules/"
        }

我有一个路由文件,其中包含以下内容:

Route::get('/', 'HomeController@index')->name('home');

然后在我的 HomeController 中,我尝试加载平台的 HomeController。

use Platform\Modules\Frontend\Controllers\HomeController as HC;

然后我会看到错误

找不到类“Platform\Modules\Frontend\Controllers\HomeController”

这完全有可能吗,明智的做法吗?我愿意接受任何形式的建议。

【问题讨论】:

  • 我猜应该是Platform\Frontend\Controllers\HomeController,因为您已经提到它是“../platform/Modules/”,其中包含模块
  • 平台项目的 HomeController 文件中的命名空间是什么?
  • @parse 该文件中的命名空间是:App\Modules\Frontend\Controllers;
  • 关于它是否明智,这取决于,如果它是一个小项目,那没关系,但如果它是一个涉及更多开发人员的大型项目,那么我不会建议这种方法。
  • 这是一个小项目,它主要是对现有平台所做的事情的重新设计。不想保持相同的路由以防止重复的 seo 内容问题。

标签: php laravel


【解决方案1】:

我已经设法在 2 个 PHP hello world 项目中模仿了您的情况。

这里的问题是您的 2 个项目使用相同的命名空间 App,当您尝试将第二个项目自动加载到命名空间 Platform 时,您会收到 Class not found 错误。这是因为 Platform 的 PSR-4 命名空间与第二个项目中的命名空间不对应。

App\Modules\Frontend\Controllers 永远不是Platform\Modules\Frontend\Controllers。这完全是 2 个不同的命名空间。

希望通过在两个项目中提供一组指向公共命名空间的路径来解决此问题。

        "psr-4": {
            "App\\": ["app/", "../platform/Modules/"],
            "Frontend\\": "app/Modules/Frontend/",
            "Admin\\": "app/Modules/Admin/"
        }

在你的 HomeController 中,像这样加载你的控制器:

use App\Modules\Frontend\Controllers as HC;

如果您收到Class not found error,请务必仔细检查运行以下命令:

composer dump-autoload

【讨论】:

  • Awesome @parse 你能确认在“主/平台”项目作曲家文件中需要设置什么吗?在“子”项目上执行转储自动加载时,我可以看到一些 PSR 映射来自平台上加载的包,因此似乎是朝着正确方向迈出的一步。我认为只是修改的平台?
  • 你应该更新你的平台项目作曲家文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多