Как использовать простую функцию в Symfony 4? - PullRequest
2 голосов
/ 11 июля 2019

Я бы хотел использовать простую функцию в 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?

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Вы можете использовать ключ автозагрузчик 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 голосов
/ 13 июля 2019

Я бы рекомендовал обернуть такие функции в классе - например:

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.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. Вам не нужно связываться с композитором.

  3. Если в будущем вам понадобятся некоторые зависимости внутри этих функций / методов, вы можете легко внедрить их, потому что это сервис.
...