¡Puedes actualizar un proyecto de Symfony 2 a Symfony 3! Pero necesitarías leer algunos consejos y puntos importantes que necesitas saber antes de actualizar.

Consejos importantes que debes conocer antes de actualizar tu proyecto de Symfony 2 a Symfony 3
En este artículo, compartiremos contigo los  cambios más significativos  de tu código en la nueva versión. Le sugerimos también un par de consejos antes de continuar con su actualización:
  • Compruebe que su servidor admita al menos PHP 5.5.9
  • Haga que su código sea gratuito (usando phpunit o preste atención al generador de perfiles de desarrollo de Symfony).
  • Compruebe que todos los paquetes que utiliza ya sean compatibles con Symfony 3 ; de lo contrario, no actualice.
  • Hora ! Como esta actualización puede causar problemas con su código real y es posible que necesite tiempo para resolverlos.

Framework

El método getRequest de la clase Controller base ha quedado obsoleto desde Symfony 2.4 y, por lo tanto, debe eliminarse en 3.0. La única forma confiable de obtener el objeto Request es inyectarlo en el método de acción.

Eso significa que no obtendremos la solicitud dentro de la acción, sino que recibiremos la solicitud como parámetro en la función.

namespace myBundle\Controller;

use Symfony\Component\HttpFoundation\Request;

class StartController
{
   public function showAction(Request $request)
   {
       // $request->query->get('aGetParameter')
   }
}

El servicio form.csrf_provider se elimina ya que implementa un adaptador para el nuevo administrador de tokens en la interfaz obsoleta Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface. En su lugar, debe usarse security.csrf.token_manager.

Seguridad

La configuración de escucha de firewall de intención se renombró a csrf_token_id. 

Se cambió el nombre de la configuración de escucha del firewall csrf_provider a csrf_token_generator.

# Using FOSUserBundle for example
main:
    pattern: ^/
    form_login:
        provider: fos_userbundle
        csrf_token_generator: security.csrf.token_manager
        # in Symfony < 2.8, we used instead :
        # csrf_provider: form.csrf_provider

Enrutamiento

Se ha cambiado el nombre de algunas configuraciones de ruta y ya no funcionarán en Symfony 3:

  • La configuración del patrón se ha eliminado a favor de la ruta.
  • Los requisitos _scheme y _method se han movido a la configuración de esquemas y métodos
# Deprecated
article_edit:
   pattern: /article/{id}
   requirements: { '_method': 'POST|PUT', '_scheme': 'https', 'id': '\d+' }

# Now

article_edit:
   path: /article/{id}
   methods: [POST, PUT]
   schemes: https
   requirements: { 'id': '\d+' }

YAML

Aunque puede pensar que esto no es tan relevante, si crea sus propios servicios, esto puede ser útil.

  • El uso de dos puntos en un valor de asignación sin comillas conduce a una ParseException.
  • Comenzar una cadena sin comillas con @, `, | o> conduce a una ParseException. 
  • Cuando rodee cadenas con comillas dobles, ahora debe escapar \ caracteres. No escapar de esos caracteres (cuando están rodeados de comillas dobles) conduce a una ParseException.
# this will lead to a ParseException
class: "Foo\Var"

# escape the characters or simply do not encapsulate a class in quotes
class: "Foo\\Var"
class: Foo\Var

Formularios

Se eliminaron los nombres de los tipos. En lugar de hacer referencia a los tipos por su nombre, debe hacer referencia a ellos por su nombre de clase completo (FQCN).

Usamos para dar el tipo como segundo parámetro en el generador de formularios:

$form = $this->createFormBuilder()
->add('name', 'text')
->add('age', 'integer')
->getForm();

sin embargo, ahora no podemos dar el nombre como una cadena.

use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\DatetimeType;

// Don't forget to include the typeClass

$form = $this->createFormBuilder()
->add('name', TextType::class) 
->add('age', IntegerType::class)
->add('description', TextareaType::class)
->getForm();

En los tipos, encontramos, por ejemplo: SubmitType, UrlType, FormType, HiddenType, LocaleType, etc. (consulte la carpeta Symfony \ Component \ Form \ Extension \ Core \ Type \ para obtener más tipos)

Pasando instancias de tipo a Form::add()FormBuilder::add()y los FormFactory::create*()métodos no se admite más. En su lugar, pase el nombre de clase completamente calificado del tipo.

En los controladores usamos para crear una nueva instancia del tipo de su entidad:

use thisismyBundle\Form\MyCustomType;

$form = $this->createForm(new MyCustomType(),$entity .......);

Ahora usaremos en su lugar:

use thisismyBundle\Form\MyCustomType;

$form = $this->createForm(MyCustomType::class,$entity .......);

Pasar una instancia de Symfony \ Component \ HttpFoundation \ Request, como era compatible con FormInterface::bind(), ya no es posible FormInterface::submit() . Deberías usar FormInterface::handleRequest()en su lugar.

Si su versión de Symfony es >= 2.6. * No enfrentará este problema. El método de vinculación se ha eliminado, debe usar handleRequest en su lugar. Vieja forma :

if ('POST' === $request->getMethod()) {
   $form->bind($request);

   if ($form->isValid()) {
       // do some stuff
   }
}

Ahora manejaremos la solicitud directamente:

$form->handleRequest($request);

if ($form->isValid()) {
   // do some stuff and redirect
}

Si quieres conocer más detalles o esta publicación no se ajusta a tus necesidades, lee la lista completa de actualizaciones en el repositorio de Symfony aquí . Diviértete y que la fuerza te acompañe en este viaje.


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores