在本文中, 我们将与你分享新版本中代码的最重要更改。我们建议你在升级之前也有一些提示:
- 检查你的服务器是否至少支持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存储库中的完整升级列表。祝你旅途愉快, 并希望旅途中的力量与你同在。
评论前必须登录!
注册