Как использовать простую функцию в 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...
}

Но я получаю следующую ошибку:

Автозагрузчик ожидал, что класс "App \ Service \ Utils" будет определен в файле "/var/www/interop/vendor/composer/../../src/Service/Utils.php". Файл был найден, но класса в нем нет, вероятно, в имени класса или пространстве имен есть опечатка.

Есть ли способ сделать это, не создавая Utils класс?


person Baptiste Costa    schedule 11.07.2019    source источник
comment
В основном нет. Php не поддерживает автозагрузку функций. Функция статического класса - действительно ваш лучший выбор. Или выясните, где лучше всего использовать инструкцию require.   -  person Cerad    schedule 11.07.2019


Ответы (1)


Вы можете использовать ключ автозагрузчика files в 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"
    ]
  },
person yivi    schedule 11.07.2019