Как загрузить модель внутри компонента в Cakephp 3.0? Раньше (в Cakephp 2) вы могли использовать
$Model = ClassRegistry::init($modelName);
$Model->create(false);
$saved = $Model->save($data);
Что эквивалентно этому в 3.0?
Как загрузить модель внутри компонента в Cakephp 3.0? Раньше (в Cakephp 2) вы могли использовать
$Model = ClassRegistry::init($modelName);
$Model->create(false);
$saved = $Model->save($data);
Что эквивалентно этому в 3.0?
Как указывалось ранее, вы можете использовать TableRegistry для доступа к модели:
use Cake\ORM\TableRegistry;
$this->Articles = TableRegistry::get('Articles');
Как кто-то сказал в комментариях, вы должны хотя бы прочитать руководство по миграции, чтобы понять, чем отличается версия 3.0. Чтобы ответить на ваш конкретный вопрос, теперь вы можете использовать TableRegistry
:
$table = TableRegistry::get($tableName);
Одна вещь, которую я сделал, это создал класс 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);
}
}
Доступ к контроллеру компонента
Изнутри компонента вы можете получить доступ к текущему контроллеру через реестр:
$controller = $this->_registry->getController();
для получения дополнительной информации прочитайте эту ссылку: http://book.cakephp.org/3.0/en/controllers/components.html
Если вы настаиваете на использовании 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
.
мой ответ такой же, как и другие ответы. но я пытаюсь сохранить запись внутри компонента.
В этом случае код выглядит следующим образом...
use Cake\ORM\TableRegistry;
---
$model = TableRegistry::get('MyModeles');
$entity = $model->newEntity();
$entity->set('filed1', 'newValue');
....
$model->save($entity);
Вы можете получить динамический доступ к таблице с помощью следующего фрагмента:
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);
}
}