feature #39457 [Notifier] [DX] Dsn::getRequiredOption() (OskarStark)
This PR was squashed before being merged into the 5.3-dev branch.
Discussion
----------
[Notifier] [DX] Dsn::getRequiredOption()
| Q | A
| ------------- | ---
| Branch? | 5.x
| Bug fix? | no
| New feature? | yes
| Deprecations? | no
| Tickets | ---
| License | MIT
| Doc PR | ---
### Todo
* [x] use the new method in all available bridges and bump composer.json files to `notifer:5.3`
* [x] add tests
This will lead to a much cleaner "communication" between the factory and the transport which option is required and which is optional. This method will also reduce the code duplication in the bridges.
IMHO we should add more of those convenient "helpers" to lower the burden for new bridges.
Commits
-------
3f095bf419
[Notifier] [DX] Dsn::getRequiredOption()
This commit is contained in:
commit
fe91b862c5
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Discord;
|
namespace Symfony\Component\Notifier\Bridge\Discord;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -34,12 +33,7 @@ final class DiscordTransportFactory extends AbstractTransportFactory
|
|||||||
}
|
}
|
||||||
|
|
||||||
$token = $this->getUser($dsn);
|
$token = $this->getUser($dsn);
|
||||||
$webhookId = $dsn->getOption('webhook_id');
|
$webhookId = $dsn->getRequiredOption('webhook_id');
|
||||||
|
|
||||||
if (!$webhookId) {
|
|
||||||
throw new IncompleteDsnException('Missing webhook_id.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Discord\Tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Bridge\Discord\DiscordTransportFactory;
|
use Symfony\Component\Notifier\Bridge\Discord\DiscordTransportFactory;
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
|
|
||||||
@ -28,11 +29,11 @@ final class DiscordTransportFactoryTest extends TestCase
|
|||||||
$this->assertSame('discord://host.test?webhook_id=testWebhookId', (string) $transport);
|
$this->assertSame('discord://host.test?webhook_id=testWebhookId', (string) $transport);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateWithMissingOptionWebhookIdThrowsIncompleteDsnException()
|
public function testCreateWithMissingOptionWebhookIdThrowsMissingRequiredOptionException()
|
||||||
{
|
{
|
||||||
$factory = $this->createFactory();
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
$this->expectException(IncompleteDsnException::class);
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
|
||||||
$factory->create(Dsn::fromString('discord://token@host'));
|
$factory->create(Dsn::fromString('discord://token@host'));
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Esendex;
|
namespace Symfony\Component\Notifier\Bridge\Esendex;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -32,18 +31,8 @@ final class EsendexTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$email = $this->getUser($dsn);
|
$email = $this->getUser($dsn);
|
||||||
$password = $this->getPassword($dsn);
|
$password = $this->getPassword($dsn);
|
||||||
$accountReference = $dsn->getOption('accountreference');
|
$accountReference = $dsn->getRequiredOption('accountreference');
|
||||||
|
$from = $dsn->getRequiredOption('from');
|
||||||
if (!$accountReference) {
|
|
||||||
throw new IncompleteDsnException('Missing accountreference.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$from = $dsn->getOption('from');
|
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Esendex\Tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Bridge\Esendex\EsendexTransportFactory;
|
use Symfony\Component\Notifier\Bridge\Esendex\EsendexTransportFactory;
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
|
|
||||||
@ -46,20 +47,20 @@ final class EsendexTransportFactoryTest extends TestCase
|
|||||||
$factory->create(Dsn::fromString('esendex://email:@host?accountreference=testAccountreference&from=FROM'));
|
$factory->create(Dsn::fromString('esendex://email:@host?accountreference=testAccountreference&from=FROM'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateWithMissingOptionAccountreferenceThrowsIncompleteDsnException()
|
public function testCreateWithMissingOptionAccountreferenceThrowsMissingRequiredOptionException()
|
||||||
{
|
{
|
||||||
$factory = $this->createFactory();
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
$this->expectException(IncompleteDsnException::class);
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
|
||||||
$factory->create(Dsn::fromString('esendex://email:password@host?from=FROM'));
|
$factory->create(Dsn::fromString('esendex://email:password@host?from=FROM'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateWithMissingOptionFromThrowsIncompleteDsnException()
|
public function testCreateWithMissingOptionFromThrowsMissingRequiredOptionException()
|
||||||
{
|
{
|
||||||
$factory = $this->createFactory();
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
$this->expectException(IncompleteDsnException::class);
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
|
||||||
$factory->create(Dsn::fromString('esendex://email:password@host?accountreference=ACCOUNTREFERENCE'));
|
$factory->create(Dsn::fromString('esendex://email:password@host?accountreference=ACCOUNTREFERENCE'));
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\FreeMobile;
|
namespace Symfony\Component\Notifier\Bridge\FreeMobile;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -35,11 +34,7 @@ final class FreeMobileTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$login = $this->getUser($dsn);
|
$login = $this->getUser($dsn);
|
||||||
$password = $this->getPassword($dsn);
|
$password = $this->getPassword($dsn);
|
||||||
$phone = $dsn->getOption('phone');
|
$phone = $dsn->getRequiredOption('phone');
|
||||||
|
|
||||||
if (!$phone) {
|
|
||||||
throw new IncompleteDsnException('Missing phone.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
@ -39,7 +39,7 @@ final class FreeMobileTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
yield [false, 'somethingElse://login:pass@default?phone=0611223344'];
|
yield [false, 'somethingElse://login:pass@default?phone=0611223344'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function incompleteDsnProvider(): iterable
|
public function missingRequiredOptionProvider(): iterable
|
||||||
{
|
{
|
||||||
yield 'missing option: phone' => ['freemobile://login:pass@default'];
|
yield 'missing option: phone' => ['freemobile://login:pass@default'];
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Infobip;
|
namespace Symfony\Component\Notifier\Bridge\Infobip;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -35,14 +34,10 @@ final class InfobipTransportFactory extends AbstractTransportFactory
|
|||||||
}
|
}
|
||||||
|
|
||||||
$authToken = $this->getUser($dsn);
|
$authToken = $this->getUser($dsn);
|
||||||
$from = $dsn->getOption('from');
|
$from = $dsn->getRequiredOption('from');
|
||||||
$host = $dsn->getHost();
|
$host = $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (new InfobipTransport($authToken, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port);
|
return (new InfobipTransport($authToken, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ namespace Symfony\Component\Notifier\Bridge\Infobip\Tests;
|
|||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Bridge\Infobip\InfobipTransportFactory;
|
use Symfony\Component\Notifier\Bridge\Infobip\InfobipTransportFactory;
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
|
|
||||||
@ -28,11 +28,11 @@ final class InfobipTransportFactoryTest extends TestCase
|
|||||||
$this->assertSame('infobip://host.test?from=0611223344', (string) $transport);
|
$this->assertSame('infobip://host.test?from=0611223344', (string) $transport);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateWithNoFromThrowsIncompleteDsnException()
|
public function testCreateWithNoFromThrowsMissingRequiredOptionException()
|
||||||
{
|
{
|
||||||
$factory = $this->createFactory();
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
$this->expectException(IncompleteDsnException::class);
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
$factory->create(Dsn::fromString('infobip://authtoken@default'));
|
$factory->create(Dsn::fromString('infobip://authtoken@default'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Iqsms;
|
namespace Symfony\Component\Notifier\Bridge\Iqsms;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -35,12 +34,7 @@ final class IqsmsTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$login = $this->getUser($dsn);
|
$login = $this->getUser($dsn);
|
||||||
$password = $this->getPassword($dsn);
|
$password = $this->getPassword($dsn);
|
||||||
$from = $dsn->getOption('from');
|
$from = $dsn->getRequiredOption('from');
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Mattermost;
|
namespace Symfony\Component\Notifier\Bridge\Mattermost;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -32,12 +31,7 @@ final class MattermostTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$path = $dsn->getPath();
|
$path = $dsn->getPath();
|
||||||
$token = $this->getUser($dsn);
|
$token = $this->getUser($dsn);
|
||||||
$channel = $dsn->getOption('channel');
|
$channel = $dsn->getRequiredOption('channel');
|
||||||
|
|
||||||
if (!$channel) {
|
|
||||||
throw new IncompleteDsnException('Missing channel.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = $dsn->getHost();
|
$host = $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -59,7 +59,11 @@ final class MattermostTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
|
|
||||||
public function incompleteDsnProvider(): iterable
|
public function incompleteDsnProvider(): iterable
|
||||||
{
|
{
|
||||||
yield 'missing option: token' => ['mattermost://host.test?channel=testChannel'];
|
yield 'missing token' => ['mattermost://host.test?channel=testChannel'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function missingRequiredOptionProvider(): iterable
|
||||||
|
{
|
||||||
yield 'missing option: channel' => ['mattermost://token@host'];
|
yield 'missing option: channel' => ['mattermost://token@host'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Mobyt;
|
namespace Symfony\Component\Notifier\Bridge\Mobyt;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -35,12 +34,7 @@ final class MobytTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$accountSid = $this->getUser($dsn);
|
$accountSid = $this->getUser($dsn);
|
||||||
$authToken = $this->getPassword($dsn);
|
$authToken = $this->getPassword($dsn);
|
||||||
$from = $dsn->getOption('from');
|
$from = $dsn->getRequiredOption('from');
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$typeQuality = $dsn->getOption('type_quality', MobytOptions::MESSAGE_TYPE_QUALITY_LOW);
|
$typeQuality = $dsn->getOption('type_quality', MobytOptions::MESSAGE_TYPE_QUALITY_LOW);
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Nexmo;
|
namespace Symfony\Component\Notifier\Bridge\Nexmo;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -35,12 +34,7 @@ final class NexmoTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$apiKey = $this->getUser($dsn);
|
$apiKey = $this->getUser($dsn);
|
||||||
$apiSecret = $this->getPassword($dsn);
|
$apiSecret = $this->getPassword($dsn);
|
||||||
$from = $dsn->getOption('from');
|
$from = $dsn->getRequiredOption('from');
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ final class NexmoTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
yield [false, 'somethingElse://apiKey:apiSecret@default?from=0611223344'];
|
yield [false, 'somethingElse://apiKey:apiSecret@default?from=0611223344'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function incompleteDsnProvider(): iterable
|
public function missingRequiredOptionProvider(): iterable
|
||||||
{
|
{
|
||||||
yield 'missing option: from' => ['nexmo://apiKey:apiSecret@default'];
|
yield 'missing option: from' => ['nexmo://apiKey:apiSecret@default'];
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\OvhCloud;
|
namespace Symfony\Component\Notifier\Bridge\OvhCloud;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -32,18 +31,8 @@ final class OvhCloudTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$applicationKey = $this->getUser($dsn);
|
$applicationKey = $this->getUser($dsn);
|
||||||
$applicationSecret = $this->getPassword($dsn);
|
$applicationSecret = $this->getPassword($dsn);
|
||||||
$consumerKey = $dsn->getOption('consumer_key');
|
$consumerKey = $dsn->getRequiredOption('consumer_key');
|
||||||
|
$serviceName = $dsn->getRequiredOption('service_name');
|
||||||
if (!$consumerKey) {
|
|
||||||
throw new IncompleteDsnException('Missing consumer_key.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$serviceName = $dsn->getOption('service_name');
|
|
||||||
|
|
||||||
if (!$serviceName) {
|
|
||||||
throw new IncompleteDsnException('Missing service_name.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ final class OvhCloudTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
yield [false, 'somethingElse://key:secret@default?consumer_key=consumerKey&service_name=serviceName'];
|
yield [false, 'somethingElse://key:secret@default?consumer_key=consumerKey&service_name=serviceName'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function incompleteDsnProvider(): iterable
|
public function missingRequiredOptionProvider(): iterable
|
||||||
{
|
{
|
||||||
yield 'missing option: consumer_key' => ['ovhcloud://key:secret@default?service_name=serviceName'];
|
yield 'missing option: consumer_key' => ['ovhcloud://key:secret@default?service_name=serviceName'];
|
||||||
yield 'missing option: service_name' => ['ovhcloud://key:secret@default?consumer_key=consumerKey'];
|
yield 'missing option: service_name' => ['ovhcloud://key:secret@default?consumer_key=consumerKey'];
|
||||||
|
@ -44,7 +44,7 @@ final class RocketChatTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
|
|
||||||
public function incompleteDsnProvider(): iterable
|
public function incompleteDsnProvider(): iterable
|
||||||
{
|
{
|
||||||
yield 'missing option: token' => ['rocketchat://host.test?channel=testChannel'];
|
yield 'missing token' => ['rocketchat://host.test?channel=testChannel'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function unsupportedSchemeProvider(): iterable
|
public function unsupportedSchemeProvider(): iterable
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Sendinblue;
|
namespace Symfony\Component\Notifier\Bridge\Sendinblue;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -34,12 +33,7 @@ final class SendinblueTransportFactory extends AbstractTransportFactory
|
|||||||
}
|
}
|
||||||
|
|
||||||
$apiKey = $this->getUser($dsn);
|
$apiKey = $this->getUser($dsn);
|
||||||
$sender = $dsn->getOption('sender');
|
$sender = $dsn->getRequiredOption('sender');
|
||||||
|
|
||||||
if (!$sender) {
|
|
||||||
throw new IncompleteDsnException('Missing sender.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Sendinblue\Tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Bridge\Sendinblue\SendinblueTransportFactory;
|
use Symfony\Component\Notifier\Bridge\Sendinblue\SendinblueTransportFactory;
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
|
|
||||||
@ -28,11 +29,11 @@ final class SendinblueTransportFactoryTest extends TestCase
|
|||||||
$this->assertSame('sendinblue://host.test?sender=0611223344', (string) $transport);
|
$this->assertSame('sendinblue://host.test?sender=0611223344', (string) $transport);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateWithMissingOptionSenderThrowsIncompleteDsnException()
|
public function testCreateWithMissingOptionSenderThrowsMissingRequiredOptionException()
|
||||||
{
|
{
|
||||||
$factory = $this->createFactory();
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
$this->expectException(IncompleteDsnException::class);
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
|
||||||
$factory->create(Dsn::fromString('sendinblue://apiKey@host.test'));
|
$factory->create(Dsn::fromString('sendinblue://apiKey@host.test'));
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Sinch;
|
namespace Symfony\Component\Notifier\Bridge\Sinch;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -32,12 +31,7 @@ final class SinchTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$accountSid = $this->getUser($dsn);
|
$accountSid = $this->getUser($dsn);
|
||||||
$authToken = $this->getPassword($dsn);
|
$authToken = $this->getPassword($dsn);
|
||||||
$from = $dsn->getOption('from');
|
$from = $dsn->getRequiredOption('from');
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ final class SinchTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
yield [false, 'somethingElse://accountSid:authToken@default?from=0611223344'];
|
yield [false, 'somethingElse://accountSid:authToken@default?from=0611223344'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function incompleteDsnProvider(): iterable
|
public function missingRequiredOptionProvider(): iterable
|
||||||
{
|
{
|
||||||
yield 'missing option: from' => ['sinch://accountSid:authToken@default'];
|
yield 'missing option: from' => ['sinch://accountSid:authToken@default'];
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Smsapi;
|
namespace Symfony\Component\Notifier\Bridge\Smsapi;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -36,12 +35,7 @@ final class SmsapiTransportFactory extends AbstractTransportFactory
|
|||||||
}
|
}
|
||||||
|
|
||||||
$authToken = $this->getUser($dsn);
|
$authToken = $this->getUser($dsn);
|
||||||
$from = $dsn->getOption('from');
|
$from = $dsn->getRequiredOption('from');
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Smsapi\Tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory;
|
use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory;
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
|
|
||||||
@ -28,11 +29,11 @@ final class SmsapiTransportFactoryTest extends TestCase
|
|||||||
$this->assertSame('smsapi://host.test?from=testFrom', (string) $transport);
|
$this->assertSame('smsapi://host.test?from=testFrom', (string) $transport);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateWithMissingOptionFromThrowsIncompleteDsnException()
|
public function testCreateWithMissingOptionFromThrowsMissingRequiredOptionException()
|
||||||
{
|
{
|
||||||
$factory = $this->createFactory();
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
$this->expectException(IncompleteDsnException::class);
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
|
||||||
$factory->create(Dsn::fromString('smsapi://token@host'));
|
$factory->create(Dsn::fromString('smsapi://token@host'));
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ final class TwilioTransportFactoryTest extends TransportFactoryTestCase
|
|||||||
yield [false, 'somethingElse://accountSid:authToken@default?from=0611223344'];
|
yield [false, 'somethingElse://accountSid:authToken@default?from=0611223344'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function incompleteDsnProvider(): iterable
|
public function missingRequiredOptionProvider(): iterable
|
||||||
{
|
{
|
||||||
yield 'missing option: from' => ['twilio://accountSid:authToken@default'];
|
yield 'missing option: from' => ['twilio://accountSid:authToken@default'];
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Twilio;
|
namespace Symfony\Component\Notifier\Bridge\Twilio;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -35,12 +34,7 @@ final class TwilioTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$accountSid = $this->getUser($dsn);
|
$accountSid = $this->getUser($dsn);
|
||||||
$authToken = $this->getPassword($dsn);
|
$authToken = $this->getPassword($dsn);
|
||||||
$from = $dsn->getOption('from');
|
$from = $dsn->getRequiredOption('from');
|
||||||
|
|
||||||
if (!$from) {
|
|
||||||
throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
$host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Zulip\Tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Bridge\Zulip\ZulipTransportFactory;
|
use Symfony\Component\Notifier\Bridge\Zulip\ZulipTransportFactory;
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
|
|
||||||
@ -28,11 +29,11 @@ final class ZulipTransportFactoryTest extends TestCase
|
|||||||
$this->assertSame('zulip://host.test?channel=testChannel', (string) $transport);
|
$this->assertSame('zulip://host.test?channel=testChannel', (string) $transport);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateWithMissingOptionChannelThrowsIncompleteDsnException()
|
public function testCreateWithMissingOptionChannelThrowsMissingRequiredOptionException()
|
||||||
{
|
{
|
||||||
$factory = $this->createFactory();
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
$this->expectException(IncompleteDsnException::class);
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
|
||||||
$factory->create(Dsn::fromString('zulip://email:token@host'));
|
$factory->create(Dsn::fromString('zulip://email:token@host'));
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Notifier\Bridge\Zulip;
|
namespace Symfony\Component\Notifier\Bridge\Zulip;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
@ -35,12 +34,7 @@ final class ZulipTransportFactory extends AbstractTransportFactory
|
|||||||
|
|
||||||
$email = $this->getUser($dsn);
|
$email = $this->getUser($dsn);
|
||||||
$token = $this->getPassword($dsn);
|
$token = $this->getPassword($dsn);
|
||||||
$channel = $dsn->getOption('channel');
|
$channel = $dsn->getRequiredOption('channel');
|
||||||
|
|
||||||
if (!$channel) {
|
|
||||||
throw new IncompleteDsnException('Missing channel.', $dsn->getOriginalDsn());
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = $dsn->getHost();
|
$host = $dsn->getHost();
|
||||||
$port = $dsn->getPort();
|
$port = $dsn->getPort();
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ CHANGELOG
|
|||||||
|
|
||||||
* The component is not marked as `@experimental` anymore
|
* The component is not marked as `@experimental` anymore
|
||||||
* [BC BREAK] Changed the return type of `AbstractTransportFactory::getEndpoint()` from `?string` to `string`
|
* [BC BREAK] Changed the return type of `AbstractTransportFactory::getEndpoint()` from `?string` to `string`
|
||||||
|
* Added `DSN::getRequiredOption` method which throws a new `MissingRequiredOptionException`.
|
||||||
|
|
||||||
5.2.0
|
5.2.0
|
||||||
-----
|
-----
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Notifier\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Oskar Stark <oskarstark@googlemail.com>
|
||||||
|
*
|
||||||
|
* @experimental in 5.3
|
||||||
|
*/
|
||||||
|
class MissingRequiredOptionException extends IncompleteDsnException
|
||||||
|
{
|
||||||
|
public function __construct(string $option, string $dsn = null, ?\Throwable $previous = null)
|
||||||
|
{
|
||||||
|
$message = sprintf('The option "%s" is required but missing.', $option);
|
||||||
|
|
||||||
|
parent::__construct($message, $dsn, $previous);
|
||||||
|
}
|
||||||
|
}
|
@ -13,6 +13,7 @@ namespace Symfony\Component\Notifier\Tests\Transport;
|
|||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Exception\InvalidArgumentException;
|
use Symfony\Component\Notifier\Exception\InvalidArgumentException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
|
|
||||||
final class DsnTest extends TestCase
|
final class DsnTest extends TestCase
|
||||||
@ -120,4 +121,54 @@ final class DsnTest extends TestCase
|
|||||||
$this->assertSame('default', $dsn->getOption('nullable', 'default'));
|
$this->assertSame('default', $dsn->getOption('nullable', 'default'));
|
||||||
$this->assertSame('default', $dsn->getOption('not_existent_property', 'default'));
|
$this->assertSame('default', $dsn->getOption('not_existent_property', 'default'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetRequiredOptionGetsOptionIfSet()
|
||||||
|
{
|
||||||
|
$options = ['with_value' => 'some value'];
|
||||||
|
$dsn = new Dsn('scheme', 'localhost', 'u$er', 'pa$s', '8000', $options, '/channel');
|
||||||
|
|
||||||
|
$this->assertSame('some value', $dsn->getRequiredOption('with_value'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetRequiredOptionGetsOptionIfValueIsZero()
|
||||||
|
{
|
||||||
|
$options = ['timeout' => 0];
|
||||||
|
$dsn = new Dsn('scheme', 'localhost', 'u$er', 'pa$s', '8000', $options, '/channel');
|
||||||
|
|
||||||
|
$this->assertSame(0, $dsn->getRequiredOption('timeout'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getRequiredOptionThrowsMissingRequiredOptionExceptionProvider
|
||||||
|
*/
|
||||||
|
public function testGetRequiredOptionThrowsMissingRequiredOptionException(string $expectedExceptionMessage, array $options, string $option)
|
||||||
|
{
|
||||||
|
$dsn = new Dsn('scheme', 'localhost', 'u$er', 'pa$s', '8000', $options, '/channel');
|
||||||
|
|
||||||
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
$this->expectExceptionMessage($expectedExceptionMessage);
|
||||||
|
|
||||||
|
$dsn->getRequiredOption($option);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredOptionThrowsMissingRequiredOptionExceptionProvider(): iterable
|
||||||
|
{
|
||||||
|
yield [
|
||||||
|
'The option "foo_bar" is required but missing.',
|
||||||
|
['with_value' => 'some value'],
|
||||||
|
'foo_bar',
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
'The option "with_empty_string" is required but missing.',
|
||||||
|
['with_empty_string' => ''],
|
||||||
|
'with_empty_string',
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
'The option "with_null" is required but missing.',
|
||||||
|
['with_null' => null],
|
||||||
|
'with_null',
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Transport\Dsn;
|
use Symfony\Component\Notifier\Transport\Dsn;
|
||||||
use Symfony\Component\Notifier\Transport\TransportFactoryInterface;
|
use Symfony\Component\Notifier\Transport\TransportFactoryInterface;
|
||||||
|
|
||||||
@ -52,6 +53,14 @@ abstract class TransportFactoryTestCase extends TestCase
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return iterable<array{0: string, 1: string|null}>
|
||||||
|
*/
|
||||||
|
public function missingRequiredOptionProvider(): iterable
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider supportsProvider
|
* @dataProvider supportsProvider
|
||||||
*/
|
*/
|
||||||
@ -106,4 +115,21 @@ abstract class TransportFactoryTestCase extends TestCase
|
|||||||
|
|
||||||
$factory->create($dsn);
|
$factory->create($dsn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider missingRequiredOptionProvider
|
||||||
|
*/
|
||||||
|
public function testMissingRequiredOptionException(string $dsn, string $message = null): void
|
||||||
|
{
|
||||||
|
$factory = $this->createFactory();
|
||||||
|
|
||||||
|
$dsn = Dsn::fromString($dsn);
|
||||||
|
|
||||||
|
$this->expectException(MissingRequiredOptionException::class);
|
||||||
|
if (null !== $message) {
|
||||||
|
$this->expectExceptionMessage($message);
|
||||||
|
}
|
||||||
|
|
||||||
|
$factory->create($dsn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\Notifier\Transport;
|
namespace Symfony\Component\Notifier\Transport;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\InvalidArgumentException;
|
use Symfony\Component\Notifier\Exception\InvalidArgumentException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fabien Potencier <fabien@symfony.com>
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
@ -94,6 +95,15 @@ final class Dsn
|
|||||||
return $this->options[$key] ?? $default;
|
return $this->options[$key] ?? $default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRequiredOption(string $key)
|
||||||
|
{
|
||||||
|
if (!\array_key_exists($key, $this->options) || '' === trim($this->options[$key])) {
|
||||||
|
throw new MissingRequiredOptionException($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->options[$key];
|
||||||
|
}
|
||||||
|
|
||||||
public function getPath(): ?string
|
public function getPath(): ?string
|
||||||
{
|
{
|
||||||
return $this->path;
|
return $this->path;
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\Notifier\Transport;
|
namespace Symfony\Component\Notifier\Transport;
|
||||||
|
|
||||||
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
use Symfony\Component\Notifier\Exception\IncompleteDsnException;
|
||||||
|
use Symfony\Component\Notifier\Exception\MissingRequiredOptionException;
|
||||||
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -22,6 +23,7 @@ interface TransportFactoryInterface
|
|||||||
/**
|
/**
|
||||||
* @throws UnsupportedSchemeException
|
* @throws UnsupportedSchemeException
|
||||||
* @throws IncompleteDsnException
|
* @throws IncompleteDsnException
|
||||||
|
* @throws MissingRequiredOptionException
|
||||||
*/
|
*/
|
||||||
public function create(Dsn $dsn): TransportInterface;
|
public function create(Dsn $dsn): TransportInterface;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user