-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add relationships collection actions
- Loading branch information
1 parent
a5189e5
commit da77141
Showing
39 changed files
with
1,545 additions
and
226 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
75 changes: 75 additions & 0 deletions
75
src/Doctrine/Rest/Action/Related/RelatedCollectionAction.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
<?php namespace Pz\Doctrine\Rest\Action\Related; | ||
|
||
use Pz\Doctrine\Rest\Action\CollectionAction as BaseCollectionAction; | ||
use Pz\Doctrine\Rest\Contracts\RestRequestContract; | ||
use Pz\Doctrine\Rest\RestRepository; | ||
|
||
use Doctrine\Common\Collections\Criteria; | ||
use Doctrine\ORM\QueryBuilder; | ||
use League\Fractal\TransformerAbstract; | ||
use Pz\Doctrine\Rest\Traits\RelatedAction; | ||
|
||
/** | ||
* Action for providing collection (list or array) of data with API. | ||
*/ | ||
class RelatedCollectionAction extends BaseCollectionAction | ||
{ | ||
use RelatedAction; | ||
|
||
/** | ||
* RelatedRestAction constructor. | ||
* | ||
* @param RestRepository $repository | ||
* @param string $mappedBy | ||
* @param RestRepository $related | ||
* @param TransformerAbstract $transformer | ||
*/ | ||
public function __construct(RestRepository $repository, $mappedBy, RestRepository $related, $transformer) | ||
{ | ||
parent::__construct($repository, $transformer); | ||
$this->mappedBy = $mappedBy; | ||
$this->related = $related; | ||
} | ||
|
||
/** | ||
* Related repository used as default repository for collection queries. | ||
* | ||
* @return RestRepository | ||
*/ | ||
public function repository() | ||
{ | ||
return $this->related; | ||
} | ||
|
||
/** | ||
* Base entity repository. | ||
* | ||
* @return RestRepository | ||
*/ | ||
public function base() | ||
{ | ||
return $this->repository; | ||
} | ||
|
||
/** | ||
* Add filter by relation entity. | ||
* | ||
* @param RestRequestContract $request | ||
* @param QueryBuilder $qb | ||
* | ||
* @return $this | ||
* @throws \Pz\Doctrine\Rest\Exceptions\RestException | ||
*/ | ||
protected function applyFilter(RestRequestContract $request, QueryBuilder $qb) | ||
{ | ||
$entity = $this->base()->findById($request->getId()); | ||
|
||
$relateCriteria = Criteria::create(); | ||
$relateCriteria->andWhere($relateCriteria->expr()->eq($this->mappedBy(), $entity->getId())); | ||
|
||
$qb->innerJoin($qb->getRootAliases()[0].'.'.$this->mappedBy(), $this->mappedBy()); | ||
$qb->addCriteria($relateCriteria); | ||
|
||
parent::applyFilter($request, $qb); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
<?php namespace Pz\Doctrine\Rest\Action\Related; | ||
|
||
use Pz\Doctrine\Rest\Action\ItemAction as BaseItemAction; | ||
use Pz\Doctrine\Rest\Contracts\RestRequestContract; | ||
use Pz\Doctrine\Rest\Resource\Item; | ||
use Pz\Doctrine\Rest\Resource\NullResource; | ||
use Pz\Doctrine\Rest\RestResponse; | ||
use Pz\Doctrine\Rest\RestRepository; | ||
use Pz\Doctrine\Rest\Traits\RelatedAction; | ||
|
||
use League\Fractal\TransformerAbstract; | ||
|
||
class RelatedItemAction extends BaseItemAction | ||
{ | ||
use RelatedAction; | ||
|
||
/** | ||
* RelatedRestAction constructor. | ||
* | ||
* @param RestRepository $repository | ||
* @param string $field | ||
* @param RestRepository $related | ||
* @param TransformerAbstract $transformer | ||
*/ | ||
public function __construct(RestRepository $repository, $field, RestRepository $related, $transformer) | ||
{ | ||
parent::__construct($repository, $transformer); | ||
$this->related = $related; | ||
$this->field = $field; | ||
} | ||
|
||
/** | ||
* @param RestRequestContract $request | ||
* | ||
* @return RestResponse | ||
*/ | ||
public function handle($request) | ||
{ | ||
$entity = $this->repository()->findById($request->getId()); | ||
|
||
$this->authorize($request, $entity); | ||
|
||
if ($relatedEntity = $this->getProperty($entity, $this->field())) { | ||
return $this->response()->resource($request, | ||
new Item($relatedEntity, $this->transformer()) | ||
); | ||
} | ||
|
||
return $this->response()->resource($request, new NullResource()); | ||
} | ||
} |
59 changes: 59 additions & 0 deletions
59
src/Doctrine/Rest/Action/Related/RelatedItemCreateAction.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
<?php namespace Pz\Doctrine\Rest\Action\Related; | ||
|
||
use League\Fractal\TransformerAbstract; | ||
use Pz\Doctrine\Rest\Contracts\JsonApiResource; | ||
use Pz\Doctrine\Rest\Contracts\RestRequestContract; | ||
use Pz\Doctrine\Rest\Exceptions\RestException; | ||
use Pz\Doctrine\Rest\Resource\Item; | ||
use Pz\Doctrine\Rest\RestAction; | ||
use Pz\Doctrine\Rest\RestRepository; | ||
use Pz\Doctrine\Rest\RestResponse; | ||
use Pz\Doctrine\Rest\Traits\CanHydrate; | ||
use Pz\Doctrine\Rest\Traits\RelatedAction; | ||
|
||
class RelatedItemCreateAction extends RestAction | ||
{ | ||
use RelatedAction; | ||
use CanHydrate; | ||
|
||
/** | ||
* RelatedRestAction constructor. | ||
* | ||
* @param RestRepository $repository | ||
* @param string $field | ||
* @param RestRepository $related | ||
* @param TransformerAbstract $transformer | ||
*/ | ||
public function __construct(RestRepository $repository, $field, RestRepository $related, $transformer) | ||
{ | ||
parent::__construct($repository, $transformer); | ||
$this->related = $related; | ||
$this->field = $field; | ||
} | ||
|
||
/** | ||
* @param RestRequestContract $request | ||
* | ||
* @return RestResponse | ||
* @throws RestException | ||
*/ | ||
public function handle($request) | ||
{ | ||
$entity = $this->repository()->findById($request->getId()); | ||
$data = $request->getData(); | ||
$this->authorize($request, $entity); | ||
|
||
if (isset($data['id']) && isset($data['type'])) { | ||
$item = $this->getRelatedEntity($data); | ||
} else { | ||
$scope = $entity->getResourceKey().'.'.$this->field(); | ||
/** @var JsonApiResource $item */ | ||
$item = $this->hydrateEntity($this->related()->getClassName(), $data, $scope); | ||
} | ||
|
||
$this->setProperty($entity, $this->field(), $item); | ||
$this->repository()->getEntityManager()->flush($entity); | ||
|
||
return $this->response()->resource($request, new Item($item, $this->transformer())); | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
22 changes: 22 additions & 0 deletions
22
src/Doctrine/Rest/Action/Relationships/RelationshipsCollectionAction.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
<?php namespace Pz\Doctrine\Rest\Action\Relationships; | ||
|
||
use Doctrine\ORM\Tools\Pagination\Paginator; | ||
use League\Fractal\Pagination\DoctrinePaginatorAdapter; | ||
use Pz\Doctrine\Rest\Action\Related\RelatedCollectionAction; | ||
use Pz\Doctrine\Rest\Contracts\RestRequestContract; | ||
use Pz\Doctrine\Rest\Resource\Collection; | ||
use Pz\Doctrine\Rest\RestResponse; | ||
|
||
class RelationshipsCollectionAction extends RelatedCollectionAction | ||
{ | ||
/** | ||
* @param RestRequestContract $request | ||
* | ||
* @return RestResponse | ||
*/ | ||
protected function handle($request) | ||
{ | ||
$request->isRelationships(true); | ||
return parent::handle($request); | ||
} | ||
} |
Oops, something went wrong.