Completed
Push — master ( b659c5...c65770 )
by Michael
10:22
created

EveApiWiring::wire()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 0
cts 6
cp 0
rs 9.6666
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 1
crap 2
1
<?php
2
declare(strict_types = 1);
3
/**
4
 * Contains class EveApiWiring.
5
 *
6
 * PHP version 7.0
7
 *
8
 * LICENSE:
9
 * This file is part of Yet Another Php Eve Api Library also know as Yapeal
10
 * which can be used to access the Eve Online API data and place it into a
11
 * database.
12
 * Copyright (C) 2016-2017 Michael Cummings
13
 *
14
 * This program is free software: you can redistribute it and/or modify it
15
 * under the terms of the GNU Lesser General Public License as published by the
16
 * Free Software Foundation, either version 3 of the License, or (at your
17
 * option) any later version.
18
 *
19
 * This program is distributed in the hope that it will be useful, but WITHOUT
20
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
22
 * for more details.
23
 *
24
 * You should have received a copy of the GNU Lesser General Public License
25
 * along with this program. If not, see
26
 * <http://spdx.org/licenses/LGPL-3.0.html>.
27
 *
28
 * You should be able to find a copy of this license in the COPYING-LESSER.md
29
 * file. A copy of the GNU GPL should also be available in the COPYING.md file.
30
 *
31
 * @copyright 2016-2017 Michael Cummings
32
 * @license   LGPL-3.0+
33
 * @author    Michael Cummings <[email protected]>
34
 */
35
namespace Yapeal\Configuration;
36
37
use Yapeal\Container\ContainerInterface;
38
use Yapeal\Event\MediatorInterface;
39
40
/**
41
 * Class EveApiWiring.
42
 */
43
class EveApiWiring implements WiringInterface
44
{
45
    /**
46
     * @param ContainerInterface $dic
47
     *
48
     * @throws \LogicException
49
     */
50
    public function wire(ContainerInterface $dic)
51
    {
52
        /**
53
         * @var MediatorInterface $mediator
54
         */
55
        $mediator = $dic['Yapeal.Event.Callable.Mediator'];
56
        $this->wireListeners($dic, $mediator)
57
            ->wireCreator($dic, $mediator);
58
    }
59
    /**
60
     * @param ContainerInterface $dic
61
     *
62
     * @return array
63
     */
64
    private function getFilteredEveApiListenerList(ContainerInterface $dic): array
65
    {
66
        clearstatcache(true);
67
        $globPath = $dic['Yapeal.EveApi.dir'] . '{Account,Api,Char,Corp,Eve,Map,Server}/*.php';
68
        $fileNames = glob($globPath, GLOB_NOESCAPE | GLOB_BRACE);
69
        if (false === $fileNames) {
70
            $fileNames = [];
71
        }
72
        return $fileNames;
73
    }
74
    /**
75
     * @param ContainerInterface $dic
76
     * @param MediatorInterface  $mediator
77
     */
78
    private function wireCreator(ContainerInterface $dic, MediatorInterface $mediator)
79
    {
80
        if (empty($dic['Yapeal.EveApi.Callable.Creator'])) {
81
            /**
82
             * @param ContainerInterface $dic
83
             *
84
             * @return \Yapeal\EveApi\Creator
85
             * @throws \LogicException
86
             */
87
            $dic['Yapeal.EveApi.Callable.Creator'] = function (ContainerInterface $dic) {
88
                $loader = new \Twig_Loader_Filesystem($dic['Yapeal.EveApi.dir']);
89
                $twig = new \Twig_Environment($loader,
90
                    ['debug' => true, 'strict_variables' => true, 'autoescape' => false]);
91
                $filter = new \Twig_SimpleFilter('ucFirst', function ($value) {
92
                    return ucfirst($value);
93
                });
94
                $twig->addFilter($filter);
95
                $filter = new \Twig_SimpleFilter('lcFirst', function ($value) {
96
                    return lcfirst($value);
97
                });
98
                $twig->addFilter($filter);
99
                /**
100
                 * @var \Yapeal\EveApi\Creator $create
101
                 */
102
                $create = new $dic['Yapeal.EveApi.Classes.create']($twig, $dic['Yapeal.EveApi.dir']);
103
                if (!empty($dic['Yapeal.Create.overwrite'])) {
104
                    $create->setOverwrite($dic['Yapeal.Create.overwrite']);
105
                }
106
                return $create;
107
            };
108
            $mediator->addServiceListener('Yapeal.EveApi.create',
109
                ['Yapeal.EveApi.Callable.Creator', 'createEveApi'],
110
                'last');
111
        }
112
    }
113
    /**
114
     * @param ContainerInterface $dic
115
     * @param MediatorInterface  $mediator
116
     *
117
     * @return self Fluent interface.
118
     */
119
    private function wireListeners(ContainerInterface $dic, MediatorInterface $mediator): self
120
    {
121
        /**
122
         * @var \Yapeal\Sql\CommonSqlQueries    $csq
123
         * @var \Yapeal\Sql\ConnectionInterface $connection
124
         * @var bool                            $preserve
125
         */
126
        $listeners = $this->getFilteredEveApiListenerList($dic);
127
        $csq = $dic['Yapeal.Sql.Callable.CommonQueries'];
128
        $connection = $dic['Yapeal.Sql.Callable.Connection'];
129
        $preserve = $dic['Yapeal.EveApi.Parameters.preserve'];
130
        foreach ($listeners as $listener) {
131
            $service = sprintf('%1$s.%2$s.%3$s',
132
                'Yapeal.EveApi.Callable',
133
                basename(dirname($listener)),
134
                basename($listener, '.php'));
135
            if (empty($dic[$service])) {
136
                /**
137
                 * @return \Yapeal\CommonToolsInterface|\Yapeal\Event\EveApiPreserverInterface
138
                 */
139
                $dic[$service] = function () use ($connection, $csq, $preserve, $service) {
140
                    $class = '\\' . str_replace('.', '\\', $service);
141
                    /**
142
                     * @var \Yapeal\CommonToolsInterface|\Yapeal\Event\EveApiPreserverInterface $callable
143
                     */
144
                    $callable = new $class();
145
                    $callable->setCsq($csq)
0 ignored issues
show
Bug introduced by
The method setCsq does only exist in Yapeal\CommonToolsInterface, but not in Yapeal\Event\EveApiPreserverInterface.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
146
                        ->setPdo($connection);
147
                    if (false === strpos($service, 'Section')) {
148
                        $callable->setPreserve($preserve);
0 ignored issues
show
Bug introduced by
The method setPreserve does only exist in Yapeal\Event\EveApiPreserverInterface, but not in Yapeal\CommonToolsInterface.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
149
                    }
150
                    return $callable;
151
                };
152
            }
153
            $mediator->addServiceListener($service . '.start', [$service, 'startEveApi'], 'last');
154
            if (false === strpos($listener, 'Section')) {
155
                $mediator->addServiceListener($service . '.preserve', [$service, 'preserveEveApi'], 'last');
156
            }
157
        }
158
        return $this;
159
    }
160
}
161