Merge branch '4.4' into 5.0
* 4.4: [DependencyInjection][Config] Use several placeholder unique prefixes for dynamic placeholder values [Mime] Keep Sender full address when used by non-SMTP transports Update MimeTypes.php
This commit is contained in:
commit
ba1b05e1b6
@ -26,7 +26,7 @@ abstract class BaseNode implements NodeInterface
|
||||
{
|
||||
const DEFAULT_PATH_SEPARATOR = '.';
|
||||
|
||||
private static $placeholderUniquePrefix;
|
||||
private static $placeholderUniquePrefixes = [];
|
||||
private static $placeholders = [];
|
||||
|
||||
protected $name;
|
||||
@ -74,7 +74,7 @@ abstract class BaseNode implements NodeInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a common prefix for dynamic placeholder values.
|
||||
* Adds a common prefix for dynamic placeholder values.
|
||||
*
|
||||
* Matching configuration values will be skipped from being processed and are returned as is, thus preserving the
|
||||
* placeholder. An exact match provided by {@see setPlaceholder()} might take precedence.
|
||||
@ -83,7 +83,7 @@ abstract class BaseNode implements NodeInterface
|
||||
*/
|
||||
public static function setPlaceholderUniquePrefix(string $prefix): void
|
||||
{
|
||||
self::$placeholderUniquePrefix = $prefix;
|
||||
self::$placeholderUniquePrefixes[] = $prefix;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -93,7 +93,7 @@ abstract class BaseNode implements NodeInterface
|
||||
*/
|
||||
public static function resetPlaceholders(): void
|
||||
{
|
||||
self::$placeholderUniquePrefix = null;
|
||||
self::$placeholderUniquePrefixes = [];
|
||||
self::$placeholders = [];
|
||||
}
|
||||
|
||||
@ -497,8 +497,10 @@ abstract class BaseNode implements NodeInterface
|
||||
return self::$placeholders[$value];
|
||||
}
|
||||
|
||||
if (self::$placeholderUniquePrefix && 0 === strpos($value, self::$placeholderUniquePrefix)) {
|
||||
return [];
|
||||
foreach (self::$placeholderUniquePrefixes as $placeholderUniquePrefix) {
|
||||
if (0 === strpos($value, $placeholderUniquePrefix)) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,11 +79,11 @@ class MergeExtensionConfigurationPass implements CompilerPassInterface
|
||||
$container->getParameterBag()->mergeEnvPlaceholders($resolvingBag);
|
||||
}
|
||||
|
||||
throw $e;
|
||||
} finally {
|
||||
if ($configAvailable) {
|
||||
BaseNode::resetPlaceholders();
|
||||
}
|
||||
|
||||
throw $e;
|
||||
}
|
||||
|
||||
if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
|
||||
@ -95,6 +95,10 @@ class MergeExtensionConfigurationPass implements CompilerPassInterface
|
||||
$container->getParameterBag()->add($parameters);
|
||||
}
|
||||
|
||||
if ($configAvailable) {
|
||||
BaseNode::resetPlaceholders();
|
||||
}
|
||||
|
||||
$container->addDefinitions($definitions);
|
||||
$container->addAliases($aliases);
|
||||
}
|
||||
|
@ -12,6 +12,7 @@
|
||||
namespace Symfony\Component\DependencyInjection\Tests\Compiler;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Config\Definition\BaseNode;
|
||||
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
||||
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
||||
use Symfony\Component\Config\Resource\FileResource;
|
||||
@ -128,6 +129,23 @@ class MergeExtensionConfigurationPassTest extends TestCase
|
||||
|
||||
$this->assertSame(['FOO'], array_keys($container->getParameterBag()->getEnvPlaceholders()));
|
||||
}
|
||||
|
||||
public function testReuseEnvPlaceholderGeneratedByPreviousExtension()
|
||||
{
|
||||
if (!property_exists(BaseNode::class, 'placeholderUniquePrefixes')) {
|
||||
$this->markTestSkipped('This test requires symfony/config ^4.4.11|^5.0.11|^5.1.3');
|
||||
}
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->registerExtension(new FooExtension());
|
||||
$container->registerExtension(new TestCccExtension());
|
||||
$container->prependExtensionConfig('foo', ['bool_node' => '%env(bool:MY_ENV_VAR)%']);
|
||||
$container->prependExtensionConfig('test_ccc', ['bool_node' => '%env(bool:MY_ENV_VAR)%']);
|
||||
|
||||
(new MergeExtensionConfigurationPass())->process($container);
|
||||
|
||||
$this->addToAssertionCount(1);
|
||||
}
|
||||
}
|
||||
|
||||
class FooConfiguration implements ConfigurationInterface
|
||||
@ -139,6 +157,7 @@ class FooConfiguration implements ConfigurationInterface
|
||||
->children()
|
||||
->scalarNode('bar')->end()
|
||||
->scalarNode('baz')->end()
|
||||
->booleanNode('bool_node')->end()
|
||||
->end();
|
||||
|
||||
return $treeBuilder;
|
||||
@ -166,6 +185,8 @@ class FooExtension extends Extension
|
||||
$container->getParameterBag()->get('env(BOZ)');
|
||||
$container->resolveEnvPlaceholders($config['baz']);
|
||||
}
|
||||
|
||||
$container->setParameter('foo.param', 'ccc');
|
||||
}
|
||||
}
|
||||
|
||||
@ -194,3 +215,36 @@ class ThrowingExtension extends Extension
|
||||
throw new \Exception();
|
||||
}
|
||||
}
|
||||
|
||||
final class TestCccConfiguration implements ConfigurationInterface
|
||||
{
|
||||
public function getConfigTreeBuilder(): TreeBuilder
|
||||
{
|
||||
$treeBuilder = new TreeBuilder('test_ccc');
|
||||
$treeBuilder->getRootNode()
|
||||
->children()
|
||||
->booleanNode('bool_node')->end()
|
||||
->end();
|
||||
|
||||
return $treeBuilder;
|
||||
}
|
||||
}
|
||||
|
||||
final class TestCccExtension extends Extension
|
||||
{
|
||||
public function getAlias(): string
|
||||
{
|
||||
return 'test_ccc';
|
||||
}
|
||||
|
||||
public function getConfiguration(array $config, ContainerBuilder $container): ?ConfigurationInterface
|
||||
{
|
||||
return new TestCccConfiguration();
|
||||
}
|
||||
|
||||
public function load(array $configs, ContainerBuilder $container)
|
||||
{
|
||||
$configuration = $this->getConfiguration($configs, $container);
|
||||
$this->processConfiguration($configuration, $configs);
|
||||
}
|
||||
}
|
||||
|
@ -44,9 +44,13 @@ class Envelope
|
||||
|
||||
public function setSender(Address $sender): void
|
||||
{
|
||||
$this->sender = new Address($sender->getAddress());
|
||||
$this->sender = $sender;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Address Returns a "mailbox" as specified by RFC 2822
|
||||
* Must be converted to an "addr-spec" when used as a "MAIL FROM" value in SMTP (use getAddress())
|
||||
*/
|
||||
public function getSender(): Address
|
||||
{
|
||||
return $this->sender;
|
||||
|
@ -29,8 +29,8 @@ class EnvelopeTest extends TestCase
|
||||
|
||||
public function testConstructorWithNamedAddressSender()
|
||||
{
|
||||
$e = new Envelope(new Address('fabien@symfony.com', 'Fabien'), [new Address('thomas@symfony.com')]);
|
||||
$this->assertEquals(new Address('fabien@symfony.com'), $e->getSender());
|
||||
$e = new Envelope($sender = new Address('fabien@symfony.com', 'Fabien'), [new Address('thomas@symfony.com')]);
|
||||
$this->assertEquals($sender, $e->getSender());
|
||||
}
|
||||
|
||||
public function testConstructorWithAddressRecipients()
|
||||
@ -54,31 +54,31 @@ class EnvelopeTest extends TestCase
|
||||
public function testSenderFromHeaders()
|
||||
{
|
||||
$headers = new Headers();
|
||||
$headers->addPathHeader('Return-Path', new Address('return@symfony.com', 'return'));
|
||||
$headers->addMailboxListHeader('To', ['from@symfony.com']);
|
||||
$headers->addPathHeader('Return-Path', $return = new Address('return@symfony.com', 'return'));
|
||||
$headers->addMailboxListHeader('To', ['to@symfony.com']);
|
||||
$e = Envelope::create(new Message($headers));
|
||||
$this->assertEquals(new Address('return@symfony.com', 'return'), $e->getSender());
|
||||
$this->assertEquals($return, $e->getSender());
|
||||
|
||||
$headers = new Headers();
|
||||
$headers->addMailboxHeader('Sender', new Address('sender@symfony.com', 'sender'));
|
||||
$headers->addMailboxListHeader('To', ['from@symfony.com']);
|
||||
$headers->addMailboxHeader('Sender', $sender = new Address('sender@symfony.com', 'sender'));
|
||||
$headers->addMailboxListHeader('To', ['to@symfony.com']);
|
||||
$e = Envelope::create(new Message($headers));
|
||||
$this->assertEquals(new Address('sender@symfony.com', 'sender'), $e->getSender());
|
||||
$this->assertEquals($sender, $e->getSender());
|
||||
|
||||
$headers = new Headers();
|
||||
$headers->addMailboxListHeader('From', [new Address('from@symfony.com', 'from'), 'some@symfony.com']);
|
||||
$headers->addMailboxListHeader('To', ['from@symfony.com']);
|
||||
$headers->addMailboxListHeader('From', [$from = new Address('from@symfony.com', 'from'), 'some@symfony.com']);
|
||||
$headers->addMailboxListHeader('To', ['to@symfony.com']);
|
||||
$e = Envelope::create(new Message($headers));
|
||||
$this->assertEquals(new Address('from@symfony.com', 'from'), $e->getSender());
|
||||
$this->assertEquals($from, $e->getSender());
|
||||
}
|
||||
|
||||
public function testSenderFromHeadersWithoutFrom()
|
||||
{
|
||||
$headers = new Headers();
|
||||
$headers->addMailboxListHeader('To', ['from@symfony.com']);
|
||||
$headers->addMailboxListHeader('To', ['to@symfony.com']);
|
||||
$e = Envelope::create($message = new Message($headers));
|
||||
$message->getHeaders()->addMailboxListHeader('From', [new Address('from@symfony.com', 'from')]);
|
||||
$this->assertEquals(new Address('from@symfony.com', 'from'), $e->getSender());
|
||||
$message->getHeaders()->addMailboxListHeader('From', [$from = new Address('from@symfony.com', 'from')]);
|
||||
$this->assertEquals($from, $e->getSender());
|
||||
}
|
||||
|
||||
public function testRecipientsFromHeaders()
|
||||
|
@ -137,7 +137,7 @@ final class MimeTypes implements MimeTypesInterface
|
||||
}
|
||||
|
||||
if (!$this->isGuesserSupported()) {
|
||||
throw new LogicException('Unable to guess the MIME type as no guessers are available (have you enable the php_fileinfo extension?).');
|
||||
throw new LogicException('Unable to guess the MIME type as no guessers are available (have you enabled the php_fileinfo extension?).');
|
||||
}
|
||||
|
||||
return null;
|
||||
|
Reference in New Issue
Block a user