在API-PLATFORM中实现根据语言返回数据的方法有许多种,下面是其中的一种方法:
首先,在资源的类中添加一个方法来获取当前请求的语言:
// src/Entity/Product.php
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
class Product
{
// ...
private $requestStack;
private $translator;
public function __construct(RequestStack $requestStack, TranslatorInterface $translator)
{
$this->requestStack = $requestStack;
$this->translator = $translator;
}
public function getLanguage()
{
$request = $this->requestStack->getCurrentRequest();
$language = $request->getPreferredLanguage();
return $this->translator->getLocale() == $language ? $language : null;
}
// ...
}
接下来,在资源的类中实现根据语言返回数据的方法:
// src/Entity/Product.php
class Product
{
// ...
/**
* @ApiProperty(
* readable=true,
* writable=false
* )
*
* @Groups({"products_read"})
*/
public function getName()
{
$language = $this->getLanguage();
if (!$language) {
return null;
}
// Get the translation based on the current language
$translation = $this->getTranslation($language);
// Return the translated name if any, otherwise the default name
return $translation ? $translation->getName() : $this->defaultName;
}
private function getTranslation(string $language)
{
foreach ($this->translations as $translation) {
if ($translation->getLanguage() === $language) {
return $translation;
}
}
return null;
}
// ...
}
现在我们可以在GET /api/products请求中使用一个header来指定所需的语言。例如,使用Accept-Language: fr-FR来获得法语翻译的产品名称。