Magento 2 Factory Objects
In object oriented programming, a factory method is a method that’s used to instantiate an object. Factory methods exist to ensure system developers have control over how a particular object is instantiated, and how its arguments are passed in. There’s a certain school of though that thinks direct use of the new keyword in programming
$object = new Foo;
is an anti-pattern, as directly instantiating an object creates a hard coded dependency in a method. Factory methods give the system owner the ability to control which objects are actually returned in a given context.
A factory object serves a similar purpose. In Magento 2, each CRUD model has a corresponding factory class. All factory class names are the name of the model class, appended with the word “Factory”. So, since our model class is named
Pulsestorm/ToDoCrud/Model/TodoItem
this means our factory class is named
Pulsestorm/ToDoCrud/Model/TodoItemFactory
To get an instance of the factory class, replace your block class with the following.
#File: app/code/Pulsestorm/ToDoCrud/Block/Main.php
<?php
namespace Pulsestorm\ToDoCrud\Block;
class Main extends \Magento\Framework\View\Element\Template
{
protected $toDoFactory;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Pulsestorm\ToDoCrud\Model\TodoItemFactory $toDoFactory
)
{
$this->toDoFactory = $toDoFactory;
parent::__construct($context);
}
function _prepareLayout()
{
var_dump(
get_class($this->toDoFactory)
);
exit;
}
}
What we’ve done here is use automatic constructor dependency injection to inject a Pulsestorm\ToDoCrud\Model\TodoItemFactory factory object, and assign it to the toDoFactory object property in the constructor method.
#File: app/code/Pulsestorm/ToDoCrud/Block/Main.php
protected $toDoFactory;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Pulsestorm\ToDoCrud\Model\TodoItemFactory $toDoFactory
)
{
$this->toDoFactory = $toDoFactory;
parent::__construct($context);
}
We also had to inject a block context object and pass that to our parent constructor. We’ll cover these context object in future articles, but if you’re curious about learning more, this quickies post is a good place to start.
In addition to injecting a factory into our block, we also added the following to our _prepareLayout method
#File: app/code/Pulsestorm/ToDoCrud/Block/Main.php
function _prepareLayout()
{
var_dump(
get_class($this->toDoFactory)
);
exit;
}
This will dump the toDoFactory‘s class name to the screen, and is a quick sanity check that our automatic constructor dependency injection worked. Reload your page with the above in place, and you should see the following
string 'Pulsestorm\ToDoCrud\Model\TodoItemFactory' (length=41)
Next, replace your _prepareLayout method with this code
#File: app/code/Pulsestorm/ToDoCrud/Block/Main.php
function _prepareLayout()
{
$todo = $this->toDoFactory->create();
$todo->setData('item_text','Finish my Magento article')
->save();
var_dump('Done');
exit;
}
This code calls the create method of our factory. This will instantiate a \Pulsestorm\ToDoCrud\Model\TodoItemFactory object for us. Then, we set the item_textproperty of our model, and call its save method. Reload your page to run the above code, and then check your database table
mysql> select * from pulsestorm_todocrud_todoitem\G
*************************** 1. row ***************************
pulsestorm_todocrud_todoitem_id: 1
item_text: Finish my Magento article
date_completed: NULL
creation_time: NULL
update_time: NULL
is_active: 1
1 row in set (0.00 sec)
You’ll find that Magento has saved the information you requested. If you wanted to fetch this specific model again, you’d use code that looked like the following.
#File: app/code/Pulsestorm/ToDoCrud/Block/Main.php
function _prepareLayout()
{
$todo = $this->toDoFactory->create();
$todo = $todo->load(1);
var_dump($todo->getData());
exit;
}
Here we’ve used the factory to create our model, used the model’s load method to load a model with the ID of 1, and then dumped the model’s data using the various magic setter and getter methods available to a Magento 2 model.
#File: app/code/Pulsestorm/ToDoCrud/Block/Main.php
function _prepareLayout()
{
$todo = $this->toDoFactory->create();
$todo = $todo->load(1);
var_dump($todo->getData());
var_dump($todo->getItemText());
var_dump($todo->getData('item_text'));
exit;
}
Finally, if we wanted to use a CRUD model’s collection object, we’d use code that looked like this
#File: app/code/Pulsestorm/ToDoCrud/Block/Main.php
function _prepareLayout()
{
$todo = $this->toDoFactory->create();
$collection = $todo->getCollection();
foreach($collection as $item)
{
var_dump('Item ID: ' . $item->getId());
var_dump($item->getData());
}
exit;
}
Again, this code uses a factory object to create a CRUD model object. Then, we use the CRUD model object’s getCollection method to fetch the model’s collection. Then, we iterate over the items returned by the collection.
Once instantiated via a factory, Magento 2’s CRUD models behave very similarly, if not identically, to their Magento 1 counterparts. If you’re curious about Magento 1’s CRUD objects, our venerable Magento 1 for PHP MVC Developers article may be of interest, as well as the Varien Data Collections article.
Where did the Factory Come From
You may be thinking to yourself — how did Magento instantiate a Pulsestorm/ToDoCrud/Model/TodoItemFactory class if I never defined one? Factory classes are another instance of Magento 2 using code generation (first covered in our Proxy objectarticle). Whenever Magento’s object manager encounters a class name that ends in the word Factory, it will automatically generate the class in the var/generation folder if the class does not already exist. You can see your generated factory class at the following location
#File: var/generation/Pulsestorm/ToDoCrud/Model/TodoItemFactory.php
<?php
namespace Pulsestorm\ToDoCrud\Model;
/**
* Factory class for @see \Pulsestorm\ToDoCrud\Model\TodoItem
*/
class TodoItemFactory
{
//...
}
Magento 2 Factory Objects的更多相关文章
- Magento 2 instantiate object by Factory Objects
magento2的Factory Objects是用来实例化non-injectable classes,目前还不知道什么叫non-injectable classes. 可以用它来实例化Helper ...
- 时隔3年半Spring.NET 2.0终于正式Release了
一直很喜欢Spring.NET,不过2011年8月2日1.3.2正式release之后,再没有正式版本的release了. 直到4天前,Spring.NET 2.0 GA终于Release. http ...
- IBM MQ 与spring的整合
文件名:applicationContext-biz-mq.xml 新浪博客把里面的代码全部转换成HTML了,所以无法粘贴 可以查看CSDN里面的:http://blog.csdn.net/xiazo ...
- spring监听与IBM MQ JMS整合
spring xml 的配置: 文件名:applicationContext-biz-mq.xml <?xml version="1.0" encoding="UT ...
- Core J2EE Patterns - Service Locator--oracle官网
原文地址:http://www.oracle.com/technetwork/java/servicelocator-137181.html Context Service lookup and cr ...
- Object Pascal中文手册 经典教程
Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...
- Cannot locate factory for objects of type DefaultGradleConnector, as ConnectorServiceRegistry has been closed.
现象:更换android studio libs文件夹下的jar包,重新编译代码报错:Cannot locate factory for objects of type DefaultGradleCo ...
- Android Studio: Error:Cannot locate factory for objects of type DefaultGradleConnector, as ConnectorServiceRegistry
将别人的项目导入自己的环境下出现的问题. Gradle refresh failed; Error:Cannot locate factory for objects of type DefaultG ...
- 深入浅出设计模式——抽象工厂模式(Abstract Factory)
模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...
随机推荐
- 前端学习(十七):JavaScript常用对象
进击のpython ***** 前端学习--JavaScript常用对象 JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等 在JavaScript中,对象是拥有属性和方法的数据 ...
- form表单两种提交方式的不同
我们在使用<Form>表单的时候,最常用的提交方式就是Get和Post.我们都知道这两种方式最大的差别就是安全性,除此之外,它们还有哪些其他的区别,你知道吗? 在<Form& ...
- hcharts生成图表
借助hcharts插件,可以很方便地在模板页面中生成图表.类似插件还有echarts. 补充...
- CSS 技巧一则 -- 不定宽溢出文本适配滚动
在日常布局当中,肯定经常会遇到文本内容超过容器的情况.非常常见的一种解决方案是超出省略. 但是,有的时候,由于场景的限制,可能会出现在一些无法使用超出打点省略的方法的场景,譬如在导航栏中: 这种情况下 ...
- Python List max()方法
描述 max() 方法返回列表元素中的最大值.高佣联盟 www.cgewang.com 语法 max()方法语法: max(list) 参数 list -- 要返回最大值的列表. 返回值 返回列表元素 ...
- PHP date_timestamp_set() 函数
------------恢复内容开始------------ 实例 设置基于 Unix 时间戳的日期和时间: <?php$date=date_create();date_timestamp_se ...
- luogu P4284 [SHOI2014]概率充电器 期望 概率 树形dp
LINK:概率充电器 大概是一个比较水的题目 不过有一些坑点. 根据期望的线性性 可以直接计算每个元件的期望 累和即为答案. 考虑统计每一个元件的概率的话 那么对其有贡献就是儿子 父亲 以及自己. 自 ...
- java进阶(2)--抽象类
一.抽象类集刺虎: 1.概念 类与类之前有共同特征,将这些共同特征提取出来,行为抽象类 2.抽象类的数据类型: 引用数据类型 3.语法 [修饰符列表]abstract Class 类型{类体} ...
- Redis服务之常用数据类型
上一篇博客我们聊了下redis的主从复制.aof持久化.集群.慢日志相关配置指令的说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13416534.html ...
- 虚拟机安装Centos(VirtulBox)
阿里云服务器本月底到期了,之前自己犹豫不觉没上279元3年服务器的车,但是又要用linux,所以有了这篇文章. VirtulBox 一款开源的虚拟化主机应用,可以实现一台电脑上运行多个操作系统(Lin ...