@Route and @Method
==================

**Routing annotations of the SensioFrameworkExtraBundle are deprecated** since
version 5.2 because they are now a core feature of Symfony.

How to Update your Applications
-------------------------------

``@Route`` Annotation
~~~~~~~~~~~~~~~~~~~~~

The Symfony ``@Route`` annotation is similar to the SensioFrameworkExtraBundle
annotation, so you only have to update the annotation class namespace:

.. code-block:: diff

    -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    +use Symfony\Component\Routing\Annotation\Route;

    class DefaultController extends Controller
    {
        /**
         * @Route("/")
         */
        public function index()
        {
            // ...
        }
    }

Alternatively, it can be done with the help of the PHP 8 attribute:

.. code-block:: diff

    -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    +use Symfony\Component\Routing\Annotation\Route;

    class DefaultController extends Controller
    {
    -    /**
    -     * @Route("/")
    -     */
    +    #[Route('/')]
        public function index()
        {
            // ...
        }
    }

The main difference is that Symfony's annotation no longer defines the
``service`` option, which was used to instantiate the controller by fetching the
given service from the container. In modern Symfony applications, all
`controllers are services by default`_ and their service IDs are their fully-
qualified class names, so this option is no longer needed.

``@Method`` Annotation
~~~~~~~~~~~~~~~~~~~~~~

The ``@Method`` annotation from SensioFrameworkExtraBundle has been removed.
Instead, the Symfony ``@Route`` annotation defines a ``methods`` option to
restrict the HTTP methods of the route:

.. code-block:: diff

    -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
    +use Symfony\Component\Routing\Annotation\Route;

    class DefaultController extends Controller
    {
        /**
    -      * @Route("/show/{id}")
    -      * @Method({"GET", "HEAD"})
    +      * @Route("/show/{id}", methods={"GET","HEAD"})
         */
        public function show($id)
        {
            // ...
        }
    }

Alternatively, it can be done with the help of the PHP 8 attribute:

.. code-block:: diff

    -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
    +use Symfony\Component\Routing\Annotation\Route;

    class DefaultController extends Controller
    {
    -    /**
    -     * @Route("/show/{id}")
    -     * @Method({"GET", "HEAD"})
    -     */
    +    #[Route('/show/{id}', methods: ['GET','HEAD'])]
        public function show($id)
        {
            // ...
        }
    }


Read the `chapter about Routing`_ in the Symfony Documentation to learn
everything about these and the other annotations available.

.. _`controllers are services by default`: https://symfony.com/doc/current/controller/service.html
.. _`chapter about Routing`: https://symfony.com/doc/current/routing.html
