Contributed by
Nicolas Grekas
in #23834
and #24180.

Symfony 极牛地支持了若干种配置格式: XML, YAML, PHP 和 PHP annotations。美妙之处在于我们不强迫你使用某种特定格式。你始终掌控着何时使用哪种,甚至混合使用之 (如以 YAML 进行基本配置,以 XML 配置服务,用 PHP annotations 配置路由)。

默认时我们在一些主力配置文件中使用 YAML (services.yml, security.yml, config.yml),因为它在可读性、简洁性和功能性之间取得了良好的平衡。然而,这需要一个 Yaml component 作为 Symfony 程序的依赖。

Symfony 4 将对程序所需之依赖进行最小化处理 (一套全新的 Symfony 4 程序包含的代码比 Symfony 3.3 的少了 70%),因此删除 Yaml 依赖对我们来说是优先考虑的。我们可以把它转换成现有的 PHP 配置格式,但那不够简洁也不可读。

Fabien Potencier: This blog post is misleading. YAML is still a requirement of Symfony 4 default skeleton and that will stay.

框架作者 FabPot 对原博客评论:本文有误导之嫌。YAML 仍将是 Symfony 4 默认骨架的必须,且将继续存在下去。

这就是为何在 Symfony 3.4 中我们引入了一个 new PHP-based configuration format(全新的基于 PHP 的配置格式),来定义路由和服务。以下是配置路由时它的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// app/config/routing.php
return function (RoutingConfigurator $routes) {
    // import routes defined in a separate file
    // 导入定义在独立文件中的路由
    $routes->import('legacy_routes.php')
        ->prefix('/legacy')
    ;
 
    // define the routes using a "fluent interface"
    // 使用 “流程化界面” 来定义路由
    $routes
        ->add('product', '/products/{id}')
            ->controller('App\Controller\ProductController::show')
            ->schemes(['https'])
            ->requirements(['id' => '\d+'])
            ->defaults(['id' => 0])
 
        ->add('homepage', '/')
            ->controller('App\Controller\DefaultController::index')
    ;
};

类似的,一个定义有服务的文件看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// app/config/services.php
return function (ContainerConfigurator $container) {
    $container->import('legacy_services.php');
 
    $params = $container->parameters();
    $params->set('app.foo_param', 'param_value');
 
    $container = $container->services()->defaults()
        ->private()
        ->autoconfigure()
        ->autowire();
 
    $container
        ->load('App\\', '../src/*')
        ->exclude('../src/{Entity,Repository,Tests}');
    $container
        ->load('App\\Controller\\', '../src/Controller')
        ->tag('controller.service_arguments');
 
    $container->set(FooClass::class)
        ->args(['some_argument', ref(BarClass::class)])
        ->tag('kernel.event_listener', ['event' => 'kernel.exception']);
 
    $container->alias('foo', FooClass::class)->public();

在 Symfony 4 程序中我们可能使用这种配置格式,但你仍然能够使用自己喜欢的格式,无论是 YAML 还是 XML 或 PHP annotations。这一点不会改变。