Не могу подключиться к Ovh API для отправки смс - PullRequest
0 голосов
/ 09 апреля 2019

Я работаю над отправкой SMS на Symfony, я перехожу через API ovh, я создал форму для ввода сообщения для отправки и могу отобразить его, но когда я нажимаю кнопку отправить, у меня появляется эта ошибка: Невозможно использовать объект типаSymfony \ Bridge \ Monolog \ Logger как массив

проблема в том, когда я пытаюсь подключиться к API. Спасибо за помощь

мой сервис:

 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() && $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: Ce\UtilisateurBundle\Services\SmsProvider
             arguments: ['@logger']
             public: true

1 Ответ

0 голосов
/ 11 апреля 2019

IMO, вы должны создать другой класс, который должен возвращать вам Api объект, правильно настроенный для связи.

Таким образом, этот сервис принимает 3 параметра скаляров (или ваш конфигурационный массив)

Вы должны определить его следующим образом

app.ovh_connection:
    class: Ce\UtilisateurBundle\Services\OvhConnection
    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: Ce\UtilisateurBundle\Services\SmsProvider
    arguments: ['@app.ovh_connection', '@logger']
    public: true
...