Php Yii2:如何使用行为引用附加到控制器的操作?

Php Yii2:如何使用行为引用附加到控制器的操作?,php,yii2,yii-behaviour,Php,Yii2,Yii Behaviour,我正在使用一个行为向几个控制器添加一个操作,过度简化的行为定义为 public class GreetBehavior extends Behavior { public function sayHello() { return "Hello" } public function actionGreet() { return "Hello"; } } 行为已成功附加。在控制器(f.i.Person)方法中,我可以使用$this-

我正在使用一个行为向几个控制器添加一个操作,过度简化的行为定义为

public class GreetBehavior extends Behavior {
    public function sayHello() {
        return "Hello"
    }

    public function actionGreet() {
        return "Hello";
    }
}
行为已成功附加。在控制器(f.i.Person)方法中,我可以使用
$this->sayHello()访问
sayHello

但是,如果我从地址栏调用actionGreet,则无法识别它:
…index.php?r=person/greet
。它发出无法解决的信息。是否可以向具有行为的控制器添加操作?如果是这样的话,你能给我一个提示吗。如果不知道,您知道另一种方法吗?

您不能这样做,因为操作必须从
控制器
类扩展,因此行为类中的方法不能替换为控制器操作

通过创建基本控制器并更改其他控制器以从该控制器扩展,可以实现此目标。如下图所示:

use yii\web\Controller;
class BaseCont extends Controller{
    public function actionGreat(){
        return "Hello";
    }
}
class MyController extends BaseCont{
    //rest of code
}
然后通过创建一个控制器来扩展它,如下所示:

use yii\web\Controller;
class BaseCont extends Controller{
    public function actionGreat(){
        return "Hello";
    }
}
class MyController extends BaseCont{
    //rest of code
}

除了MyController中的其他操作之外,您还可以使用actions类定义添加操作。见此处第3项

您的问题正在这里讨论:

不,这还不可能,因为
CController::createAction()
检查“actionExample”是否是给定控制器的有效方法。行为方法在控制器中不是真正的方法,因为它们是通过magic
\uu get()
调用的

现在,作为解决方法,我想您可以通过某种方式重写
CController::createAction()
CController::missingAction()

使用控制器::操作()


在Yii2中,有两种方法可以向控制器添加操作;独立和内联。您正在尝试添加一个内联操作-这意味着它被声明为控制器类上带有“action”前缀的方法

加载动作的另一种方式是作为“独立”文件,这些文件在控制器的“动作”方法中定义。这将返回对其他地方存在的操作类的引用数组


如果查看(在应用程序运行时加载动作),您可以看到它首先查看其动作数组(独立的动作数组),如果找不到它,则查看其自己的方法(格式化名称并添加“动作”前缀后-请参见第224-225行)

您遇到的问题是,当基本控制器查找内联方法时,它使用php的method_exists函数,这完全无视Yi2的行为功能

我不知道为什么它不使用,相反,它会知道行为方法。我只是在这个细节层次上看Yii2,所以可能有一个我不知道的原因


因此,您的问题的答案是,按照Yi2目前的编码方式,您无法对控制器的行为进行内联操作,因为当Yi2来寻找它时,它不会被看到


解决方案是切换到独立操作,您可以在上阅读

这个问题是关于Yii2的,而你的答案是关于Yii的。