【问题标题】:Composer PSR-0 autoloading dont workComposer PSR-0 自动加载不起作用
【发布时间】:2015-04-09 09:59:14
【问题描述】:

我在从我的应用程序中自动加载模块控制器类时遇到问题。我尝试配置 composer.json 但仍然无法正常工作。可能在这个目录结构上做错了什么。我尝试了 composer doc 中的示例,但再次不起作用...

目录结构:

|- admin
|----- modules
|--------- Menu
|------------Controller
|--------------MenuController.php

让我们看看 composer.json

{
  "autoload": {
    "psr-0": { "Admin\\Modules\\": "" }
  }
}

我尝试设置路径但没有再次设置 // "Admin\Modules\": "admin/modules"

菜单控制器

namespace Admin\Modules\Menu\Controller;

class MenuController extends AbstractAdminBaseController

前端控制器

require 'vendor/autoload.php';

new \Admin\Modules\Menu\Controller\MenuController();

找不到所有时间类。我尝试了 100 个来自 google 的示例,但一无所获。任何例子如何减缓这个问题?谢谢

更新结构:

├───admin
│   └───modules
│         └───Menu
│            └───controller
│                    └───MenuController.php
├───vednor
│   └───autoload.php
│   └───composer
│          └───autoload_classmap.php
│          └───autoload_namespaces.php
│          └───autoload_psr4.php
│          └───autoload_real.php
│          └───ClassLoader.php
├───public
├───assets
├───index.php
├───composer.json
├───composer.lock

【问题讨论】:

  • 当您使用命名空间时,也许您应该使用PSR-4(符合命名空间)自动加载器,而不是 PSR-0 自动加载器
  • 在 psr-0 之后我用 psr-4 试试这个。使用 psr-4 我必须在作曲家中定义所有模块名称,如 MenuProduct
  • 你能发布完整的目录结构吗? (composer.json、autoload.php、FrontController.php、MenuController.php 的完整路径)
  • 您使用的是哪个操作系统?如果您使用的是区分大小写的操作系统,您的问题可能是由于目录名称与命名空间的大小写不匹配造成的。尝试使用完全相同的大小写(Admin 代替 adminModules 代替 modules 等)

标签: php composer-php


【解决方案1】:

您的 PSR-0 将永远无法工作,因为该标准规定文件的路径必须与类名完全相同。请注意,您的命名空间的第一部分是“Admin”,但第一个目录部分只是“admin” - 大小写必须完全匹配,否则将不起作用(或仅适用于不区分大小写的文件系统)。

不过,您将成功使用 PSR-4。为什么?因为在 PSR-4 中,给定的命名空间前缀会从完整的类名中删除,其余部分将转换为在给定的命名空间前缀目录中搜索的路径。

您的案例示例:

"autoload": {
  "psr-0": { "Admin\\Modules\\": "" }
}

由于文件位于路径admin/modules 中,因此无法工作,但必须位于Admin/Modules 中。

"autoload": {
  "psr-4": { "Admin\\Modules\\": "admin/modules/" }
}

将起作用,因为前缀 Admin\Modules\ 已删除,剩余的类名正在转换为路径并添加到 admin/modules

啊,一个问题!它不起作用,因为您选择将类命名为 ...\Controller\...,但路径再次命名为 .../controller/...

老实说,我强烈建议您将文件名和位置转换为 PSR-4 兼容性,即使对于您可以使用 Composer 解决的前缀目录也是如此。这将消除我看到的令人惊讶的小写目录结构。

我的意思是:为什么controller 目录首先是小写,如果每个类都位于那里Controller?这个我实在看不懂。

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 2014-10-25
    • 2022-11-12
    • 2014-03-24
    • 2016-04-27
    • 2018-06-23
    • 2014-03-17
    • 2015-04-20
    • 2015-01-08
    相关资源
    最近更新 更多