【问题标题】:CakePHP: agnostic model manipulationCakePHP:不可知的模型操作
【发布时间】:2016-05-19 10:33:28
【问题描述】:

有没有办法在 AppController 中不可知地获取/操作模型,以避免应用程序控制器中的 DRYness ?例如:

//AppController.php
public function find_all()
{
   return $this->AppModel->find('all'); 
   //I know this does not work but to give you the idea
}

在应用的子控制器中:

//FoosController.php
public function some_function()
{
   $data = parent::find_all();
   //List of Foo entities
}

或者:

//BarsController.php
public function some_other_function()
{
   $data = parent::find_all();
   //List of Bar entities
}

CakePHP 有没有可以提供的解决方案?或者使用反射,也许?

感谢您的帮助!

【问题讨论】:

  • 您确定要避免干燥,我认为您想要实现它吗?你不想重复的究竟是什么?它真的只是调用Model::find(),还是实际上涉及更多复杂性?如果是后者,请详细说明,因为包装一个简单的Model::find() 调用没有太大意义。
  • 事实上,它确实不仅仅是 Model:find() 方法...基本上我在模型上执行的所有 CRUD 操作都是完全一样的,这就是为什么我想直接在 AppController 中重构它们。所以我真正想要实现的是以抽象的方式操作模型。使用 Controller:loadModel($this->modelClass) 加载正确的模型,但是,我怎样才能使用这个模型来调用 Model:save() 或 Model:find() 方法?
  • 嗯,我仍然不确定我是否理解您的实际问题...您可能会问如何使用$this->modelClass 的值来访问对象属性?
  • 我终于找到了实现我想做的方法:$this->{$this->modelClass}->find('all');

标签: php cakephp activerecord abstraction cakephp-2.7


【解决方案1】:

我想出了一个方法来实现我正在寻找的东西:

//AppController.php
public function find_all()
{
   return $this->{$this->modelClass}->find('all'); 
}

注意:如果您在不涉及任何实际业务逻辑或授权的情况下执行重复的 CRUD 操作(就像我目前所做的那样),您还可以使用这些代码行来持久化实体而不会意识到AppController 中正在处理的模型。

//AppController.php
if (!$this->{$this->modelClass}->save($this->request->data))
{
   $validationErrors = $this->{$this->modelClass}->validationErrors;
   //error logic here
}
else
{
   //success logic here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多