【问题标题】:yii2 rest api implement custom actionsyii2 rest api 实现自定义动作
【发布时间】:2015-10-19 19:38:56
【问题描述】:

由于某种原因,我得到了:

{
  "name": "Not Found",
  "message": "Object not found: search",
  "code": 0,
  "status": 404,
  "type": "yii\web\NotFoundHttpException"
}

当我尝试在我的 yii2 rest api 应用程序中访问自定义操作 (http://localhost/project/api/web/v1/userfunctions/search) 时。 这是我在 main.php 配置文件中的内容

[
    'class' => 'yii\rest\UrlRule',
    'controller' => 'v1/userfunction',
    'extraPatterns' => ['GET search' => 'search'],
    'tokens' => [
        '{id}' => '<id:\\w+>'
    ]
]

UserFunctionController 类有一个actionSearch 方法。

我错过了什么吗?

当我添加一个空白操作方法时:

public function actions() 
{
  $actions = parent::actions();
  return $actions;
}

方法 404 消失,但我得到一个空白响应(状态代码 200)[这与是否定义 actionSearch 无关] 在这种情况下,控件在哪里?

这是actionSearch() 代码

 public function actionSearch()
    { 
        $output = UserStatus::findAll();
        return $output;
    }

【问题讨论】:

  • @Salem Ouerdani,是的。那是一个错字。我使用复数形式。编辑了问题。
  • 您可以将actionSearch 函数添加到您的问题中吗?您添加的所有代码都应该可以正常工作。也许 actionSearch 抛出错误或不返回输出

标签: rest controller yii2


【解决方案1】:

默认情况下,Yii 将控制器名称复数用于端点。因此,如果您没有将 yii\rest\UrlRule::$pluralize 属性配置为不这样做,那么您的操作应该在:

http://localhost/project/api/web/v1/userfunctions/search

更新:

public function actionSearch()
{ 
    $output = UserStatus::findAll();
    return $output;
}

这应该抛出这个 PHP 错误:Missing argument 1 for yii\db\BaseActiveRecord::findAll() 因为findAll() 方法需要一个 mixed 参数您的过滤条件

你应该改用这个:

public function actionSearch()
{ 
    $output = UserStatus::find()->all();
    return $output;
}

我认为您的服务器没有正确显示错误消息。检查其配置、错误日志文件,并确保在应用处于 dev 状态时将这些行包含在您的 Entry Script 中:

// remember to remove them all when deploying to production

   error_reporting(E_ALL);
   ini_set('display_errors', 'on');

   defined('YII_DEBUG') or define('YII_DEBUG', true);
   defined('YII_ENV') or define('YII_ENV', 'dev');

【讨论】:

  • 我按要求添加了功能。它不知何故无法访问。
  • @DGT 我刚刚更新了。如果您需要实现具有分页支持的过滤操作,这篇文章也可能会有所帮助:stackoverflow.com/questions/25522462/yii2-rest-query
  • 问题是我正在尝试实现类似api.test.loc/v1/model/xyz 的东西,我可以在其中调用子链接并将自定义数据发送回 api 响应。但我不断收到 404。在 actionXyz() 中,我可能会有类似 Model::find()->select(['name', 'address']) 的东西。主要关心的是如何使链接工作。 'extraPatterns' => ['GET xyz' => 'xyz'] 在主配置中并在控制器中定义了 actionXyz 吗?还是我必须做其他事情?
  • $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];您在另一篇文章中提到的方法对我有用。但我想要一个 api.test.loc/v1/products/xyz 形式的链接,而不是 api.test.loc/v1/products?name=iphone。感谢您的帮助。
  • 是的 extraPatterns 将完成这项工作。在我在另一篇文章中的回答中,如果您删除actions() 函数并将indexDataProvider() 重命名为actionXyz(),那么您将'extraPatterns' =&gt; ['GET xyz' =&gt; 'xyz'] 添加到您的urlRules 中,您将在此url 中得到相同的结果:api.test.loc/v1/products/xyz?name=iphone跨度>
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多