// composer.json
{
"require": {
"php": "^8.0.2",
"ext-ctype": "*",
"ext-iconv": "*",
"babdev/pagerfanta-bundle": "^3.6", // v3.6.1
"composer/package-versions-deprecated": "^1.11", // 1.11.99.5
"doctrine/annotations": "^1.13", // 1.13.2
"doctrine/dbal": "^3.3", // 3.3.5
"doctrine/doctrine-bundle": "^2.0", // 2.6.2
"doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.2
"doctrine/orm": "^2.0", // 2.11.2
"knplabs/knp-markdown-bundle": "^1.8", // 1.10.0
"knplabs/knp-time-bundle": "^1.18", // v1.18.0
"pagerfanta/doctrine-orm-adapter": "^3.6", // v3.6.1
"pagerfanta/twig": "^3.6", // v3.6.1
"sensio/framework-extra-bundle": "^6.0", // v6.2.6
"sentry/sentry-symfony": "^4.0", // 4.2.8
"stof/doctrine-extensions-bundle": "^1.5", // v1.7.0
"symfony/asset": "6.0.*", // v6.0.7
"symfony/console": "6.0.*", // v6.0.7
"symfony/dotenv": "6.0.*", // v6.0.5
"symfony/flex": "^2.1", // v2.1.7
"symfony/form": "6.0.*", // v6.0.7
"symfony/framework-bundle": "6.0.*", // v6.0.7
"symfony/mailer": "6.0.*", // v6.0.5
"symfony/monolog-bundle": "^3.0", // v3.7.1
"symfony/property-access": "6.0.*", // v6.0.7
"symfony/property-info": "6.0.*", // v6.0.7
"symfony/proxy-manager-bridge": "6.0.*", // v6.0.6
"symfony/routing": "6.0.*", // v6.0.5
"symfony/runtime": "6.0.*", // v6.0.7
"symfony/security-bundle": "6.0.*", // v6.0.5
"symfony/serializer": "6.0.*", // v6.0.7
"symfony/stopwatch": "6.0.*", // v6.0.5
"symfony/twig-bundle": "6.0.*", // v6.0.3
"symfony/ux-chartjs": "^2.0", // v2.1.0
"symfony/validator": "6.0.*", // v6.0.7
"symfony/webpack-encore-bundle": "^1.7", // v1.14.0
"symfony/yaml": "6.0.*", // v6.0.3
"symfonycasts/verify-email-bundle": "^1.7", // v1.10.0
"twig/extra-bundle": "^2.12|^3.0", // v3.3.8
"twig/string-extra": "^3.3", // v3.3.5
"twig/twig": "^2.12|^3.0" // v3.3.10
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.1
"phpunit/phpunit": "^9.5", // 9.5.20
"rector/rector": "^0.12.17", // 0.12.20
"symfony/debug-bundle": "6.0.*", // v6.0.3
"symfony/maker-bundle": "^1.15", // v1.38.0
"symfony/var-dumper": "6.0.*", // v6.0.6
"symfony/web-profiler-bundle": "6.0.*", // v6.0.6
"zenstruck/foundry": "^1.16" // v1.18.0
}
}
19 Comments
After using rector to move from annotations to PHP8 attributes check your "doctrine.yaml" file and change: from:
type: annotationtotype: attributeindoctrine.orm.entity_managers.{xxx}.mappings key.I battled for a while after running rector and I was able to find the solution in Stackoverflow.
Hey Rafael,
Thanks for this tip!
Cheers!
Everything was going great until this chapter (not a bad run!). For some reason, Rector doesn't handle any of the annotations in my code. I tried the following entries in rector.php:
Nothing happened. Rector complete okay but there were no changes. I tried a few different rules like these just to see if it would attempt to make any changes, but still nothing:
I'm kind of stuck since I'm new to Rector. I don't even know where to begin looking to debug this. Any advice?
Hey Marcus,
It's difficlult to say for sure especially because your rector.php content is different from the one used in this course, but I will try to help or give you some hints at least. So I see your Rector file is different, was it generated by Rector itself? Could you show your full rector.php file? Also, what Rector version are you using? The Rector version that's used in this tutorial is v0.12.20. If you use that exact version with the content of rector.php shown in this course - I think it should work for you, otherwise you're calling the rector CLI tool incorrectly. What command exactly are you trying to execute? Are you sure you execute that command in the project root dir?
Cheers!
Thanks for the reply Victor. I'm using Rector v1.2.10. I generated the Rector file myself using the Rector documentation. The Rector file works for everything but the annotations. I ran it from the root directory of my project and it successfully modified a large set of file to add return type declarations. Here's the file:
I run
vendor/bin/rector process src/and it executes with no changes and the output message[OK] Rector is done!I have route, cache, and ORM annotations throughout the project and none of them are changes. My directory structure is typical (src/Controllers, src/Entity, etc.).
If you don't see anything obvious in my Rector file, should I try to roll back to the version in this course?
Thanks!
I figured it out thanks to a Stack Overflow post. It has something to do with phpstan which got installed along with Rector. When I remove the phpstan.dist.neon file and then run rector with the --clear-cache option, it works!
Hey @CMarcus ,
Woh, I would not think PhpStan may cause such problems, it sounds weird to me. Glad you figured it out, and thanks for sharing your solution with others!
Cheers!
I did not find any tutorial that is really clear about it, to use rector:
Install it using tutorial
Create a reactor.php file at the root of your project
Then run
vendor/bin/rectorRemove rector
Hey Loenix,
Do you mean the instructions in this video about how to use Rector are not clear for you? Because it's basically as you said, you need to install Rector in your system in your preferred way (or follow the way we use in this course), then create a configuration for it, and run the Rector to actually do the changes according to the configuration you created. Yeah, you can remove Rector and its config completely after it, or keep the config for the future when you will upgrade your Symfony version, PHPUnit version, or PHP version later - you would just need to tweak the config file... and probably upgrade Rector to the latest, it would be a good idea :)
Cheers!
Yes, It was I meant, I have read this tutorial and the doctrine documentation about it, there was some differences and I was unable to understand what the rector.php file is and where to put it. So I mixed your documentation and try something and it worked, so I though a comment was useful for futur readers.
Hey Loenix,
Thanks for sharing some tips with others. That rector.php file is a config file that will be read by Rector tool telling it what exactly it should do, i.e. it specifies some rules for Rector. And usually, you put such config files in the project root dir, like the PHPUnit config file, etc.
I hope that help!
Cheers!
A brief comment on why php introduced attributes (and where to find more info) would be useful or what could be done with them. Then the training would be a bit more holistic instead of just the mechanics of upgrading. It's mine and likely a few other people's first time seeing this php change and we don't understand it
Hey Cameron!
Very fair suggestion! It's sometimes hard to back up as an instructor and remember all the little details. I can at least give some explanation here. In short, annotations were created around 10 years ago by Doctrine, mostly so that we could add the
@ORM\Columnannotations inside entities. Other languages have similar syntaxes. Over the years, these got more and more popular, with things like@Route, assertions for validation constraints, etc.But, annotations were still not part of PHP's language. They're just comments, and Doctrine maintained a library that could read and parse those comments. It worked great, but it's still a bit odd for us to "invent" this new way of adding configuration into the comments system and not have it be part of PHP. And so, someone finally proposed putting into PHP itself. It has a slightly different syntax by necessity: we needed to introduce some new syntax that nobody could possibly be using already in their app (so that the introduction of PHP attributes wouldn't suddenly start making your code do something). Of course, there was a lot of debate on the syntax, and this was finally chosen as a balance between attractive/logical/simple.
I hope that helps - thanks for commenting about this :).
Cheers!
Hey! Attributes are great! But I have a question. I heard that you can use functions inside attributes uses for repetitive things.
I am thinking of a specific use case on API Platform for example (but this applies almost everywhere in reality).
Imagine, a Post entity. We want to create a custom action with API Platform that targets "/api/posts/count" to return the number of posts.
Now imagine that we would like to write the OpenAPI documentation for this action from our Post entity.
It could look like this:
Which is huge (I voluntarily took this kind of case but you can imagine that it applies to other things).
Therefore, the API Platform configuration of the Post entity is less readable and it would be necessary to move for example the entire value of the "count" key somewhere, in a private function, or even in an "api_doc" class which would contain functions with the configuration of each of our custom actions, and thus be able to simply call them from the entity.
Let's say we create a function
getCountActionConfig()which would return all the content currently present in the 'count' key, allowing us to do:Only, it doesn't seem possible, since the call to the method will be underlined in red by PhpStorm with the following error:
Constant expression contains invalid operations.Moving the contents of the function directly into a constant would work I guess, but the goal would still be to do it through a function. And we could even go further by having the possibility of automatically generating the configuration by passing the name of the method, the description...
But a priori it does not seem possible. Do you have a solution for this?
Hi,
Have you tried static function?
Cheers!
Hello, sorry for delay, yes I tried and no, same problem, I'll have the same error
Constant expression contains invalid operationswoh yeah, looks like the only way is to define a constant with the configuration you need and then it will work
I hope so )
Cheers!
Yes, this is so bad. I have to create a separate file that will contain a multitude of constants representing the configurations of my API Platform custom actions. It works, but...
It would be interesting if in a future PHP update we could use functions.
Thanks for your answers anyway!
Agree that's not very useful now, maybe something will change in future, so lets wait =)
Cheers and happy coding!
"Houston: no signs of life"
Start the conversation!