🟢 Good practice
<?php
/**
* Save data objects (aka models) with resource models. This creates a
* separation of concerns, so models only represent their entities, and only
* resource models interact with the database. To ensure new objects are always
* saved to the database, create the new data entities with factory classes.
*/
namespace Foo\Bar\Controller\Baz;
use Foo\Bar\Model\Widget;
use Foo\Bar\Model\WidgetFactory;
/**
* Be sure to use a class alias to differentiate a widget model object from a
* resource model object.
*/
use Foo\Bar\Model\ResourceModel\Widget as WidgetResource;
class Index
{
/** @var WidgetFactory */
private $widgetFactory;
/** @var WidgetResource */
private $widgetResource;
/**
* @param WidgetFactory $widgetFactory
* @param WidgetResource @widgetResource
*/
public function __construct(
WidgetFactory $widgetFactory,
WidgetResource $widgetResource
) {
$this->widgetFactory = $widgetFactory;
$this->widgetResource = $widgetResource;
}
public function execute()
{
/**
* Create a widget object from the factory object. This ensures a new
* object is created every time the code is ran.
*/
/** @var Widget $widget */
$widget = $this->widgetFactory->create();
$widget->setName('baz');
/**
* Save the widget with the resource model instead of directly from the
* model. This practice seperates concerns of responsibility.
*/
$this->widgetResource->save($widget);
}
}
🔴 Bad practice
<?php
/**
* Data objects should not be responsible for saving themselves. Calling
* `->save()` on a model entity is a deprecated practice.
*/
namespace Foo\Bar\Controller\Baz;
use Foo\Bar\Model\Widget;
class Index
{
/** @var Widget */
private $widget;
/**
* @param Widget $widget
*/
public function __construct(Widget $widget) {
$this->widget = $widget;
}
public function execute()
{
$this->widget->setName('baz');
$this->widget->save();
}
}
Visit M.academy to learn much more about Magento, Laravel, PHP, Javascript, & Docker.