AbstractRepositoryTrait¶
Published: 2019-07-11
Author: Nickolas Burr
Description¶
In constract to AbstractRepository
, which is an abstract
class that implements
AbstractRepositoryInterface
, you could make use of PHP traits to achieve a similar
result. With regards to AbstractRepository
, this approach provides looser coupling
by eliminating inheritance and utilizing a trait as the vehicle for satisfying the
service contract enforced by AbstractRepositoryInterface
.
Usage¶
<?php
/**
* EntityRepository.php
*/
declare(strict_types=1);
namespace Vendor\Package\Model\Repository;
use Vendor\Package\Api\EntityRepositoryInterface;
class EntityRepository implements EntityRepositoryInterface
{
use AbstractRepositoryTrait;
/** @property mixed $collectionFactory */
protected $collectionFactory;
/** @property mixed $searchResultsFactory */
protected $searchResultsFactory;
/**
* @param mixed $collectionFactory
* @param mixed $searchResultsFactory
* @return void
*/
public function __construct(
$collectionFactory,
$searchResultsFactory
) {
$this->collectionFactory = $collectionFactory;
$this->searchResultsFactory = $searchResultsFactory;
}
...
}
Source¶
<?php
/**
* AbstractRepositoryTrait.php
*/
declare(strict_types=1);
namespace Vendor\Package\Model\Repository;
use Magento\Framework\{
Api\SearchCriteriaInterface,
Api\SearchResultsInterface,
Api\Search\FilterGroup,
Api\SortOrder,
Exception\NoSuchEntityException
};
trait AbstractRepositoryTrait
{
/**
* @param FilterGroup $filterGroup
* @param mixed $collection
* @return void
*/
public function addFilterGroupToCollection(
FilterGroup $filterGroup,
$collection
): void
{
/** @var array $fields */
$fields = [];
/** @var array $params */
$params = [];
foreach ($filterGroup->getFilters() as $filter) {
/** @var string $param */
$param = $filter->getConditionType() ?: 'eq';
/** @var string $field */
$field = $filter->getField();
/** @var mixed $value */
$value = $filter->getValue();
$fields[] = $field;
$params[] = [
$param => $value,
];
}
$collection->addFieldToFilter($fields, $params);
}
/**
* @param string $direction
* @return string
*/
public function getDirection(
string $direction = SortOrder::SORT_DESC
): string
{
return $direction === SortOrder::SORT_ASC
? SortOrder::SORT_ASC
: SortOrder::SORT_DESC;
}
/**
* @param SearchCriteriaInterface $criteria
* @return SearchResultsInterface
*/
public function getList(SearchCriteriaInterface $criteria): SearchResultsInterface
{
/** @var AbstractCollectionInterface $collection */
$collection = $this->collectionFactory->create();
foreach ($criteria->getFilterGroups() as $group) {
$this->addFilterGroupToCollection($group, $collection);
}
foreach ((array) $criteria->getSortOrders() as $sortOrder) {
/** @var string $field */
$field = $sortOrder->getField();
$collection->addOrder(
$field,
$this->getDirection($sortOrder->getDirection())
);
}
$collection->setCurPage($criteria->getCurrentPage());
$collection->setPageSize($criteria->getPageSize());
$collection->load();
/** @var SearchResultsInterface $results */
$results = $this->searchResultsFactory->create();
$results->setSearchCriteria($criteria);
/** @var array $items */
$items = [];
foreach ($collection as $item) {
$items[] = $item;
}
$results->setItems($items);
$results->setTotalCount($collection->getSize());
return $results;
}
}