Cakephp 3.0 - загрузить модель внутри компонента

Как загрузить модель внутри компонента в Cakephp 3.0? Раньше (в Cakephp 2) вы могли использовать

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

Что эквивалентно этому в 3.0?


person Sultanen    schedule 05.03.2015    source источник
comment
Я бы посоветовал сначала ознакомиться с документацией по таким базовым вещам book.cakephp.org/3.0 /en/orm.html   -  person ndm    schedule 05.03.2015


Ответы (7)


Как указывалось ранее, вы можете использовать TableRegistry для доступа к модели:

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

Документацию см. здесь.

person Melvin    schedule 19.07.2015

Как кто-то сказал в комментариях, вы должны хотя бы прочитать руководство по миграции, чтобы понять, чем отличается версия 3.0. Чтобы ответить на ваш конкретный вопрос, теперь вы можете использовать TableRegistry:

$table = TableRegistry::get($tableName);
person José Lorenzo Rodríguez    schedule 05.03.2015

Одна вещь, которую я сделал, это создал класс 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);
    }
}
person Dooltaz    schedule 17.01.2018

Доступ к контроллеру компонента

Изнутри компонента вы можете получить доступ к текущему контроллеру через реестр:

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

для получения дополнительной информации прочитайте эту ссылку: http://book.cakephp.org/3.0/en/controllers/components.html

person Pradeep    schedule 07.07.2016

Если вы настаиваете на использовании 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, какой смысл вызывать контроллер для вызова модели для вас.

$статья = $компонент->Модель пользователя;

Короче говоря, loadModel() — это оболочка для TableRegistry.

person Fury    schedule 15.08.2016
comment
Почему бы просто не использовать ModelAwareTrait внутри класса. тогда вы можете использовать $this-›loadModel() как в контроллере. - person Derek; 14.11.2018

мой ответ такой же, как и другие ответы. но я пытаюсь сохранить запись внутри компонента.

В этом случае код выглядит следующим образом...

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

Вы можете получить динамический доступ к таблице с помощью следующего фрагмента:

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);
    }
}
person fitorec    schedule 15.03.2018