#api #symfony #service #ovh
#API #symfony #Обслуживание #ovh
Вопрос:
Я работаю над отправкой SMS на Symfony, я захожу через ovh API, я создал форму для ввода сообщения для отправки, и я могу его отобразить, но когда я нажимаю отправить, у меня появляется эта ошибка: невозможно использовать объект типа Symfony Bridge Monolog Logger в качестве массива
проблема в том, когда я пытаюсь подключиться к api ovh Спасибо за помощь
мой сервис :
class SmsProvider
{
/** @var array */
private $config;
/** @var LoggerInterface */
private $logger;
public function __construct($config, LoggerInterface $logger)
{
$this->config = $config;
$this->logger = $logger;
}
public function sendMessage($phoneNumbers, $message)
{
$conn = $this->connectToApi();
$phoneNumbers = (array)$phoneNumbers;
$content = [
'charset' => 'UTF-8',
'class' => 'phoneDisplay',
'coding' => '7bit',
'message' => $message,
'noStopClause' => true,
'priority' => 'high',
'receivers' => $phoneNumbers,
'senderForResponse' => true,
];
try {
$smsServices = $conn->get('/sms/');
$result = $conn->post(sprintf('/sms/%s/jobs/',
$smsServices[0]), $content);
} catch (Exception $e) {
if (null !== $this->logger) {
$this->logger->critical(
sprintf("Erreur lors de l'envoi SMS : %s . Trace :
%s", $e->getMessage(), $e->getTraceAsString()), [
'paramsOvh' => $content
]
);
}
$result = false;
}
return $result;
}
private function connectToApi()
{
if (!isset($this->config['application_key'],
$this->config['application_secret'],
$this->config['consumer_key'],
$this->config['end_point'])
) {
$this->logger->error('OVH config parameters are missing');
throw new Exception('OVH config parameters are missing');
}
$applicationKey = $this->config['application_key'];
$applicationSecret = $this->config['application_secret'];
$consumerKey = $this->config['consumer_key'];
$endPoint = $this->config['end_point'];
try {
$conn = new Api(
$applicationKey,
$applicationSecret,
$endPoint,
$consumerKey
);
} catch (InvalidParameterException $e) {
$this->logger->critical(
sprintf("Erreur lors de la connexion à l'API OVH : %s .
Trace : %s", $e->getMessage(), $e->getTraceAsString())
);
throw $e;
}
return $conn;
}
}
Контроллер :
public function sendSmsAction(Request $request)
{
$telephones = $request->get('telephone');
$form = $this->createForm(smsFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() amp;amp; $form->isValid()) {
$message = $form->get('message')->getData();
$smsProvider = $this->get('app.sms.provider');
$smsProvider->sendMessage($message, $telephones);
}
return $this->render('
CeUtilisateurBundle:Utilisateur:sms.html.twig', array(
'form' => $form->createView()));
}
service.yml
app.sms.provider:
class: CeUtilisateurBundleServicesSmsProvider
arguments: ['@logger']
public: true
Комментарии:
1. Вы уверены, что удалили весь код? У вас есть ошибка строки и файла? Ваше использование logger кажется нормальным
2. Спасибо за ваш ответ, я знаю, что мне нужно передать два аргумента в моем сервисе. yml, потому что я передаю два аргумента в конструкторе моей службы smsProvider, но я не знаю, как это сделать
Ответ №1:
IMO, вам следует создать другой класс, который должен возвращать вам Api
объект, правильно настроенный для связи.
Итак, эта служба принимает 3 скалярных параметра (или ваш конфигурационный массив)
Вы должны определить это таким образом
app.ovh_connection:
class: CeUtilisateurBundleServicesOvhConnection
arguments:
$applicationKey: '%application_key%'
$applicationSecret: '%application_secret%'
$consumerKey: '%consumer_key%'
Класс, обрабатывающий соединение, выглядит следующим образом
class OvhConnection {
private $applicationKey;
private $applicationSecret;
private $consumerKey;
constructor($applicationKey, $applicationSecret, $consumerKey) {
$this->applicationKey = $applicationKey;
$this->applicationSecret = $applicationSecret;
$this->consumerKey = $consumerKey;
}
public function getConnection($endpoint) {
return new Api(
$this->applicationKey,
$this->applicationSecret,
$endPoint,
$this->consumerKey
);
}
}
Довольно просто, поэтому часть подключения обрабатывается только здесь. Если вы хотите использовать другую службу этого API (например, для отправки электронной почты), вам просто нужно использовать этот класс.
Затем вам нужно адаптировать свой класс SmsProvider для получения соединения из вашего нового класса
class SmsProvider
{
/** @var OvhConnection */
private $connection;
/** @var LoggerInterface */
private $logger;
public function __construct(OvhConnection $connection, LoggerInterface $logger)
{
$this->connection = $connection;
$this->logger = $logger;
}
// Call $this->connection->getConnection('your_endpoint'); to retrieve an OvhConnection configured
}
Наконец, вам нужно обновить SmsProvider
определение таким образом
app.sms.provider:
class: CeUtilisateurBundleServicesSmsProvider
arguments: ['@app.ovh_connection', '@logger']
public: true