Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2 RESTful:内容协商语言无法工作_Php_Yii2_Response_Yii Rest_Yii2 Api - Fatal编程技术网

Php Yii2 RESTful:内容协商语言无法工作

Php Yii2 RESTful:内容协商语言无法工作,php,yii2,response,yii-rest,yii2-api,Php,Yii2,Response,Yii Rest,Yii2 Api,我用Yii2中的模型实现了API Rest的结构。对于操作(索引、创建、更新等)和方法(GET、POST、PUT等),一切都非常有效,但我对contentcongregator类有一个问题。 具体地说,如果我将GET作为参数传递给要翻译响应的语言,那么这将被忽略。 根据设置响应语言的文档,我们需要设置允许的contentcongregator(查看我的行为())语言,并提出如下请求: 但回应仍然是英语。为什么?不反对英语=) 这是我的ActiveController子类,它从yii\rest\

我用Yii2中的模型实现了API Rest的结构。对于操作(索引、创建、更新等)和方法(GET、POST、PUT等),一切都非常有效,但我对
contentcongregator
类有一个问题。 具体地说,如果我将GET作为参数传递给要翻译响应的语言,那么这将被忽略。 根据设置响应语言的文档,我们需要设置允许的
contentcongregator
(查看我的
行为()
)语言,并提出如下请求:

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

这是我的
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;
    }
...
注意:我通过框架的
yii\filters\contentcongregator
类进行调试,此时应用程序语言设置正确,但响应始终为英语


看起来有些内置错误没有翻译,例如
yii\rest\Action:103
throws
throw new NotFoundHttpException(“未找到对象:$id”)
它没有翻译。您有不同的方法来解决此问题:

  • 好办法。扩展此操作并使用translate引发正确的异常
  • 糟糕的方式。编辑框架文件本身
  • 最好的办法。创建框架补丁并发送给维护人员

  • 有关i18n的更多信息。

    写“但响应仍然是英文的”是什么意思。ContentCongregator只能设置lang应用程序字段。如果你需要翻译,你应该自己翻译。我的意思是答案还没有翻译成意大利语。我不能翻译你的自定义数据。我不是说自定义数据。我是指默认的响应消息,如“不允许使用方法”或“找不到页面”
    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 
    }