Symfony 3.2中包含了海量微调和改进,以令开发更容易,并且提高你的生产力。本文总结了一些 DX 改进点:

添加了进度条回退的能力 

比如,当某些任务的工作量“无法被事先决定”时,这就非常有用了。这种场合,你可以通过 advance() 方法来设置一个负步数,即可令进度条回退:

1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\Console\Helper\ProgressBar;
 
$progress = new ProgressBar($output, 100);
$progress->start();
 
// ... do some work / 进行一些操作
$progress->advance(30);
 
// new tasks are created, regress the bar by 10 steps
// 新任务创建了,令进度条退回10步
$progress->advance(-10);

自动侦测服务定义的类 

在PHP 7.x中,在方法中可以定义其返回值的类型(译注:这种写法和typescript有点像)。例如:

1
2
3
4
public function myFactory(): MyServiceClass
{
    // ...
}

在Symfony 3.2中,我们已经添加了 FactoryReturnTypePass 这个compiler pass,可以自动更新这些“定义了返回值类型”的工厂方法之服务定义。

添加对PhpStorm links的支持 

Symfony的 framework.ide 配置选项把任何“在Symfony错误页中显示的文件路径”给转换成“可点击链接”,即可在你心仪的编辑器/ide中,开打开那个真实的文件及行号。我们已经支持了许多种编辑器(SublimeText, Vim等等),以及,在Symfony 3.2中,支持了PhpStorm。

添加对表单类型扩展优先级的支持 

Form extension可谓基于已有的Symfony表单类型来添加自定义功能的最佳方式。这些扩展作为打了特殊的 form.type_extension 标签的服务而被开启。在Symfony 3.2中,该标签定义了一个新的可选属性,叫做 priority,以便能够更好地控制“表单类型扩展被加载”时的顺序:

1
2
3
4
5
6
services:
    app.form.image_type_extension:
        class: AppBundle\Form\Extension\ImageTypeExtension
        tags:
            - { name: form.type_extension, priority: -128,
                extended_type: Symfony\Component\Form\Extension\Core\Type\FileType }

对JsonResponse添加了一个已命名的构造器 

如果你创建了一个 JsonResponse 对象,内含已经被转码为Json字符串的内容,你必须传入一个 true 作为 JsonResponse 可选的第四个参数:

1
2
// $contents = '{"foo":"bar"}';
return new JsonResponse($contents, Response::HTTP_OK, [], true);

在Symfony 3.2中,你可以使用全新的 fromJsonString() 已命名构造器(named constructor):

1
2
// $contents = '{"foo":"bar"}';
return JsonResponse::fromJsonString($contents);

为service configurators(服务配置器)添加了一个快捷语法 

Service Configurator 允许你“在服务被实例化之后”使用回调来配置它。在Symfony 3.2中,你可以使用一个快捷语法来将其定义在YAML配置文件中:

1
2
3
4
5
6
7
8
services:
    app.some_service:
        class: ...
        # Traditional syntax / 传统语法
        configurator: [ '@app.configurator', 'configure' ]
        # New short syntax supported by Symfony 3.2
        # Symfony 3.2支持的快捷语法
        configurator: 'app.configurator:configure'

当更新翻译源时允许指定一个domain 

translation:update 命令现已支持 --domain 选项来更新“仅和该domain相关”的messages(翻译信息)。这在那些定义了许多translation domain(翻译域)的复杂程序中非常有用。

1
$  ./bin/console translation:update en --force --domain=admin

简化了transChoice()方法 

transChoice() PHP函数已经被简化,以匹配Twig中的 transchoice调节器。这意味着你不需要再提供“用于选出合适的翻译”的数字参数值给可选的第三个参数:

1
2
3
4
5
6
7
// Before / 之前
$this->get('translator')
    ->transChoice('1 apple|%count% apples', 7, ['%count%' => 7]);
 
// After / 现在
$this->get('translator')
    ->transChoice('1 apple|%count% apples', 7);