Test Failed
Pull Request — master (#11)
by
unknown
16:45 queued 43s
created

CreateAction::beforeCreate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 4
ccs 0
cts 0
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php namespace Pz\Doctrine\Rest\Action;
2
3
use Pz\Doctrine\Rest\Contracts\JsonApiResource;
4
use Pz\Doctrine\Rest\Resource\Item;
5
use Pz\Doctrine\Rest\RestAction;
6
use Pz\Doctrine\Rest\Contracts\RestRequestContract;
7
use Pz\Doctrine\Rest\RestResponse;
8
use Pz\Doctrine\Rest\RestResponseFactory;
9
use Pz\Doctrine\Rest\Traits\CanHydrate;
10
use Pz\Doctrine\Rest\Traits\CanValidate;
11
12
class CreateAction extends RestAction
13
{
14
    use CanHydrate;
0 ignored issues
show
introduced by
The trait Pz\Doctrine\Rest\Traits\CanHydrate requires some properties which are not provided by Pz\Doctrine\Rest\Action\CreateAction: $reflFields, $associationMappings
Loading history...
15
    use CanValidate;
16
17
    /** @var array|callable[] */
18
    protected $beforeCreate = [];
19
20
    /** @var array|callable[] */
21
    protected $afterCreated = [];
22
23
    /**
24 4
     * @param RestRequestContract $request
25
     * @return RestResponse
26 4
     * @throws \Doctrine\ORM\ORMException
27 4
     * @throws \Doctrine\ORM\OptimisticLockException
28
     * @throws \Pz\Doctrine\Rest\Exceptions\RestException
29 4
     */
30 4
    public function handle($request)
31 3
    {
32 2
        $headers = [];
33 2
        $class = $this->repository()->getClassName();
34
35 2
        $this->authorize($request, $class);
36 2
        $entity = $this->hydrateRootEntity($class, $request);
37
        $this->validateEntity($entity);
38
39 2
        $this->callBeforeCreate($entity, $request);
40 2
41
        $this->repository()->getEntityManager()->persist($entity);
42
        $this->repository()->getEntityManager()->flush();
43
44
        $this->callAfterCreated($entity, $request);
45
46
        if ($entity instanceof JsonApiResource) {
47
            $headers['Location'] = $this->repository()->linkJsonApiResource($request, $entity);
48
        }
49
50
        $resource = new Item($entity, $this->transformer());
51
        return RestResponseFactory::resource($request, $resource, RestResponse::HTTP_CREATED, $headers);
52
    }
53
54
    public function hydrateRootEntity($entity, RestRequestContract $request)
55
    {
56
        return $this->hydrateEntity($entity, $request->getData());
57
    }
58
59
    public function beforeCreate(callable $cb): self
60
    {
61
        $this->beforeCreate[] = $cb;
62
        return $this;
63
    }
64
65
    public function afterCreated(callable $cb): self
66
    {
67
        $this->afterCreated[] = $cb;
68
        return $this;
69
    }
70
71
    public function callBeforeCreate($entity, RestRequestContract $request): self
72
    {
73
        foreach ($this->beforeCreate as $cb) {
74
            $cb($entity, $request);
75
        }
76
77
        return $this;
78
    }
79
80
    public function callAfterCreated($entity, RestRequestContract $request): self
81
    {
82
        foreach ($this->afterCreated as $cb) {
83
            $cb($entity, $request);
84
        }
85
86
        return $this;
87
    }
88
}
89