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

3

我希望在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...
}

但是我遇到了以下错误:

自动加载程序期望在文件“/var/www/interop/vendor/composer/../../src/Service/Utils.php”中定义类“App\Service\Utils”。虽然找到了该文件,但其中没有该类,类名或命名空间可能存在拼写错误。

是否有一种方法可以不必创建Utils类而实现这个目的?


2
基本上不行。php 不支持函数的自动加载。一个静态类函数是你最好的选择。或者找到最佳位置来使用 require 语句。 - Cerad
2个回答

4
你可以在composer中使用自动加载器files
在你的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"
    ]
  },

0
我建议将这样的函数封装在类中,例如:
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. 根据PSR4(https://www.php-fig.org/psr/psr-4/)正确定义了您的类:
  2. 2.3.3:
    终止类名对应于以 .php 结尾的文件名。文件名必须与终止类名的大小写匹配。
    
  3. 您不需要烦恼于composer。
  4. 当您将来需要在这些函数/方法中使用某些依赖项时,您可以轻松注入它们,因为它是一个服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接