如何从 Yii2 访问命名空间 params.php

How to access namespace from Yii2 params.php

我需要将一些配置值设置到 XML 文件中。配置键在 params.php 中设置为数组。我写了一个简单的 class 来加载 xml 实体并将它们变成数组。 我无法从配置目录中的 params.php 访问此 class。它在任何控制器上都可以正常工作,如下所示:

use app\components\saidbakr\FoxXML;
...
public function actionIndex()
    {
        echo "<pre>";
        print_r(FoxXML::loadXMLFile(__DIR__.'/../config/values/readers.xml')['reader']);
die();
...

然而,在 params.php 我试过:

<?php
use app\components\saidbakr\FoxXml;
$siteName = Yii::t('app','Site Name');
return [
    'closeSite...
...
'readers' => FoxXML::loadXMLFile(__DIR__.'/../config/values/readers.xml')['reader'],
...

我得到 class 未找到:

Fatal error: Uncaught Error: Class 'app\components\saidbakr\FoxXML' not found in /home/myuser/public/quran-yii2/config/params.php on line 62

Error: Class 'app\components\saidbakr\FoxXML' not found in /home/myuser/public/quran-yii2/config/params.php on line 62

我也尝试在入口脚本中使用命名空间 web/index.php use app\components\saidbakr\FoxXML; 但我遇到了同样的问题。

我怎样才能使用配置文件中定义的 class 方法? 我正在使用 PHP 7.4.

默认情况下,应用命名空间由 Yii 的自动加载器解析,它使用 @app 别名来解析它。但是解析您的 params.php 配置时尚未设置别名。这导致 class 未找到错误。

简单的解决方案是将 app 命名空间作为 PSR-4 命名空间添加到您的 composer.json 配置中:

"autoload": {
    "psr-4": {
        "app\": "."
    }
}

然后运行composer dump-autoload。 由于在 app 命名空间中加载 class 将由 composer autoloader 处理,该自动加载器在解析配置文件时已经设置。