个性化阅读
专注于IT技术分析

从symfony 2升级到symfony 3之前需要了解的重要提示

在本文中, 我们将与你分享新版本中代码的最重要更改。我们建议你在升级之前也有一些提示:

  • 检查你的服务器是否至少支持PHP 5.5.9
  • 免费使用代码(使用phpunit或注意symfony dev profiler)。
  • 检查你使用的所有捆绑包是否已经支持symfony 3, 否则请勿升级。
  • 时间 !由于此更新可能会导致实际代码出现问题, 因此你可能需要一些时间来解决它们。

从Symfony 2.4开始不推荐使用基本Controller类的getRequest方法, 因此必须在3.0中将其删除。获取Request对象的唯一可靠方法是将其注入到action方法中。

这意味着我们不会在动作内部获取请求, 而是将请求作为函数中的参数接收。

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+' }

尽管你可能认为这不太相关, 但是如果你创建自己的服务, 这可能会很有用。

  • 在未引用的映射值中使用冒号会导致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 \文件夹)

不再支持将类型实例传递给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 .......);

如FormInterface :: bind()支持的那样, 不再可以通过FormInterface :: submit()传递Symfony \ Component \ HttpFoundation \ Request实例。你应该改用FormInterface :: handleRequest()。

如果你的Symfony版本> = 2.6。*, 你将不会遇到此问题。 bind方法已被删除, 你需要改用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存储库中的完整升级列表。祝你旅途愉快, 并希望旅途中的力量与你同在。

赞(0)
未经允许不得转载:srcmini » 从symfony 2升级到symfony 3之前需要了解的重要提示

评论 抢沙发

评论前必须登录!