What is the difference or best way for creation instance of new class?
Object manager?
or
Define in to constructor?
What is the difference or best way for creation instance of new class?
Object manager?
or
Define in to constructor?
Using __construct() method defined inside php file,
Demo example,
protected $_entityResource;
public function __construct(
\Magento\Catalog\Model\ResourceModel\AbstractResource $entityResource
) {
$this->_entityResource = $entityResource;
}
Why we have to not used Object Manager inside file, please check community thread, ObjectManager
As per my opinion its better to use construtor instead of Object Manager. We should not use the ObjectManager directly! It defeasance the purpose of dependency injection. We can use ObjectManager, if there is no alternative.
A bit late but still a very important aspect in magento2. There are 2 ways to create new instance of objects in magento2 professionally. One is constructor injection. Second one is using factory.
Using Object manager directly in code, should be avoided as much as possible.
The following article provides a good explaination of the 2 ways with example.
http://www.rosenborgsolutions.com/magento-new-class-instance.php
Using class constructor
use SomeCompany\SomeModule\Model\UserFactory;
use SomeCompany\SomeModule\Model\User;
class InjectUsingConstructorParameters
{
/** @var User */
private $user;
/**
* @param User $user
*/
public function __construct(
User $user
) {
$this->user = $user;
}
}
Using factory
use SomeCompany\SomeModule\Model\UserFactory;
use SomeCompany\SomeModule\Model\User;
class InjectUsingFactory
{
/** @var User */
private $userFactory;
/**
* @param UserFactory $userFactory
*/
public function __construct(
UserFactory $userFactory
) {
$this->userFactory = $userFactory;
}
/**
* @param string $userId
* @return User
*/
public function getUserDetails(string $userId): User
{
$user = $this->userFactory->create([
'param1' => 'param1value'
'param2' => 'param2value'
]);
return $user->getUserById($userId);
}
}
Never ever like this
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($id);