首页 > 解决方案 > symfony4.3 添加带有类的自定义文件夹

问题描述

在我的默认 symfony4 结构中,我想添加lib文件夹,其中有其他类。所以是这样的:

-bin
-config
-lib
  - Importer.php
  ...(other files with classes)
-public
-src
   - Controller
      - TestController.php
   - Entity
   - Form
  ...
...

但我不知道以后如何使用我的文件(即:Importer.php)。

假设 Importer.php 内部有一个类 Importer()。如果我尝试从 TestController.php 使用它,我会得到:

试图从命名空间“lib”加载类“Importer”。您是否忘记了另一个名称空间的“使用”语句?

TestController.php 有

use Importer;

在顶部指定(由 PhpStorm 自动检测)。我还尝试在 Importer.php 文件中添加命名空间,例如:

namespace lib;

然后在TestController中:

use lib\Importer;

但它产生相同的结果。

最后,在阅读了有关服务的信息后,我尝试将文件添加到 config/services.yaml

lib\:
    resource: '../lib/Importer.php'

这给出了相同的结果......

做什么,怎么生活?

标签: phpsymfonysymfony4

解决方案


首先阅读有关php 命名空间的信息。

接下来阅读有关psr-4 标准的内容。

为您的文件夹选择一个前缀,比如说Lib. 确保文件lib夹中的所有文件都具有正确的命名空间。例如,Importer类必须存储在lib\Importer.php并且必须具有namespace Lib;Items\Item类必须存储在lib\Items\Item.php并且必须具有namespace Lib\Items\Item;等等。

您的文件已准备就绪。只需要通知 Symfony 就可以了。

Symfony 使用 composer 的自动加载器,所以检查composer 的自动加载部分。比添加用于自动加载的新文件夹composer.json

"autoload": {
    "psr-4": {
        "App\\": "src/",
        "Lib\\": "lib/"
    }
},

它表示lib文件夹中的所有类在其命名空间中都有自己独立的文件和Lib前缀,命名空间的其他部分类似于目录结构。

接下来您需要清除自动加载器的缓存。在控制台中运行:

composer dump-autoload

最后你可以使用你的类:

use Lib\Importer;

$importer = new Importer;

您也可以将文件添加到autowire


推荐阅读