Важные советы, которые необходимо знать перед обновлением проекта с Symfony 2 до Symfony 3

В этой статье мы поделимся с вами наиболее значительными изменениями вашего кода в новой версии. Мы также предлагаем вам пару советов, прежде чем приступить к обновлению:

  • Убедитесь, что ваш сервер поддерживает как минимум PHP 5.5.9
  • Сделайте ваш код свободным от устаревания (используйте phpunit или обратите внимание на профилировщик symfony dev).
  • Убедитесь, что все используемые вами пакеты уже поддерживают Symfony 3, в противном случае не выполняйте обновление.
  • Время! Поскольку это обновление может вызвать проблемы с вашим реальным кодом, и вам может потребоваться время для их решения.

Фреймворк

Метод getRequest базового класса Controller устарел с Symfony 2.4 и поэтому должен быть удален в 3.0. Единственный надежный способ получить объект Request — внедрить его в метод действия.

Это означает, что мы не получим запрос внутри действия, вместо этого мы получим запрос как параметр в функции.

namespace myBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
class StartController
{
public function showAction(Request $request)
{
// $request->query->get('aGetParameter')
}
}

Служба form.csrf_provider удаляется, так как она реализует адаптер для нового менеджера токенов для устаревшего интерфейса Symfony \ Component \ Form \ Extension \ Csrf \ CsrfProvider \ CsrfProviderInterface. Вместо этого следует использовать security.csrf.token_manager.

Безопасность

Параметр прослушивателя межсетевого экрана для намерений был переименован в csrf_token_id.

Параметр прослушивателя брандмауэра csrf_provider был переименован в 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

маршрутизация

Некоторые настройки маршрута были переименованы и больше не будут работать в Symfony 3:

  • Настройка шаблона была удалена в пользу пути
  • Требования _scheme и _method перенесены в настройки схем и методов.
# 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

Хотя вы можете подумать, что это не так важно, если вы создаете свои собственные сервисы, это может быть полезно.

  • Использование двоеточия в значении отображения без кавычек приводит к исключению ParseException.
  • Начало строки без кавычек с @, `, | или> приводит к исключению ParseException.
  • Когда строки заключаются в двойные кавычки, теперь вы должны экранировать символы \. Невозможность экранировать эти символы (если они заключены в двойные кавычки) приводит к исключению 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

формы

Имена типов были удалены. Вместо того, чтобы ссылаться на типы по имени, вы должны вместо этого ссылаться на них по их полному имени класса (FQCN).

Мы используем, чтобы дать тип в качестве второго параметра в конструкторе форм:

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

однако теперь мы не можем дать имя в виде строки!

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();

Например, мы нашли типы: SubmitType, UrlType, FormType, HiddenType, LocaleType и т. Д. (Дополнительные типы см. В разделе Symfony \ Component \ Form \ Extension \ Core \ Type \ folder)

Передача экземпляров типа в Form::add(), FormBuilder::add() и FormFactory::create*() методы больше не поддерживаются. Вместо этого передайте полное имя класса типа.

В контроллерах мы использовали для создания новый экземпляр типа вашей сущности:

use thisismyBundle\Form\MyCustomType;
$form = $this->createForm(new MyCustomType(),$entity .......);

Теперь мы будем использовать вместо:

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

Передача экземпляра Symfony \ Component \ HttpFoundation \ Request, что было поддержано FormInterface::bind(), не возможно с FormInterface::submit() больше. Вы должны использовать FormInterface::handleRequest() вместо.

Если ваша версия Symfony> = 2.6. *, Вы не столкнетесь с этой проблемой. Метод связывания был удален, вам нужно использовать handleRequest. Старый способ:

if ('POST' === $request->getMethod()) {
$form->bind($request);
if ($form->isValid()) {
// do some stuff
}
}

Теперь мы обработаем запрос напрямую:

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

Если вы хотите узнать больше деталей или этот пост не соответствует вашим потребностям, прочитайте полный список обновлений в репозитории Symfony здесь. Веселитесь, и пусть сила будет с вами в этом путешествии.

Ссылка на основную публикацию
Adblock
detector