Cakephp 3.0 - 在组件中加载模型
Cakephp 3.0 - Load Model inside Component
如何在 Cakephp 3.0 的组件中加载模型?
之前(在 Cakephp 2 中)你可以使用
$Model = ClassRegistry::init($modelName);
$Model->create(false);
$saved = $Model->save($data);
在 3.0 中相当于什么?
正如评论中有人所说,您至少应该阅读 migration guide 以了解与 3.0 的区别。要解决您的具体问题,您现在可以使用 TableRegistry
:
$table = TableRegistry::get($tableName);
如前所述,您可以使用 TableRegistry 访问模型:
use Cake\ORM\TableRegistry;
$this->Articles = TableRegistry::get('Articles');
访问组件的控制器
在组件中,您可以通过注册表访问当前控制器:
$controller = $this->_registry->getController();
如需更多信息,请阅读此 link: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
直接调用模型时,调用控制器为您调用模型的意义何在。
$article = $component->UserModel;
长话短说 loadModel()
是 TableRegistry
的包装
我做过的一件事是在组件中构建一个 loadModel class。这使我的代码保持一致。
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);
}
}
我的回答与其他答案相同。但是,我尝试在组件中保存记录。
在这种情况下,代码如下...
use Cake\ORM\TableRegistry;
---
$model = TableRegistry::get('MyModeles');
$entity = $model->newEntity();
$entity->set('filed1', 'newValue');
....
$model->save($entity);
您可以使用下一个代码段动态访问 table:
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);
}
}
如何在 Cakephp 3.0 的组件中加载模型? 之前(在 Cakephp 2 中)你可以使用
$Model = ClassRegistry::init($modelName);
$Model->create(false);
$saved = $Model->save($data);
在 3.0 中相当于什么?
正如评论中有人所说,您至少应该阅读 migration guide 以了解与 3.0 的区别。要解决您的具体问题,您现在可以使用 TableRegistry
:
$table = TableRegistry::get($tableName);
如前所述,您可以使用 TableRegistry 访问模型:
use Cake\ORM\TableRegistry;
$this->Articles = TableRegistry::get('Articles');
访问组件的控制器
在组件中,您可以通过注册表访问当前控制器:
$controller = $this->_registry->getController();
如需更多信息,请阅读此 link: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
直接调用模型时,调用控制器为您调用模型的意义何在。
$article = $component->UserModel;
长话短说 loadModel()
是 TableRegistry
我做过的一件事是在组件中构建一个 loadModel class。这使我的代码保持一致。
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);
}
}
我的回答与其他答案相同。但是,我尝试在组件中保存记录。
在这种情况下,代码如下...
use Cake\ORM\TableRegistry;
---
$model = TableRegistry::get('MyModeles');
$entity = $model->newEntity();
$entity->set('filed1', 'newValue');
....
$model->save($entity);
您可以使用下一个代码段动态访问 table:
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);
}
}