Я не могу подключиться к Ovh API для отправки sms

#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