Cakephp 3.0 - 在Component中加载模型

时间:2015-03-05 10:58:17

标签: cakephp-3.0

如何在Cakephp 3.0中的Component中加载模型? 之前(在Cakephp 2中)你可以使用

$Model = ClassRegistry::init($modelName);
$Model->create(false);
$saved = $Model->save($data);

与3.0相同的是什么?

7 个答案:

答案 0 :(得分:21)

如前所述,您可以使用TableRegistry访问模型:

use Cake\ORM\TableRegistry;
$this->Articles = TableRegistry::get('Articles');

See here for documentation.

答案 1 :(得分:6)

正如有人在评论中所说,你至少应该阅读migration guide以了解与3.0的区别。要解决您的具体问题,您现在可以使用TableRegistry

$table = TableRegistry::get($tableName);

答案 2 :(得分:2)

我做过的一件事是在组件中构建一个loadModel类。这使我的代码保持一致。

namespace App\Controller\Component;

use Cake\Controller\Component;
use Cake\ORM\TableRegistry;

class MyComponent extends Component {

    public function initialize(array $config) {
        parent::initialize($config);
        $this->loadModel('Users');
    }

    private function loadModel($model) {
        $this->$model = TableRegistry::get($model);
    }
}

答案 3 :(得分:1)

访问组件的控制器

在组件中,您可以通过注册表访问当前控制器:

$controller = $this->_registry->getController();

了解更多内容请阅读此链接:http://book.cakephp.org/3.0/en/controllers/components.html

答案 4 :(得分:1)

如果你坚持使用loadModel,它将实例作为属性添加到控制器,那么你就是这样做的。

class ArticleComponent extends Component
{
    public function initialize(array $config) 
    {
        $this->controler = $this->_registry->getController();
    }

    public function myFunction($id)
    {
        $this->controller->loadModel('Articles');
        $article = $this->controller->Articles->get($id);

        debug($article);
    }
}

这种方式就像告诉控制器为你打开一个模型:

  

$ article = $ component-> controller-> UserModel;

但是当你可以使用TableRegistry立即调用模型时,调用控制器为你调用模型是什么意思。

  

$ article = $ component-> UserModel;

长篇短文loadModel()TableRegistry

的包装

答案 5 :(得分:0)

我的答案与其他答案相同。但是,我尝试在组件内保存记录。

在这种情况下,代码就像是......

use Cake\ORM\TableRegistry;
---
$model = TableRegistry::get('MyModeles');
$entity = $model->newEntity();
$entity->set('filed1', 'newValue');
....
$model->save($entity);

答案 6 :(得分:0)

您可以使用下一个代码段动态访问表格:

use Cake\Event\Event;
use Cake\Controller\Component;
use Cake\ORM\TableRegistry;

class TestComponent extends Component {
    private $controller;
    private $table;
    public function startup(Event $event) {
        $this->controller = $event->getSubject();
        $this->table = TableRegistry::get($this->controller->name);
    }
}