interface SmsGateway {
public function send(string $phoneNumber, string $message);
}
class FirstSmsGateway implements SmsGateway { /** implementation */}
class SecondSmsGateway implements SmsGateway {/** implementation */}
class SmsGatewayLogger implements SmsGateway {
private $logger; // PSR-3 logger
private $next; // SmsGateway
// ...constructor...
public function send(string $phoneNumber, string $message) {
try {
$result = $this->next->send($phoneNumber, $message);
} catch (Exception $e) {
$this->addExceptionInfoToLog($e);
throw $e;
}
// мало ли.... короч тут можно логировать что угодно
// вся функциональность логирования размещается тут
$this->addSuccessToLog($result);
return $result;
}
// ...
}
class FailoverSmsSender implements SmsGateway
{
// цепочка гейтвеев, зачем двумя ограничиваться...
// они должны быть отсортированы по каким-то критериям
// например первым пойдет какой-нибудь дешевый и не слишком надежный
// а последним - самый дорогой но 100% надежный.
private $gatewayChain; // SmsGateway[]
// ...constructor...
public function send(string $phoneNumber, string $message) {
foreach ($this->gatewayChain as $gateway) {
if ($result = $this->tryGateway($gateway)) {
return $result;
}
}
return;
}
private function tryGateway(SmsGateway $gateway) {
try {
$result = $gateway->send($phoneNumber, $message);
} catch (SmsGatewayTimeoutException $exception) {
// нас опять же интересуют только ошибки сервиса, а не наши
// разруливается через наследование исключений
return;
}
return $result;
}
}
Приведите пример пожалуйста.
class FailoverSmsSender {
private $mainSmsGateway;
private $fallbackSmsGateway;
public function send(string $phoneNumber, string $message) {
try {
$this->mainSmsGateway->send($phoneNumber, $message);
} catch (SmsGatewayTimeoutException $exception) {
// перепосылаем только если проблема в самом гейтвее
// а не потому что мы посылаем неправильные данные.
$this->fallbackSmsGateway->send($phoneNumber, $message);
}
}
}
Я не спорю, что в php7 всё ванильно и я бы ничего не писал, если бы yii1 работал бы только на php7 и вышел вот только что.