如何在 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...
}
这样:
您的 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.
你不需要和 composer 打交道。
- 如果将来您需要在这些 functions/methods 中使用一些依赖项,那么您可以轻松地注入它们,因为它是一项服务。
我想在 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...
}
这样:
您的 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.
你不需要和 composer 打交道。
- 如果将来您需要在这些 functions/methods 中使用一些依赖项,那么您可以轻松地注入它们,因为它是一项服务。