Issues (61)

src/Routers/RouterTrait.php (13 issues)

1
<?php
2
/**
3
 * Created by PhpStorm.
4
 *
5
 * @author Donii Sergii <[email protected]>
6
 * Date: 10/25/17
7
 * Time: 11:57 AM
8
 */
9
10
namespace sonrac\WAMP\Routers;
11
12
use Thruway\Peer\RouterInterface;
13
14
/**
15
 * Trait RouterTrait.
16
 * Base router trait.
17
 */
18
trait RouterTrait
19
{
20
    /**
21
     * Controllers list
22
     *
23
     * @var \sonrac\WAMP\Abstracts\WAMPControllerInterface[]
24
     *
25
     * @author Donii Sergii <[email protected]>
26
     */
27
    protected $controllers;
28
29
    /**
30
     * Main router
31
     *
32
     * @var null|\Thruway\Peer\RouterInterface|\sonrac\WAMP\Routers\Router
33
     *
34
     * @author Donii Sergii <[email protected]>
35
     */
36
    protected $router = null;
37
38
    /**
39
     * Route path prefix.
40
     *
41
     * @var string|null
42
     *
43
     * @author Donii Sergii <[email protected]>
44
     */
45
    private $prefix = null;
46
47
    /**
48
     * Controller namespace.
49
     *
50
     * @var string|null
51
     *
52
     * @author Donii Sergii <[email protected]>
53
     */
54
    private $groupControllerNamespace = null;
55
56
    /**
57
     * Middleware list.
58
     *
59
     * @var null|array
60
     *
61
     * @author Donii Sergii <[email protected]>
62
     */
63
    private $middleware = null;
64
65
    /**
66
     * Group routes.
67
     *
68
     * @param array    $config Group config
69
     * @param \Closure $runner Closure runner group
70
     *
71
     * @author Donii Sergii <[email protected]>
72
     */
73 2
    public function group(array $config, \Closure $runner)
74
    {
75 2
        $middleware = isset($config['middleware']) ? explode('|', $config['middleware']) : [];
76 2
        $namespace = isset($config['namespace']) ? $config['namespace'] : 'App\Controllers\WAMP';
77
78 2
        $this->groups[] = [
0 ignored issues
show
Bug Best Practice introduced by
The property groups does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
79 2
            'middleware' => $middleware,
80 2
            'namespace'  => $namespace,
81 2
            'prefix'     => isset($config['prefix']) ? $config['prefix'] : '',
82 2
            'callback'   => $runner,
83
        ];
84 2
    }
85
86
    /**
87
     * Get route groups
88
     *
89
     * @return null|\sonrac\WAMP\GroupsConfigInterface[]
90
     *
91
     * @author Donii Sergii <[email protected]>
92
     */
93 1
    public function getGroups()
94
    {
95 1
        return $this->groups;
96
    }
97
98
    /**
99
     * Get router
100
     *
101
     * @return mixed|null|\sonrac\WAMP\Contracts\WAMPRouterInterface|\sonrac\WAMP\Routers\Router|\Thruway\Peer\RouterInterface
102
     *
103
     * @author Donii Sergii <[email protected]>
104
     */
105 3
    public function getRouter()
106
    {
107 3
        return $this->router ?? $this->router = app()->wampRouter;
0 ignored issues
show
The function app was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

107
        return $this->router ?? $this->router = /** @scrutinizer ignore-call */ app()->wampRouter;
Loading history...
108
    }
109
110
    /**
111
     * Set router.
112
     *
113
     * @author Donii Sergii <[email protected]>
114
     */
115 2
    public function setRouter(RouterInterface $router)
116
    {
117 2
        $this->router = $router;
118 2
    }
119
120
    /**
121
     * Get client session.
122
     *
123
     * @return \Thruway\ClientSession
124
     *
125
     * @author Donii Sergii <[email protected]>
126
     */
127 2
    public function getClientSession()
128
    {
129 2
        return $this->getRouter()->getClient()->getSession();
0 ignored issues
show
The method getClient() does not exist on Thruway\Peer\RouterInterface. It seems like you code against a sub-type of Thruway\Peer\RouterInterface such as sonrac\WAMP\Routers\Router. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

129
        return $this->getRouter()->/** @scrutinizer ignore-call */ getClient()->getSession();
Loading history...
The method getClient() does not exist on sonrac\WAMP\Contracts\WAMPRouterInterface. It seems like you code against a sub-type of said class. However, the method does not exist in sonrac\WAMP\Contracts\RPCRouterInterface. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

129
        return $this->getRouter()->/** @scrutinizer ignore-call */ getClient()->getSession();
Loading history...
130
    }
131
132
    /**
133
     * Get client.
134
     *
135
     * @return \sonrac\WAMP\Client|\Thruway\Peer\ClientInterface
136
     *
137
     * @author Donii Sergii <[email protected]>
138
     */
139 1
    public function getClient()
140
    {
141 1
        return $this->getRouter()->getClient();
142
    }
143
144
    /**
145
     * Parse callback function
146
     *
147
     * @param string|\Closure $callback  Callback
148
     * @param null            $namespace Controller namespace
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $namespace is correct as it would always require null to be passed?
Loading history...
149
     *
150
     * @return \Closure
151
     *
152
     * @author Donii Sergii <[email protected]>
153
     */
154 4
    public function parseCallback($callback, $namespace = null)
155
    {
156 4
        if ($callback instanceof \Closure) {
157 2
            return $callback;
158
        }
159
160 3
        $namespace = $namespace ? $namespace.'\\' : '';
0 ignored issues
show
$namespace is of type null, thus it always evaluated to false.
Loading history...
161
162 3
        $callback = explode('@', $callback);
163
164 3
        return function () use ($callback, $namespace) {
165 1
            if (count($callback) === 1) {
166
                return app()->call([$this, $callback[0]], func_get_args());
0 ignored issues
show
The function app was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

166
                return /** @scrutinizer ignore-call */ app()->call([$this, $callback[0]], func_get_args());
Loading history...
167
            }
168
169 1
            if (isset($this->controllers[$callback[0]])) {
170
                return call_user_func_array([$this->controllers[$callback[0]], $callback[1]], func_get_args());
171
            }
172
173 1
            $namespace = rtrim($namespace, '\\');
174
175 1
            $className = class_exists($callback[0]) ? $callback[0] : $namespace.'\\'.$callback[0];
176
177 1
            $this->controllers[$callback[0]] = app()->make($className);
178
179 1
            return app()->call([$this->controllers[$callback[0]], $callback[1]], func_get_args());
180 3
        };
181
    }
182
183
    /**
184
     * get controller namespace for group
185
     *
186
     * @return null|string
187
     *
188
     * @author Donii Sergii <[email protected]>
189
     */
190 1
    public function getGroupControllerNamespace()
191
    {
192 1
        return $this->groupControllerNamespace;
193
    }
194
195
    /**
196
     * {@inheritdoc}
197
     */
198 3
    public function parseGroups()
199
    {
200 3
        if (!is_array($this->groups) || !count($this->groups)) {
201 2
            return;
202
        }
203 1
        gc_enable();
204 1
        $callbacks = [];
205 1
        foreach ($this->groups as $group) {
206 1
            $this->prefix = $group['prefix'];
207 1
            $this->groupControllerNamespace = $group['namespace'];
208 1
            $this->middleware = $group['middleware'];
209 1
            $callbacks[] = $group['callback']($this->getClientSession(), $this->getClient());
210
        }
211
212 1
        $this->groups = null;
0 ignored issues
show
Bug Best Practice introduced by
The property groups does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
213 1
        unset($this->groups);
214 1
        $this->groups = [];
215
216 1
        $this->prefix = null;
217 1
        $this->groupControllerNamespace = null;
218
219 1
        gc_collect_cycles();
220 1
        gc_disable();
221
222 1
        return $callbacks;
223
    }
224
225
    /**
226
     * Prepare path.
227
     *
228
     * @param \Closure|string $callback Callback
229
     *
230
     * @return array
231
     *
232
     * @author Donii Sergii <[email protected]>
233
     */
234 1
    protected function prepareCallback($callback)
235
    {
236 1
        $namespace = $this->groupControllerNamespace ?? $this->getRouter()->getGroupControllerNamespace();
0 ignored issues
show
The method getGroupControllerNamespace() does not exist on Thruway\Peer\RouterInterface. It seems like you code against a sub-type of Thruway\Peer\RouterInterface such as sonrac\WAMP\Routers\Router. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

236
        $namespace = $this->groupControllerNamespace ?? $this->getRouter()->/** @scrutinizer ignore-call */ getGroupControllerNamespace();
Loading history...
The method getGroupControllerNamespace() does not exist on sonrac\WAMP\Contracts\WAMPRouterInterface. It seems like you code against a sub-type of said class. However, the method does not exist in sonrac\WAMP\Contracts\RPCRouterInterface. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

236
        $namespace = $this->groupControllerNamespace ?? $this->getRouter()->/** @scrutinizer ignore-call */ getGroupControllerNamespace();
Loading history...
237 1
        $namespace = $namespace ?? $this->getRouter()->getControllerNamespace();
0 ignored issues
show
The method getControllerNamespace() does not exist on Thruway\Peer\RouterInterface. It seems like you code against a sub-type of Thruway\Peer\RouterInterface such as sonrac\WAMP\Routers\Router. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

237
        $namespace = $namespace ?? $this->getRouter()->/** @scrutinizer ignore-call */ getControllerNamespace();
Loading history...
The method getControllerNamespace() does not exist on sonrac\WAMP\Contracts\WAMPRouterInterface. It seems like you code against a sub-type of sonrac\WAMP\Contracts\WAMPRouterInterface such as sonrac\WAMP\Routers\Router. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

237
        $namespace = $namespace ?? $this->getRouter()->/** @scrutinizer ignore-call */ getControllerNamespace();
Loading history...
238
239
        return [
240 1
            'prefix'     => $this->prefix,
241 1
            'namespace'  => $namespace,
242 1
            'callback'   => $this->parseCallback($callback, $namespace),
0 ignored issues
show
It seems like $namespace can also be of type string; however, parameter $namespace of sonrac\WAMP\Routers\RouterTrait::parseCallback() does only seem to accept null, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

242
            'callback'   => $this->parseCallback($callback, /** @scrutinizer ignore-type */ $namespace),
Loading history...
243 1
            'middleware' => $this->middleware,
244
        ];
245
    }
246
}
247