Yii2 RESTful:内容协商语言不起作用

时间:2017-12-07 12:26:30

标签: php yii2 response yii-rest yii2-api

我使用Yii2中的模型实现了API Rest的结构。一切都适用于动作(索引,创建,更新等...)和方法(GET,POST,PUT等...)但是我对ContentNegotiator类有问题。 具体来说,如果我作为GET参数传递要转换响应的语言,则忽略它。 根据设置响应语言的文档,我们需要设置ContentNegotiator的允许语言(查看我的behaviors())并提出如下请求:

http://localhost/api/v1/users?_lang=it-IT

但是回复仍然是英文。为什么???什么都不反对英语=)

这是从ActiveController延伸的yii\rest\Controller子类。

use yii\rest\ActiveController;
use yii\filters\VerbFilter;

class AActiveController extends ActiveController
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['verbFilter'] = [
            'class' => VerbFilter::className(),
            'actions' => $this->verbs(),
        ];
        $behaviors['contentNegotiator']['languages'] = [
            'en-EN',
            'it-IT',
            'de-DE',
            'ru-RU',
        ];

        return $behaviors;
    }
...

N.B。:我通过框架的yii\filters\ContentNegotiator类进行调试,此时应用程序语言设置正确,但响应始终为英文。

negotiate() public method

public function negotiate()
{
    $request = $this->request ?: Yii::$app->getRequest();
    $response = $this->response ?: Yii::$app->getResponse();
    if (!empty($this->formats)) {
        $this->negotiateContentType($request, $response);
    }
    if (!empty($this->languages)) {
        Yii::$app->language = $this->negotiateLanguage($request);
    }
    debug(Yii::$app->language); // result OK!: it-IT 
}

1 个答案:

答案 0 :(得分:2)

看起来某些内置错误未被翻译,例如yii\rest\Action:103会导致throw new NotFoundHttpException("Object not found: $id")未翻译。您有不同的方法来解决此问题:

  1. 好方法。扩展此Action并使用translate
  2. 抛出正确的异常
  3. 糟糕的方式。编辑框架文件本身。
  4. 最好的方式。创建框架补丁并发送给维护者。
  5. 有关i18n see documentation的更多信息。