@@ -214,21 +214,31 @@ have an ``array`` return type in Symfony 6. In order to be compatible, you
214
214
must add the same return type to the ``getRoles() `` method while using
215
215
Symfony 5.4.
216
216
217
- To help with this, Symfony provides a ``DebugClassLoader `` that can add
218
- these native return types automatically for you. It can be configured using
219
- the ``SYMFONY_PATCH_TYPE_DECLARATIONS `` env var. The value of this env var
220
- is url-encoded (e.g. ``param1=value2¶m2=value2 ``), the following
217
+ To help with this, Symfony provides a script that can add these native
218
+ return types automatically for you in the ``symfony/error-handler ``
219
+ component. When installed, generate a complete class map using Composer
220
+ and run the script to iterate over the class map and fix any incompatible
221
+ method:
222
+
223
+ .. code-block :: terminal
224
+
225
+ # "-o" is important! This forces Composer to find all classes
226
+ $ composer dump-autoload -o
227
+
228
+ # patch all incompatible method declarations
229
+ $ ./vendor/bin/patch-type-declarations
230
+
231
+ The behavior of this script can be modified using the
232
+ ``SYMFONY_PATCH_TYPE_DECLARATIONS `` env var. The value of this env var is
233
+ url-encoded (e.g. ``param1=value2¶m2=value2 ``), the following
221
234
parameters are available:
222
235
223
236
``force ``
224
237
Enables fixing return types, the value must be one of:
225
238
226
- * ``2 `` to add all possible return types (default, useful for applications)
227
- * ``1 `` to add return types only to tests/final/internal/private methods
228
- * ``phpdoc `` to only add docblock annotations to the incompatible methods
229
-
230
- If you're developing an application, you should set this to ``2 ``. The
231
- other values are useful for open source maintainers.
239
+ * ``2 `` to add all possible return types (default, recommended for applications);
240
+ * ``1 `` to add return types only to tests, final, internal or private methods;
241
+ * ``phpdoc `` to only add docblock annotations to the incompatible methods.
232
242
233
243
``php ``
234
244
The target version of PHP - e.g. ``7.1 `` doesn't generate "object"
@@ -240,41 +250,49 @@ parameters are available:
240
250
when a child class misses a return type while the parent declares an
241
251
``@return `` annotation (defaults to ``1 ``).
242
252
243
- If you're developing an application, use
244
- ``SYMFONY_PATCH_TYPE_DECLARATIONS=force=2 ``. Symfony will only fix classes
245
- that are autoloaded. You can create a custom script that makes sure all
246
- classes in your project are loaded and fixed::
253
+ If there are specific files that should be ignored, you can set the
254
+ ``SYMFONY_PATCH_TYPE_EXCLUDE `` env var to a regex. This regex will be
255
+ matched to the full path to the class and each matching path will be
256
+ ignored. By default, this regex matches all classes in the ``vendor/ ``
257
+ directory.
247
258
248
- <?php
249
- // bin/fix-types.php
259
+ .. sidebar :: Patching Types for Open Source Maintainers
250
260
251
- // required when using the PhpUnitBridge without "phpunit/phpunit"
252
- require __DIR__.'/../vendor/bin/.phpunit/phpunit/vendor/autoload.php';
261
+ Open source bundles and packages need to be more cautious with adding
262
+ return types, as adding a return type forces all users extending the
263
+ class to add the return type as well. The recommended approach is to
264
+ use a 2 step process:
253
265
254
- $loader = require __DIR__.'/../vendor/autoload.php';
266
+ 1. First, create a minor release (i.e. without backwards compatibility
267
+ breaks) where you add types that can be safely introduced and add
268
+ ``@return `` PHPdoc to all other methods:
255
269
256
- // enable Symfony's class loader
257
- Symfony\Component\ErrorHandler\DebugClassLoader::enable();
270
+ .. code-block :: terminal
258
271
259
- foreach ($loader->getClassMap() as $class => $file) {
260
- // don't fix classes in the "vendor/" directory
261
- if (str_contains(realpath($file), '/vendor/')) {
262
- continue;
263
- }
272
+ # Add type declarations to all internal, final, tests and private methods.
273
+ # Update the "php" parameter to match your minimum required PHP version
274
+ $ SYMFONY_DEPRECATIONS_HELPER="force=1&php=7.4" ./vendor/bin/patch-type-declarations
264
275
265
- // loads the class
266
- class_exists($class);
267
- }
276
+ # Add PHPdoc to the leftover public and protected methods
277
+ $ SYMFONY_DEPRECATIONS_HELPER="force=phpdoc&php=7.4" ./vendor/bin/patch-type-declarations
268
278
269
- Symfony\Component\ErrorHandler\DebugClassLoader::checkClasses();
279
+ After running the scripts, check your classes and add more ``@return ``
280
+ PHPdoc where they are missing. The deprecations and patch script
281
+ work purely based on the PHPdoc information. Users of this release
282
+ will be warned to update their method declarations to add the
283
+ missing return types.
270
284
271
- Now, you can use the Composer autoloader to find all classes and use this
272
- script to fix them:
285
+ If you didn't need any PHPdoc and all your method declarations are
286
+ already compatible, you can safely allow ``^6.0 `` for the Symfony
287
+ dependencies. Otherwise, you have to continue with (2).
273
288
274
- .. code-block :: terminal
289
+ 2. Create a new major release (i.e. *with * backwards compatibility
290
+ breaks) where you add types to all methods:
275
291
276
- # "-o" is important! This forces Composer to find all classes
277
- $ composer dump-autoload -o
292
+ .. code-block :: terminal
293
+
294
+ # Update the "php" parameter to match your minimum required PHP version
295
+ $ SYMFONY_DEPRECATIONS_HELPER="force=2&php=7.4" ./vendor/bin/patch-type-declarations
278
296
279
- # run your custom script to add all types
280
- $ SYMFONY_PATCH_TYPE_DECLARATIONS=force=2 php bin/fix-types.php
297
+ As this release adds type declarations, you can safely allow
298
+ `` ^6.0 `` for the Symfony dependencies.
0 commit comments