我在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 提到的。为了完整起见,我将在下面提供两者的示例。
在控制器中,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 创建操作运行的代码的类感到困惑。但是,如果您使用此方法覆盖创建请求逻辑,则该类并不重要。不过对于另一种方法来说确实很重要......
就个人而言,我更喜欢并使用此方法来覆盖默认操作。我喜欢将默认的 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 所建议的类似;但该建议仅改变了一项行动的一部分将如何运作。它不允许您完全覆盖操作的逻辑 - 这就是为什么它在回答实际问题时错过了标记。
希望有帮助!
——大家加油!:)
| 归档时间: |
|
| 查看次数: |
10942 次 |
| 最近记录: |