Completed
Push — development ( b626b0...ff940a )
by Thomas
16s
created

PageProvider   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 125
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
dl 0
loc 125
rs 10
c 0
b 0
f 0
wmc 8
lcom 1
cbo 7

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
B getPageBySlug() 0 40 4
A getPageBlocks() 0 8 1
A getPage() 0 13 2
1
<?php
2
3
namespace Oc\Page;
4
5
use Oc\GlobalContext\GlobalContext;
6
use Oc\Page\Exception\PageNotFoundException;
7
use Oc\Page\Exception\PageTranslationNotFoundException;
8
use Oc\Page\Persistence\BlockService;
9
use Oc\Page\Persistence\PageEntity;
10
use Oc\Page\Persistence\BlockEntity;
11
use Oc\Page\Persistence\PageService;
12
13
/**
14
 * Class PageProvider
15
 */
16
class PageProvider
17
{
18
    /**
19
     * @var PageService
20
     */
21
    private $pageService;
22
23
    /**
24
     * @var BlockService
25
     */
26
    private $blockService;
27
28
    /**
29
     * @var GlobalContext
30
     */
31
    private $globalContext;
32
33
    /**
34
     * PageProvider constructor.
35
     *
36
     * @param PageService $pageService
37
     * @param BlockService $blockService
38
     * @param GlobalContext $globalContext
39
     */
40
    public function __construct(PageService $pageService, BlockService $blockService, GlobalContext $globalContext)
41
    {
42
        $this->pageService = $pageService;
43
        $this->blockService = $blockService;
44
        $this->globalContext = $globalContext;
45
    }
46
47
    /**
48
     * Fetches the page by the slug.
49
     *
50
     * Page blocks are translated in the user language, if the translation does not exist the default language is used.
51
     * If the default language is also not available a exception is thrown.
52
     *
53
     * @param string $slug
54
     *
55
     * @return PageStruct
56
     *
57
     * @throws PageNotFoundException Thrown if the page could not be found
58
     * @throws PageTranslationNotFoundException Thrown if no translation of the page could be found
59
     */
60
    public function getPageBySlug($slug)
61
    {
62
        $slug = strtolower($slug);
63
64
        $page = $this->getPage($slug);
65
66
        $preferredLocale = $this->globalContext->getLocale();
67
        $defaultLocale = $this->globalContext->getDefaultLocale();
68
69
        $pageBlocks = $this->getPageBlocks(
70
            $page,
0 ignored issues
show
Bug introduced by
It seems like $page defined by $this->getPage($slug) on line 64 can be null; however, Oc\Page\PageProvider::getPageBlocks() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
71
            $preferredLocale
72
        );
73
74
        $isFallback = false;
75
76
        $sameLocale = $preferredLocale === $defaultLocale;
77
78
        if(!$sameLocale && count($pageBlocks) === 0) {
79
            //Fetch fallback if blocks are empty
80
            $pageBlocks = $this->getPageBlocks(
81
                $page,
0 ignored issues
show
Bug introduced by
It seems like $page defined by $this->getPage($slug) on line 64 can be null; however, Oc\Page\PageProvider::getPageBlocks() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
82
                $defaultLocale
83
            );
84
85
            $isFallback = true;
86
        }
87
88
        if (count($pageBlocks) === 0) {
89
            throw new PageTranslationNotFoundException('Translation for page "' . $slug . '" could not be found"');
90
        }
91
92
        return new PageStruct(
93
            $page,
0 ignored issues
show
Bug introduced by
It seems like $page defined by $this->getPage($slug) on line 64 can be null; however, Oc\Page\PageStruct::__construct() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
94
            $pageBlocks,
95
            $preferredLocale,
96
            $defaultLocale,
97
            $isFallback
98
        );
99
    }
100
101
    /**
102
     * Fetches all page blocks by the given page and locale.
103
     *
104
     * @param PageEntity $page
105
     * @param string $locale
106
     *
107
     * @return BlockEntity[]
108
     */
109
    private function getPageBlocks(PageEntity $page, $locale)
110
    {
111
        return $this->blockService->fetchBy([
112
            'page_id' => $page->id,
113
            'locale' => $locale,
114
            'active' => 1,
115
        ]);
116
    }
117
118
    /**
119
     * Fetches the page by the given slug.
120
     *
121
     * @param string $slug
122
     *
123
     * @return null|PageEntity
124
     *
125
     * @throws PageNotFoundException Thrown if the page could not be found
126
     */
127
    private function getPage($slug)
128
    {
129
        $page = $this->pageService->fetchOneBy([
130
            'slug' => $slug,
131
            'active' => 1,
132
        ]);
133
134
        if (!$page) {
135
            throw new PageNotFoundException('The page "' . $slug . '" could not be found"');
136
        }
137
138
        return $page;
139
}
140
}
141