📜  Symfony-路由(1)

📅  最后修改于: 2023-12-03 14:47:49.181000             🧑  作者: Mango

Symfony 路由

Symfony 路由组件是一个独立的组件,它允许你将 URL 映射到应用程序中的控制器和操作等。它支持各种类型的路由,包括基于正则表达式,基于 XML 配置文件和 YAML 配置文件的路由。

1. 安装

使用 Composer 安装 Symfony 路由组件:

composer require symfony/routing
2. 使用
2.1. 基本使用

以下是一个简单的示例,说明如何将 URL 映射到控制器方法:

use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

$route = new Route('/hello/{name}', ['_controller' => 'App\\Controller\\HelloController::index']);
$routes = new RouteCollection();
$routes->add('hello', $route);

在上面的代码中,我们创建了一个名为 hello 的路由,将 /hello/{name} 映射到 App\Controller\HelloController::index 控制器方法。

2.2. 参数

路由可以包含参数,这些参数由大括号括起来。例如,路由为 /product/{id} 将匹配任何以 /product/ 开头并且具有一个 ID 参数的 URL。参数名称是大括号中的名称,如 {id}

$route = new Route('/product/{id}', ['_controller' => 'App\\Controller\\ProductController::show']);
$routes->add('product_show', $route);

你可以在控制器操作中访问参数,可以通过以下方式访问它:

public function show($id)
{
    // ...
}
2.3. 可选参数

有时,URL 的一部分是可选的,这可以通过在参数名称后跟一个问号(?)来实现。

例如,路由为 /blog/{slug}?{page} 将匹配任何 URL,以 /blog/ 开头,并带有可选的 page 参数。

$route = new Route('/blog/{slug}', ['_controller' => 'App\\Controller\\BlogController::show']);
$route->setDefaults(['page' => 1]);
$route->setRequirement('page', '\d+');
$routes->add('blog_show', $route);

在上面的示例中,我们设置了一个名为 page 的默认值为 1 的可选参数。我们还通过 setRequirement() 方法来限制 page 参数只能是数字。

2.4. 生成 URL

Symfony 路由组件还允许你将参数传递给路由并生成对应的 URL。

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

$urlGenerator = new UrlGenerator($routes, new RequestContext());
$url = $urlGenerator->generate('blog_show', ['slug' => 'my-blog-post', 'page' => 2]);

上面的示例将生成一个 URL,它将匹配以 /blog/my-blog-post 开头,并设置参数 page2

2.5. 路由组

你可以使用 RouteCollection 类来组织路由。

use Symfony\Component\Routing\RouteCollection;

$blogRoutes = new RouteCollection();
$blogRoutes->add('show', new Route('/{slug}'));
$blogRoutes->add('edit', new Route('/{slug}/edit'));

$adminRoutes = new RouteCollection();
$adminRoutes->addPrefix('/admin');
$adminRoutes->addCollection($blogRoutes);

$routes->addCollection($adminRoutes);

在上面的示例中,我们创建了两个路由,showedit,它们都位于 /blog/{slug} 路径下。我们还创建了一个路由组 admin,它包含 /admin/blog/{slug} 路径和所有 blog 路由。最后,我们将 admin 路由组添加到根路由组中。

3. 结论

Symfony 路由组件为构建灵活的路由系统提供了强大的工具。使用 Symfony 路由组件,你可以轻松地映射 URL 到控制器操作,并生成相应的链接。