Я думаю, что я делаю это правильно, потому что я могу отменить файл в режиме разработки, но, конечно, я спрашиваю. Как правильно хранить ключи API для сервисов, которые я установил через composer. Пока я храню ключи в каталоге автозагрузки внутри local.php и получаю их через сервисный локатор.
Например
$config = $this->serviceLocator->get('Config');
var_dump($config['service_name_api']); // Returns api key
Это правильный путь или я должен использовать другой способ доступа к этим свойствам?
Лучшее место будет:
config/autoload/{config file name you want}.local.php
Я предлагаю структуру:
[
'keystore' => [
'api' => [
// keys array
]
]
]
Повторяю, я предлагаю структуру выше, вы можете создать свою собственную структуру, но в любом случае добавить
config/autoload/{config file name you want}.local.php.dist
файл, содержащий пример данных.
Это похоже на то, что я бы сделал, хотя вам нужно будет либо указать значение по умолчанию (в конфигурации вашего модуля), что невозможно в контексте ключей API, либо создать правильное исключение на вашей фабрике, потому что вы не хотите есть undefined index service_name_api
через несколько месяцев 🙂
Некоторым людям также нравится иметь объект конфигурации и иметь фабрику только для этого объекта (это помогает управлять значениями по умолчанию, а не сбой). Я лично нахожу это слишком много, хотя, если ваш ключ не используется повторно во многих местах, в этом случае вы бы дублировали заводской тест.
Таким образом, вместо добавления следующего к каждой фабрике, которая потребляет его
if (!isset($config['service_name_api']) || !is_string($config['service_name_api'])) {
throw new \Exception('No "service_name_api" found in the configuration');
}
Вы могли бы иметь простой объект
final class ServiceNameApiOption
{
private $key;
public function __construct(string $apiKey)
{
$this->key = $apiKey;
}
public function getKey() : string
{
return $this->key;
}
}
И тогда завод только для этого:
final class ServiceNameApiOptionFactory
{
public function __invoke(ContainerInterface $container)
{
$config = $container->get('Config');
if (!isset($config['service_name_api']) || !is_string($config['service_name_api'])) {
throw new \Exception('No "service_name_api" found in the configuration');
}
return new ServiceNameApiOption($config['service_name_api']);
}
}