Symfony 2.7包括了无数代码的优化和改进。大量的微调只为提升你的每日生产力。本文就介绍七个虽小但却好用的调整。

增加了getParameter()控制器快捷方法 

从容器中取得一个参数值,在controller中可能是一个困扰Symfony初学者的常见问题。通常你会使用get()方法但却什么也得不到,然后你尝试使用一个并不存在的getParameter()方法。好在,Symfony 2.7添加了这个getParameter()快捷方式。

译注:shortcut是指从controller里直接用$this->来使用的方法,本站译为快捷方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 
class DefaultController extends Controller
{
    public function indexAction()
    {
        // Symfony 2.6
        $value = $this->container->getParameter('param_name');
 
        // Symfony 2.7
        $value = $this->getParameter('param_name');
 
        // ...
    }
}

增加了Symfony版本状态的反馈 

谁会去运行一个过期的Symfony却预期得到新版本中的强力功能呢?幸运的时,从Symfony 2.7开始,想运行过期版本的Symfony变得困难起来。因为web除错工具条新添了一个可视反馈,专门用于你的Symfony版本状态:

在分析结果页显示HTTP状态码 

有时你想要找到存在Symfony的debug分析器里的特定请求信息是很困难的。但在Symfony 2.7中这就容易了,多亏了request表格中的一个新列,用于显示HTTP状态码。

请注意,如果你要把profiler中的信息存到数据库中的话,比如MySQL或SQLite,你必须去除现有表格,或者手动添加一个status_code新列。

在路由条件中添加了对容器参数的支持 

Symfony 2.7中正式支持了在路由条件的表达式中使用容器参数。只需把参数用%套起来,Symfony就会在表达式被执行之前,把参数替换成对应的值。

1
2
3
4
5
# app/config/routing.yml
contact:
    path:     /contact
    defaults: { _controller: AcmeDemoBundle:Main:contact }
    condition: "request.headers.get('User-Agent') matches '%allowed_user_agents%'"

注意这个轻度破坏极端条件下的向下兼容。如果你在表达式中像这样使用了取模操作符:foo%bar%2,Symfony 2.6会解析成$foo % bar % 2,但Symfony 2.7则是把%bar%先替换成bar容器参数所对应的值,否则这种写法会在参数不存在时导致错误。

移除lint命令换成lint: namespace 

过去我们已经移除了所有的Symfony除错命令并统一为debug: namespace的格式,以便更好地根据功能来组织命令。Symfony 2.7同样对lint命令进行了整合,以便发现YAML文件和Twig模板中的错误:

1
2
3
4
5
6
7
# Symfony 2.6
$  php app/console yaml:lint ...
$  php app/console twig:lint ...
 
# Symfony 2.7 (the old command names also work)
$  php app/console lint:yaml ...
$  php app/console lint:twig ...

看起来这似乎是微不足道的改变,但把debug:lint:下面的除错命令“集群化”,能令框架保持一致性,这始终是好的。

增加了对linting多个twig模板的支持 

在Symfony 2.7中你可以传递任意个模板/或目录到lint:twig命令中:

1
2
3
4
5
6
7
8
9
10
# Symfony 2.6 (one template or one directory)
$  php app/console lint:twig app/Resources/views/base.html.twig
  1/1 valid files
 
$  php app/console lint:twig app/Resources/views/blog/
  4/4 valid files
 
# Symfony 2.7 (any number of files and/or directories)
$  php app/console lint:twig app/Resources/views/base.html.twig app/Resources/views/blog/
  5/5 valid files

自动重启内置web服务器 

在开发程序时使用php内置的web server正变得愈来愈普遍。你可能自Symfony 2.2以来使用了server:run命令。但是从Symfony 2.6起你还可以使用server:startserver:statusserver:stop命令。

唯一的欠点是:server:start需要pcntl扩展才能运行。在Symfony 2.7中,如果你运行server:start,将不再需要pcntl扩展,框架将自动执行server:run命令。