【问题标题】:Call function in another controller from a controller in Yii从 Yii 中的控制器调用另一个控制器中的函数
【发布时间】:2012-05-23 10:41:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: controller yii


    【解决方案1】:

    您不能直接调用该方法,因为它不是static,因此您必须首先创建FirstController 的实例。如果您想这样做,请使用CWebApplication::createController

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

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

    【讨论】:

    • 我做了,但还是出错。如果我们需要处理在另一个控制器的函数中被清除的东西,我们应该如何处理它[在当前控制器中],而不需要调用另一个控制器的函数。你能告诉我什么更好的办法来改变我僵化的想法吗?非常感谢你
    • @HuyTran,您可以添加 components/controller.php 方法,女巫将从 second/index 和 first/index 调用
    【解决方案2】:

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

     $process = Yii::app()->createController('First'); //create instance of FirstController
     $process=$process[0];
     $process->test1(); //call function 
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        Yii::$app->runAction('controllername/create', $params);
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            如果FirstController 中的方法test1 没有使用$this,您可以简单地将其设为static。而不是:

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

            签名为:

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

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

            FirstController::test1();
            

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

            【讨论】:

              【解决方案7】:

              这对我有用,

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

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

              【讨论】:

              • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
              • @Tyler2P 好的,谢谢,从现在开始我会处理这个问题
              【解决方案8】:

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

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

              确保 test1 是公共函数

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-04-23
                • 1970-01-01
                • 2017-07-22
                • 2017-03-12
                • 2016-01-05
                相关资源
                最近更新 更多