Symfony 是一个流行的 PHP 框架,用于构建 Web 应用程序。@Route
注解用于定义路由,而 i18n(国际化)则是指应用程序支持多种语言的能力。
Symfony 默认情况下不会对未显式声明的语言进行后备。如果请求的语言不在路由中定义的语言列表中,Symfony 会返回 404 错误。
可以通过自定义路由解析器来实现对未显式声明的语言进行后备。以下是一个示例代码:
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\RouterInterface;
class I18nFallbackRouteMatcher implements RequestMatcherInterface
{
private $router;
private $fallbackLocale;
public function __construct(RouterInterface $router, string $fallbackLocale)
{
$this->router = $router;
$this->fallbackLocale = $fallbackLocale;
}
public function match(Request $request): array
{
$match = $this->router->match($request);
if ($match === null && $request->getLocale() !== $this->fallbackLocale) {
$request->setLocale($this->fallbackLocale);
$match = $this->router->match($request);
}
return $match;
}
}
然后在 config/routes.yaml
中配置路由:
# config/routes.yaml
app:
resource: ..
type: annotation
prefix: /{_locale}
requirements:
_locale: en|fr|de
defaults:
_locale: en
最后,在 config/services.yaml
中注册自定义路由匹配器:
# config/services.yaml
services:
app.i18n_fallback_route_matcher:
class: App\I18nFallbackRouteMatcher
arguments:
$router: '@router'
$fallbackLocale: 'en'
并在 config/packages/routing.yaml
中使用自定义路由匹配器:
# config/packages/routing.yaml
framework:
router:
request_matcher: app.i18n_fallback_route_matcher
通过这种方式,当请求的语言不在显式声明的语言列表中时,Symfony 会自动切换到后备语言并尝试匹配路由。
领取专属 10元无门槛券
手把手带您无忧上云