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.
这就是为何在 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。这一点不会改变。