How to Upgrade Twig from Underscored to Namespaces
What is new?
Switch from deprecated --set
option to rector.php
config.
Symfony recently announced a new version of Twig with namespaces as we know it. Before PHP 5.2 there was Underscored_Namespace
- I remember because that was the first version I used.
Today I'll show you how to upgrade from _
to \\
in few minutes seconds.

This set would not be possible and as good as it is without you, open-source PHP community. I'd like to thank 👏:
- greg0ire for contributing to this set
- and enumag for battle testing and reported issues
Find and Replace?
So all we need to do is replace Twig_
with Twig\
?
-Twig_Function
+Twig\Function
This would fail since Twig\Function
class doesn't exist. Twig\TwigFunction
does. There 150 more cases where find and replace fails.
2 Places
We need to replace both docblocks:
/**
- * @throws \Twig_Error_Loader
+ * @throws \Twig\Error\LoaderError
*/
public function render(): void
{
- /** @var \Twig_Environment $env */
+ /** @var \Twig\Environment $env */
$env = $this->getTwigEnv();
// ...
}
And the code:
-$safeTwigEnvironment = new \Twig_Environment(
+$safeTwigEnvironment = new \Twig\Environment(
- new \Twig_Loader_Array([])
+ new \Twig\Loader\ArrayLoader([])
);
In a reaction to the Symfony blog post, I see many developers do upgrades manually. In case of 50 changes, it's ok, but private code bases will go 1000+ use cases.
Code Pattern Refactoring
For Rector it just 1 pattern to refactor. Just tell him to process your files src
:
- Install Rector
composer require rector/rector --dev
- Update
rector.php
use Rector\Symfony\Set\TwigSetList;
use Rector\Config\RectorConfig;
return function (RectorConfig $rectorConfig): void {
$rectorConfig->import(TwigSetList::TWIG_UNDERSCORE_TO_NAMESPACE);
};
- Run Rector
vendor/bin/rector process src
Happy coding!
Have you find this post useful? Do you want more?
Follow me on Twitter, RSS or support me on GitHub Sponsors.