3

我想从控制器调用另一个控制器中的函数。

class FirstController extends Controller {
      public function test1() { return 'OK'; }
}
class SecondController extends Controller {
      public function callTest1() { First::test1(); }
}

--> 服务器错误
帮我解决它。

4

8 回答 8

8

您不能直接调用该方法,因为它不是static,所以您必须先创建一个实例FirstController。当您想这样做时,请使用CWebApplication::createController

// supply appropriate route in place of 'first/index'
list($first) = Yii::app()->createController('first/index');
$first->test1();

但是,不需要从另一个控制器调用方法;这是一种不好的代码气味。也许重构您的代码并将其从控制器中拉出(也许进入模型)会更合适。

于 2012-05-23T10:45:49.007 回答
1

调用 createController() 时不应使用“控制器”一词,并且应在调用函数之前获取结果的 [0] 元素

 $process = Yii::app()->createController('First'); //create instance of FirstController
 $process=$process[0];
 $process->test1(); //call function 
于 2015-03-10T11:45:36.127 回答
1

在 Yii2 基本应用程序中,以下组件将用于调用动作

Yii::$app->runAction('controllername/create', $params);
于 2018-08-14T07:38:19.667 回答
1

您也可以使用Yii::$app->runAction().

于 2016-06-07T14:12:24.847 回答
0

您不能直接调用您的函数:首先创建控制器实例,然后调用函数:

$process = Yii::app()->createController('FirstController'); //create instance of controller

$process->test1(); //call function 
于 2014-11-28T07:30:59.910 回答
0

如果test1FirstController的方法没有使用$this,您可以简单地制作它static。代替:

public function test1() { return 'OK'; }

签名为:

public static function test1() { return 'OK'; }

然后你可以从任何地方调用它:

FirstController::test1();

这一切都取决于您的需求...

于 2014-11-28T08:30:04.330 回答
0

在通过代码调用时,最好使用 createControllerByID,而不是使用基于路由创建实例的 createController。

    $first = Yii::$app->createControllerByID('first');
    $first->test1();

确保 test1 是公共功能

于 2021-11-06T00:35:29.130 回答
0

这对我有用,

对于 PatientController 和方法 printPublicReport(),$params = $patientId, $appId, $testIds

    list($patient) = Yii::$app->createController('patients/print-public-report', $postDataAry); 

    $patient->printPublicReport($patientId, $appId, $testIds);
于 2020-12-08T11:28:28.177 回答