0

I am working on sending SMS on Symfony, I go through the ovh API, I created a form to type the message to send and I can display it but when I click send, I have this error : Cannot use object of type Symfony\Bridge\Monolog\Logger as array

the problem is when i try to connect to the api ovh Thanks for the help

my service :

 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;
  }
  }

Controller :

  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
  • Are you sure you droped all the code ? Have you got the line and file error's ? Your usages of logger seem ok – Mcsky Apr 09 '19 at 22:29
  • Thank you for your answer, I know that I have to pass two arguments in my service.yml because I pass two arguments in the constructor of my smsProvider service but I do not know how to do it – Kamela Bessas Apr 10 '19 at 08:49

1 Answers1

0

IMO you should create another class that have to return you an Api object rightly configured to communicate.

So this service takes 3 scalars parameters (or your config array)

You should define it this way

app.ovh_connection:
    class: Ce\UtilisateurBundle\Services\OvhConnection
    arguments:
        $applicationKey: '%application_key%'
        $applicationSecret: '%application_secret%'
        $consumerKey: '%consumer_key%'

The class handling the connection look like this

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
        );  
    } 
}

Pretty simple, so the connection part is handled only here. If you want to use another service of this API (like email sending for example) you just have to use this class.

Then you have to adapt your SmsProvider class to retrieve the connection from your new class

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
}

Finally you have to update SmsProvider's definition this way

app.sms.provider:
    class: Ce\UtilisateurBundle\Services\SmsProvider
    arguments: ['@app.ovh_connection', '@logger']
    public: true
Mcsky
  • 1,426
  • 1
  • 10
  • 20