* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Overtrue\EasySms; use Overtrue\EasySms\Contracts\MessageInterface; use Overtrue\EasySms\Contracts\PhoneNumberInterface; use Overtrue\EasySms\Exceptions\NoGatewayAvailableException; /** * Class Messenger. */ class Messenger { const STATUS_SUCCESS = 'success'; const STATUS_FAILURE = 'failure'; /** * @var \Overtrue\EasySms\EasySms */ protected $easySms; /** * Messenger constructor. * * @param \Overtrue\EasySms\EasySms $easySms */ public function __construct(EasySms $easySms) { $this->easySms = $easySms; } /** * Send a message. * * @param \Overtrue\EasySms\Contracts\PhoneNumberInterface $to * @param \Overtrue\EasySms\Contracts\MessageInterface $message * @param array $gateways * * @return array * * @throws \Overtrue\EasySms\Exceptions\NoGatewayAvailableException */ public function send(PhoneNumberInterface $to, MessageInterface $message, array $gateways = []) { $results = []; $isSuccessful = false; foreach ($gateways as $gateway => $config) { try { $results[$gateway] = [ 'gateway' => $gateway, 'status' => self::STATUS_SUCCESS, 'result' => $this->easySms->gateway($gateway)->send($to, $message, $config), ]; $isSuccessful = true; break; } catch (\Exception $e) { $results[$gateway] = [ 'gateway' => $gateway, 'status' => self::STATUS_FAILURE, 'exception' => $e, ]; } catch (\Throwable $e) { $results[$gateway] = [ 'gateway' => $gateway, 'status' => self::STATUS_FAILURE, 'exception' => $e, ]; } } if (!$isSuccessful) { throw new NoGatewayAvailableException($results); } return $results; } }