Skip to content

Commit 1f25242

Browse files
committed
fixing php-fluent-di syntax highlighting, adding more files
Signed-off-by: RJ Garcia <rj@bighead.net>
1 parent 371c6f2 commit 1f25242

16 files changed

+457
-2
lines changed

_build/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
lexers['php-annotations'] = PhpLexer(startinline=True)
107107
lexers['php-standalone'] = PhpLexer(startinline=True)
108108
lexers['php-symfony'] = PhpLexer(startinline=True)
109+
lexers['php-fluent-di'] = PhpLexer(startinline=True)
109110
lexers['rst'] = RstLexer()
110111
lexers['varnish3'] = CLexer()
111112
lexers['varnish4'] = CLexer()

components/dependency_injection.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ config files:
317317
->args(['%mailer.transport%']);
318318
319319
$container->set('newsletter_manager', 'NewsletterManager')
320-
->call('setMailer', ref('mailer'));
320+
->call('setMailer', [ref('mailer')]);
321321
};
322322
323323

service_container.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ But, if you *do* need to make a service public, override the ``public`` setting:
936936
</services>
937937
</container>
938938
939-
.. code-block:: php-fuent-di
939+
.. code-block:: php-fluent-di
940940
941941
// config/services.php
942942

service_container/3.3-di-changes.rst

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,25 @@ what the file looks like in Symfony 4):
8181
</services>
8282
</container>
8383
84+
.. code-block:: php-fluent-di
85+
86+
// config/services.php
87+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
88+
89+
return function(ContainerConfigurator $configurator) {
90+
$container = $configurator->services()
91+
->defaults()
92+
->autowire()
93+
->autoconfigure()
94+
->private();
95+
96+
$container->load('App\\', '../src/*')
97+
->exclude('../src/{Entity,Migrations,Tests}');
98+
99+
$container->load('App\\Controller\\', '../src/Controller')
100+
->tag('controller.service_arguments');
101+
};
102+
84103
This small bit of configuration contains a paradigm shift of how services
85104
are configured in Symfony.
86105

@@ -130,6 +149,18 @@ thanks to the following config:
130149
</services>
131150
</container>
132151
152+
.. code-block:: php-fluent-di
153+
154+
// config/services.php
155+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
156+
157+
return function(ContainerConfigurator $configurator) {
158+
// ...
159+
160+
$container->load('App\\', '../src/*')
161+
->exclude('../src/{Entity,Migrations,Tests}');
162+
};
163+
133164
This means that every class in ``src/`` is *available* to be used as a
134165
service. And thanks to the ``_defaults`` section at the top of the file, all of
135166
these services are **autowired** and **private** (i.e. ``public: false``).
@@ -329,6 +360,19 @@ The third big change is that, in a new Symfony 3.3 project, your controllers are
329360
$definition->addTag('controller.service_arguments');
330361
$this->registerClasses($definition, 'App\\Controller\\', '../src/Controller/*');
331362
363+
.. code-block:: php-fluent-di
364+
365+
// config/services.php
366+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
367+
368+
return function(ContainerConfigurator $configurator) {
369+
// ...
370+
371+
$container->load('App\\Controller\\', '../src/Controller')
372+
->tag('controller.service_arguments');
373+
};
374+
375+
332376
But, you might not even notice this. First, your controllers *can* still extend
333377
the same base controller class (``AbstractController``).
334378
This means you have access to all of the same shortcuts as before. Additionally,
@@ -466,6 +510,20 @@ inherited from an abstract definition:
466510
</services>
467511
</container>
468512
513+
.. code-block:: php-fluent-di
514+
515+
// config/services.php
516+
use App\Domain\LoaderInterface;
517+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
518+
519+
return function(ContainerConfigurator $configurator) {
520+
// ...
521+
522+
$container->instanceof(LoaderInterface::class
523+
->public()
524+
->tag('app.domain_loader');
525+
};
526+
469527
What about Performance
470528
----------------------
471529

service_container/autowiring.rst

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,23 @@ both services:
116116
$container->autowire(Rot13Transformer::class)
117117
->setPublic(false);
118118
119+
.. code-block:: php-fluent-di
120+
121+
// config/services.php
122+
return function(ContainerConfigurator $configurator) {
123+
$container = $configurator->services()
124+
->defaults()
125+
->autowire()
126+
->autoconfigure()
127+
->private();
128+
129+
$container->set(TwitterClient::class)
130+
->autowire(); // redundant thanks to defaults, but value is overridable on each service
131+
$container->set(Rot13Transformer::class)
132+
->autowire();
133+
};
134+
135+
119136
Now, you can use the ``TwitterClient`` service immediately in a controller::
120137

121138
namespace App\Controller;
@@ -237,6 +254,22 @@ adding a service alias:
237254
->setPublic(false);
238255
$container->setAlias(Rot13Transformer::class, 'app.rot13.transformer');
239256
257+
.. code-block:: php-fluent-di
258+
259+
// config/services.php
260+
use App\Util\Rot13Transformer;
261+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
262+
263+
return function(ContainerConfigurator $configurator) {
264+
// ...
265+
266+
$container->set('app.rot13.transformer', Rot13Transformer::class)
267+
->autowire()
268+
->private();
269+
$container->alias(Rot13Transformer::class, 'app.rot13.transformer');
270+
};
271+
272+
240273
This creates a service "alias", whose id is ``App\Util\Rot13Transformer``.
241274
Thanks to this, autowiring sees this and uses it whenever the ``Rot13Transformer``
242275
class is type-hinted.
@@ -332,6 +365,21 @@ To fix that, add an :ref:`alias <service-autowiring-alias>`:
332365
$container->autowire(Rot13Transformer::class);
333366
$container->setAlias(TransformerInterface::class, Rot13Transformer::class);
334367
368+
.. code-block:: php-fluent-di
369+
370+
// config/services.php
371+
use App\Util\Rot13Transformer;
372+
use App\Util\TransformerInterface;
373+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
374+
375+
return function(ContainerConfigurator $configurator) {
376+
// ...
377+
378+
$container->set(Rot13Transformer::class);
379+
$container->alias(TransformerInterface::class, Rot13Transformer::class);
380+
};
381+
382+
335383
Thanks to the ``App\Util\TransformerInterface`` alias, the autowiring subsystem
336384
knows that the ``App\Util\Rot13Transformer`` service should be injected when
337385
dealing with the ``TransformerInterface``.
@@ -429,6 +477,28 @@ that alias:
429477
//->setArgument('$transformer', new Reference(UppercaseTransformer::class))
430478
;
431479
480+
.. code-block:: php-fluent-di
481+
482+
// config/services.php
483+
use App\Util\Rot13Transformer;
484+
use App\Util\UppercaseTransformer;
485+
use App\Util\TransformerInterface;
486+
use App\Service\TwitterClient;
487+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
488+
use function Symfony\Component\DependencyInjection\Loader\Configurator\ref;
489+
490+
return function(ContainerConfigurator $configurator) {
491+
// ...
492+
493+
$container->set(Rot13Transformer::class);
494+
$container->set(UppercaseTransformer::class);
495+
$container->alias(TransformerInterface::class, Rot13Transformer::class);
496+
497+
$container->set(TwitterClient::class)
498+
->autowire()
499+
// ->arg('$transformer', ref(UppercaseTransformer::class))
500+
};
501+
432502
Thanks to the ``App\Util\TransformerInterface`` alias, any argument type-hinted
433503
with this interface will be passed the ``App\Util\Rot13Transformer`` service.
434504
But, you can also manually wire the *other* service by specifying the argument

service_container/calls.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,17 @@ To configure the container to call the ``setLogger`` method, use the ``calls`` k
7171
7272
$container->register(MessageGenerator::class)
7373
->addMethodCall('setLogger', [new Reference('logger')]);
74+
75+
.. code-block:: php-fluent-di
76+
77+
// config/services.php
78+
use App\Service\MessageGenerator;
79+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
80+
use function Symfony\Component\DependencyInjection\Loader\Configurator\ref;
81+
82+
return function(ContainerConfigurator $configurator) {
83+
// ...
84+
$container->set(MessageGenerator::class)
85+
->call('setLogger', [ref('logger')]);
86+
};
87+

service_container/configurators.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,26 @@ all the classes are already loaded as services. All you need to do is specify th
184184
$container->getDefinition(GreetingCardManager::class)
185185
->setConfigurator([new Reference(EmailConfigurator::class), 'configure']);
186186
187+
.. code-block:: php-fluent-di
188+
189+
// config/services.php
190+
use App\Mail\EmailConfigurator;
191+
use App\Mail\GreetingCardManager;
192+
use App\Mail\NewsletterManager;
193+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
194+
use function Symfony\Component\DependencyInjection\Loader\Configurator\ref;
195+
196+
return function(ContainerConfigurator $configurator) {
197+
$container = $configurator->services();
198+
199+
$container->load('App\', '../src/*');
200+
$container->set(NewsletterManager::class)
201+
->configurator(ref(EmailConfigurator::class), 'configure');
202+
203+
$container->set(GreetingCardManager::class)
204+
->configurator(ref(EmailConfigurator::class), 'configure');
205+
};
206+
187207
The traditional configurator syntax in YAML files used an array to define
188208
the service id and the method name:
189209

service_container/expression_language.rst

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,23 @@ to another service: ``App\Mailer``. One way to do this is with an expression:
6262
$container->autowire(Mailer::class)
6363
->addArgument(new Expression('service("App\\\\Mail\\\\MailerConfiguration").getMailerMethod()'));
6464
65+
.. code-block:: php-fluent-di
66+
67+
// config/services.php
68+
use App\Mail\MailerConfiguration;
69+
use App\Mailer;
70+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
71+
use function Symfony\Component\DependencyInjection\Loader\Configurator\expr;
72+
73+
return function(ContainerConfigurator $configurator) {
74+
// ...
75+
$container->set(MailerConfiguration::class);
76+
77+
$container->set(Mailer::class)
78+
->args([expr(sprintf('service(%s).getMailerMethod()', MailerConfiguration::class))]);
79+
};
80+
81+
6582
To learn more about the expression language syntax, see :doc:`/components/expression_language/syntax`.
6683

6784
In this context, you have access to 2 functions:
@@ -110,5 +127,19 @@ via a ``container`` variable. Here's another example:
110127
"container.hasParameter('some_param') ? parameter('some_param') : 'default_value'"
111128
));
112129
130+
.. code-block:: php-fluent-di
131+
132+
// config/services.php
133+
use App\Mailer;
134+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
135+
use function Symfony\Component\DependencyInjection\Loader\Configurator\expr;
136+
137+
return function(ContainerConfigurator $configurator) {
138+
$container = $configurator->services();
139+
140+
$container->set(Mailer::class)
141+
->args([expr("container.hasParameter('some_param') ? parameter('some_param') : 'default_value'")]);
142+
};
143+
113144
Expressions can be used in ``arguments``, ``properties``, as arguments with
114145
``configurator`` and as arguments to ``calls`` (method calls).

service_container/factories.rst

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,21 @@ configure the service container to use the
7777
// call the static method
7878
->setFactory([NewsletterManagerStaticFactory::class, 'createNewsletterManager']);
7979
80+
.. code-block:: php-fluent-di
81+
82+
// config/services.php
83+
use App\Email\NewsletterManager;
84+
use App\Email\NewsletterManagerStaticFactory;
85+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
86+
87+
return function(ContainerConfigurator $configurator) {
88+
$container = $configurator->services();
89+
90+
$container->set(NewsletterManager::class)
91+
->factory([NewsletterManagerStaticFactory::class, 'createNewsletterManager']);
92+
};
93+
94+
8095
.. note::
8196

8297
When using a factory to create services, the value chosen for class
@@ -143,6 +158,21 @@ Configuration of the service container then looks like this:
143158
'createNewsletterManager',
144159
]);
145160
161+
.. code-block:: php-fluent-di
162+
163+
// config/services.php
164+
use App\Email\NewsletterManager;
165+
use App\Email\NewsletterManagerFactory;
166+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
167+
use function Symfony\Component\DependencyInjection\Loader\Configurator\ref;
168+
169+
return function(ContainerConfigurator $configurator) {
170+
$container = $configurator->services();
171+
172+
$container->set(NewsletterManager::class)
173+
->factory([ref(NewsletterManagerFactory::class), 'createNewsletterManager']);
174+
};
175+
146176
.. note::
147177

148178
The traditional configuration syntax in YAML files used an array to define
@@ -216,3 +246,20 @@ example takes the ``templating`` service as an argument:
216246
new Reference(NewsletterManagerFactory::class),
217247
'createNewsletterManager',
218248
]);
249+
250+
.. code-block:: php-fluent-di
251+
252+
// config/services.php
253+
use App\Email\NewsletterManager;
254+
use App\Email\NewsletterManagerFactory;
255+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
256+
use function Symfony\Component\DependencyInjection\Loader\Configurator\ref;
257+
258+
return function(ContainerConfigurator $configurator) {
259+
$container = $configurator->services();
260+
261+
$container->set(NewsletterManager::class)
262+
->args([ref('templating')])
263+
->factory([ref(NewsletterManagerFactory::class), 'createNewsletterManager']);
264+
};
265+

service_container/import.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ To import this file, use the ``imports`` key from a file that *is* loaded:
9999
// config/services.php
100100
$loader->import('services/mailer.php');
101101
102+
.. code-block:: php-fluent-di
103+
104+
// config/services.php
105+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
106+
107+
return function(ContainerConfigurator $configurator) {
108+
$configurator->import('services/mailer.php');
109+
};
110+
102111
The ``resource`` location, for files, is either a relative path from the
103112
current file or an absolute path.
104113

0 commit comments

Comments
 (0)