如何在 Symfony 4 中使用简单的函数?

How to use simple function in Symfony 4?

我想在 Symfony 4 中使用一个简单的函数,像这样:

src/Service/Utils.php

<?php

namespace App\Service;

/**
 * @param string $attr
 *
 * @return bool
 */
function attributNilTrue($attr): bool
{
    return json_encode($attr) === '{"@attributes":{"nil":"true"}}';
}

some/other/file.php

use function App\Service\attributNilTrue;

if (attributNilTrue($foo['bar'])) {
    // Do something...
}

但我收到以下错误:

The autoloader expected class "App\Service\Utils" to be defined in file "/var/www/interop/vendor/composer/../../src/Service/Utils.php". The file was found but the class was not in it, the class name or namespace probably has a typo.

有没有办法做到这一点而不必创建 Utils class?

您可以使用 autoloader files key in composer.

在您的 composer.json 文件中包含如下内容:

{
    "autoload": {
        "files": ["src/utility_functions.php"]
    }
}

(其中 src/utility_functions.php 是包含您的函数定义的文件)。

转储您的自动加载器 (composer dump-autoload),以便将其合并到您的自动加载器文件中,并且您在此文件中定义的任何功能都将在每次请求时可用。

您的典型 Sf4 已经包含一个 PSR4 条目,因此您必须添加自己的条目。最终结果或多或少是这样的:

"autoload": {
    "psr-4": {
      "App\": "src/"
    },
    "files": [
      "src/utility_functions.php"
    ]
  },

我建议将此类函数包装在 class 中 - 例如:

namespace App\Service;

class Utils
{
    /**
     * @param string $attr
     *
     * @return bool
     */
    public static function attributNilTrue($attr): bool
    {
        return \json_encode($attr) === '{"@attributes":{"nil":"true"}}';
    }
}

如果您为该目录配置了自动加载,那么它应该自动加载 - 否则添加这样的服务定义:

App\Service\Utils:

然后你可以像这样使用它:

use App\Service\Utils;

...

if (Utils::attributNilTrue($foo['bar'])) {
    // Do something...
}

这样:

  1. 您的 class 已根据 PSR4 (https://www.php-fig.org/psr/psr-4/) 正确定义:

    2.3.3:
    The terminating class name corresponds to a file name ending in .php. The file name MUST match the case of the terminating class name.
    
  2. 你不需要和 composer 打交道。

  3. 如果将来您需要在这些 functions/methods 中使用一些依赖项,那么您可以轻松地注入它们,因为它是一项服务。