Yii2覆盖在Rest ActiveController中的泛型创建动作

Tou*_*ami 15 rest yii2

我在Yii2中有一个Rest API,Yii生成所有动作

查看/更新/创建/删除

我想改变createMethode和其他方法的comportement,所以我不能使用类Controller,我应该使用类ActiveController

但我希望该类做同样的工作,我需要在创建之前添加一些操作,并在创建之后添加一些操作.所以我需要覆盖actionCreate

我该怎么做 ?

Rom*_*nov 34

您可以执行以下操作

class CountryController extends ActiveController
{
    public $modelClass = 'common\models\Country';

    public function actions()
    {
        $actions = parent::actions();
        unset($actions['create']);
        return $actions;
    }

    public function actionCreate(){
        // implement here your code

    }

}
Run Code Online (Sandbox Code Playgroud)


小智 8

我知道这是一个老问题;但我在相关搜索中找到了它,并认为我可以提供一个很好的、更新的解决方案和现在这里内容的摘要。希望有人发现这有帮助......

我知道有两种方法可以做到这一点。你可以定义一个动作方法,就像@Roman Podlinov 提到的那样,或者你可以将动作定义为一个单独的类,并将默认的创建动作指向它,接近@mrJ0ul3 提到的。为了完整起见,我将在下面提供两者的示例。

方法 1 - 控制器中的动作方法

在控制器中,actions像这样覆盖方法:

public function actions()
{
    $actions = parent::actions();
    unset($actions['create']);
    return $actions;
}
Run Code Online (Sandbox Code Playgroud)

然后您可以在该控制器中定义您的 create 方法。

public function actionCreate()
{
    // your code goes here
}
Run Code Online (Sandbox Code Playgroud)

需要明确的是,方法名称确实需要actionCreate如上所示。我看到一条评论提到createAction,但这是不正确的。他们可能会对CreateAction属于 yii\rest 命名空间并保存实际使用默认 REST 创建操作运行的代码的类感到困惑。但是,如果您使用此方法覆盖创建请求逻辑,则该类并不重要。不过对于另一种方法来说确实很重要......

方法 2 - 单独的动作类

就个人而言,我更喜欢并使用此方法来覆盖默认操作。我喜欢将默认的 CRUD 操作逻辑保留在控制器本身之外。很高兴知道如果我的控制器中有动作方法,它们是完全自定义的动作。不过这绝对只是个人喜好。

为此,您将创建一个新的类文件,其中应包含如下所示的代码:

namespace app\actions\controllerName

class CreateAction extends \yii\rest\CreateAction
{
    public function run()
    {
        // your code goes here
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你走这条路,我建议你查看 Yii 的 REST CreateAction 类的主体,并在它们之后模拟你的代码的进展,假设对你的用例这样做是有意义的。

现在你只需要告诉控制器使用这个动作类来创建动作。你在控制器的 actions 方法中这样做:

public function actions()
{
    $actions = parent::actions();
    $actions['create']['class'] = 'app\actions\controllerName\CreateAction';
    return $actions;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它在语法上与@mrJ0ul3 所建议的类似;但该建议仅改变了一项行动的一部分将如何运作。它不允许您完全覆盖操作的逻辑 - 这就是为什么它在回答实际问题时错过了标记。

希望有帮助!

——大家加油!:)