Magento2 Collection vs CollectionFactory – Key Differences Explained

collection;factorymagento2

I need the list of all the admin users.

And, both the below set of codes, provide the same result.

Code 1

public function __construct(
        \Magento\User\Model\ResourceModel\User\Collection $userCollectionFactory 
    )
    {
        $this->userCollectionFactory = $userCollectionFactory;
    }

    public function getCustomData()
    {
        $userCollection = $this->userCollectionFactory;
        var_dump($userCollection->getData());
    }

Code 2

public function __construct(
    \Magento\User\Model\ResourceModel\User\CollectionFactory $userCollectionFactory 
)
{
    $this->userCollectionFactory = $userCollectionFactory;
}

public function getCustomData()
{
    $userCollection = $this->userCollectionFactory->create();
    var_dump($userCollection->getData());
    exit('test');
}

My question here is, what is the difference between both these set of codes and which one is better to use and in which case we can use the other one?
And if there is any other better way to fetch the same result set?

Best Answer

I understand this follows the Factory pattern https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)#PHP

So, create() method returns the requested object, in this case: \Magento\User\Model\ResourceModel\User\Collection

However... it seems you shouldn't be able to inject that object in constructor (Code 1), or at least, and responding to best practices, you should better inject the factory

Factories are service classes that instantiate non-injectable classes, that is, models that represent a database entity. They create a layer of abstraction between the ObjectManager and business code.

http://devdocs.magento.com/guides/v2.0/extension-dev-guide/factories.html

Related Topic