【问题标题】:In CakePHP3.6, how to call function of another controller into other controller?在 CakePHP3.6 中,如何将另一个控制器的函数调用到另一个控制器中?
【发布时间】:2018-09-08 15:00:43
【问题描述】:

我正在为我的项目使用 CakePHP3.6。我在 Options 控制器中创建了以下函数:

public function getValue($id = null){ 
$options=$this->Options->find()->where(['id'=>$id])->first();
return $options->value;  
}

然后我将这个函数调用到另一个控制器(任何 xyz 控制器)的函数中,如下所示:

$r = $this->Options->getValue(1);

现在我收到错误“未知方法“getValue””。

我对 CakePHP3.2 遵循的程序相同,效果很好。所以请帮助我,如何将另一个控制器的函数调用为 CakePHP3.6 的另一个控制器的函数?

【问题讨论】:

    标签: cakephp-3.0 cakephp-3.x


    【解决方案1】:

    你应该永远从一个控制器调用另一个控制器的函数,我非常怀疑这是否如 3.2 所示。这个函数看起来很像它应该在 OptionsTable 中,而不是 OptionsController。您需要做的唯一更改是在函数体内,它只是$this->find(),而不是$this->Options->find()。

    【讨论】:

    • 不,我们不能使用$this->find() 代替$this->Options->find()。如果你直接使用$this->find(),你会得到错误“Call to undefined method App\Controller\OptionsController::find()”。你可以试试看。请告诉我为什么我们不应该从另一个控制器调用函数的原因?是的,它在 3.2 中运行良好。不用怀疑,因为我已经用过了。
    • 你不应该从另一个控制器调用函数,因为这会破坏关注点的分离。控制器可以很容易地访问系统中的任何表,CakePHP 就是为了实现这一点而设置的。但要获得另一个控制器,您需要显式创建该类型的对象(例如,“$options_controller = new \App\Controller\OptionsController(), and make efforts to ensure that it's correctly initialized. That's why I'm saying I don't expect it worked *as shown* in 3.2, because $this->Options` 看起来像是对 OptionsTable 的引用,而不是OptionsController。
    • 我对使用$this->find() 的建议是假设函数被移到OptionsTable 中。根据报告的错误消息,您显然没有尝试过;您刚刚尝试从已经存在的函数中删除->Options。正如我希望我已经解释的那样,这是错误的地方。不知道为什么您不愿意将功能移动到一个可以轻松完成您所说的想要做的事情的地方。
    • 谢谢。我可以通过根据您的建议创建 OptionsController 类的对象来成功调用函数,即 $options_controller = new \App\Controller\OptionsController() 。我了解 cakephp 分离的担忧,但根据我的项目,我需要它。因为,我需要通过向它传递一个值来获取一些数据,并且我想避免一次又一次地编写相同的代码。
    • @GurpreetKaur 这不是建议,它是你应该不做什么的一个例子!手动实例化控制器在 99.999% 的情况下都是错误的,就像调用其他控制器的方法一般。这里的建议是将逻辑放入您的模型(您的表类)中,这是正确的地方!
    【解决方案2】:
    class FirstController extends AppController
    {
    public function getValue($id = null){ 
      $options=$this->Options->find()->where(['id'=>$id])->first();
      return $options->value;  
    }
    }
    
    class SecondController extends AppController
    {
    public function anotherAction($id = null){
     $anotherController =  new \App\Controller\FirstController();  
     $r = $anotherController->getValue($id) ;   
    }
    }
    

    【讨论】:

    • 代码转储不能提供好的答案。你应该解释如何和为什么这可以解决他们的问题。我推荐阅读,“How do I write a good answer?"。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。当代码被解释时,你也可能会得到用户的积极反馈/赞成。
    猜你喜欢
    • 2019-08-27
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多