Passed
Push — master ( 19b158...bce624 )
by Valentin
03:06 queued 10s
created

PheanstalkProxy::createTask()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 1

Importance

Changes 6
Bugs 0 Features 0
Metric Value
cc 1
eloc 11
c 6
b 0
f 0
nc 1
nop 8
dl 0
loc 15
ccs 12
cts 12
cp 1
crap 1
rs 9.9

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace Pyrowman\PheanstalkBundle\Proxy;
4
5
use Pheanstalk\Command\CreateScheduleCommand;
6
use Pheanstalk\Command\GetWorkflowInstancesCommand;
7
use Pheanstalk\Pheanstalk;
8
use Pheanstalk\Structure\Schedule;
9
use Pheanstalk\Structure\TaskInstance;
10
use Pheanstalk\Structure\TimeSchedule;
11
use Pheanstalk\Structure\Tube;
12
use Pheanstalk\Structure\Workflow;
13
use Pheanstalk\Structure\WorkflowInstance;
14
use Pyrowman\PheanstalkBundle\Event\CommandEvent;
15
use Pheanstalk\Connection;
16
use Pheanstalk\PheanstalkInterface;
17
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
18
19
class PheanstalkProxy implements PheanstalkProxyInterface
20
{
21
    /**
22
     * @var EventDispatcherInterface
23
     */
24
    protected $dispatcher;
25
26
    /**
27
     * @var string
28
     */
29
    protected $name;
30
31
    /**
32
     * @var Pheanstalk
33
     */
34
    protected $pheanstalk;
35
36
    /** @var $currentClass PheanstalkInterface */
0 ignored issues
show
Documentation Bug introduced by
The doc comment $currentClass at position 0 could not be parsed: Unknown type name '$currentClass' at position 0 in $currentClass.
Loading history...
37
    private $currentClass;
38
39
    /**
40
     * {@inheritDoc}
41
     */
42
    public function setConnection(Connection $connection)
43
    {
44
        $this->pheanstalk->setConnection($connection);
45
46
        return $this;
47
    }
48
49
    /**
50
     * {@inheritDoc}
51
     */
52
    public function getConnection()
53
    {
54
        return $this->pheanstalk->getConnection();
55
    }
56
57
    /**
58
     * @return PheanstalkInterface
59
     */
60
    public function getCurrentClass(): PheanstalkInterface
61
    {
62
        return $this->currentClass ?? $this;
63
    }
64
65
    /**
66
     * @param PheanstalkInterface $currentClass
67
     *
68
     * @return Pheanstalk
69
     */
70
    public function setCurrentClass(PheanstalkInterface $currentClass): PheanstalkInterface
71
    {
72
        $this->currentClass = $currentClass;
73
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this returns the type Pyrowman\PheanstalkBundle\Proxy\PheanstalkProxy which is incompatible with the documented return type Pheanstalk\Pheanstalk.
Loading history...
74
    }
75
76
    /**
77
     * {@inheritDoc}
78
     */
79 1
    public function delete(Workflow $workflow)
80
    {
81 1
        $this->dispatch(new CommandEvent($this, ['workflow' => $workflow]), CommandEvent::DELETE);
82
83 1
        $this->pheanstalk->delete($workflow);
84
85 1
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this returns the type Pyrowman\PheanstalkBundle\Proxy\PheanstalkProxy which is incompatible with the return type mandated by Pheanstalk\PheanstalkInterface::delete() of boolean.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
86
    }
87
88
    /**
89
     * {@inheritDoc}
90
     */
91 1
    public function workflowExists($name)
92
    {
93 1
        $this->dispatch(new CommandEvent($this, ['name' => $name]), CommandEvent::WORKFLOW_EXISTS);
94
95 1
        return $this->pheanstalk->workflowExists($name);
96
    }
97
98
    /**
99
     * {@inheritDoc}
100
     */
101 1
    public function getWorkflow(Workflow $workflow)
102
    {
103 1
        $this->dispatch(new CommandEvent($this, ['workflow' => $workflow]), CommandEvent::TASK_EXISTS);
104
105 1
        return $this->pheanstalk->getWorkflow($workflow);
106
    }
107
108
    /**
109
     * {@inheritDoc}
110
     */
111 1
    public function getWorkflowInstances(?Workflow $workflow = null, ?string $status = null)
112
    {
113 1
        $this->dispatch(new CommandEvent($this, [
114 1
            'workflow'  => $workflow,
115 1
            'status'    => $status
116 1
        ]), CommandEvent::WORKFLOW_INSTANCES);
117
118
119 1
        return $this->pheanstalk->getWorkflowInstances($workflow, $status);
120
    }
121
122
    /**
123
     * {@inheritDoc}
124
     */
125 1
    public function getWorkflowInstancesDetails(WorkflowInstance $workflowInstance)
126
    {
127 1
        $this->dispatch(new CommandEvent($this, ['workflowInstance'  => $workflowInstance]),
128 1
            CommandEvent::WORKFLOW_INSTANCES_DETAILS);
129
130 1
        return $this->pheanstalk->getWorkflowInstancesDetails($workflowInstance);
131
    }
132
133
    /**
134
     * {@inheritDoc}
135
     */
136 1
    public function tubeExists($name)
137
    {
138 1
        $this->dispatch(new CommandEvent($this, ['name' => $name]), CommandEvent::TUBE_EXISTS);
139
140 1
        return $this->pheanstalk->tubeExists($name);
141
    }
142
143
    /**
144
     * {@inheritDoc}
145
     */
146 1
    public function listTubes()
147
    {
148 1
        $this->dispatch(new CommandEvent($this), CommandEvent::LIST_TUBES);
149
150 1
        return $this->pheanstalk->listTubes();
151
    }
152
153
    /**
154
     * {@inheritDoc}
155
     */
156 1
    public function peek()
157
    {
158 1
        $this->dispatch(new CommandEvent($this), CommandEvent::PEEK);
159
160 1
        return $this->pheanstalk->peek();
161
    }
162
163
    /**
164
     * {@inheritDoc}
165
     */
166 1
    public function put(Workflow $workflow)
167
    {
168 1
        $this->dispatch(new CommandEvent($this, ['workflow' => $workflow]), CommandEvent::PUT);
169
170 1
        return $this->pheanstalk->put($workflow);
171
    }
172
173
    /**
174
     * {@inheritDoc}
175
     */
176 1
    public function statsTube(Tube $tube)
177
    {
178 1
        $this->dispatch(new CommandEvent($this, ['tube' => $tube]), CommandEvent::STATS_TUBE);
179
180 1
        return $this->pheanstalk->statsTube($tube);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->pheanstalk->statsTube($tube) returns the type array which is incompatible with the return type mandated by Pheanstalk\PheanstalkInterface::statsTube() of object.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
181
    }
182
183
    /**
184
     * {@inheritDoc}
185
     */
186 2
    public function stats()
187
    {
188 2
        $this->dispatch(new CommandEvent($this), CommandEvent::STATS);
189
190 2
        return $this->pheanstalk->stats();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->pheanstalk->stats() returns the type array which is incompatible with the return type mandated by Pheanstalk\PheanstalkInterface::stats() of object.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
191
    }
192
193
    /**
194
     * @return EventDispatcherInterface
195
     */
196
    public function getDispatcher()
197
    {
198
        return $this->dispatcher;
199
    }
200
201
    /**
202
     * @param EventDispatcherInterface $dispatch
203
     */
204 25
    public function setDispatcher(EventDispatcherInterface $dispatch)
205
    {
206 25
        $this->dispatcher = $dispatch;
207
    }
208
209
    /**
210
     * {@inheritDoc}
211
     */
212 1
    public function getPheanstalk()
213
    {
214 1
        return $this->pheanstalk;
215
    }
216
217
    /**
218
     * {@inheritDoc}
219
     */
220 27
    public function setPheanstalk(PheanstalkInterface $pheanstalk)
221
    {
222 27
        $this->pheanstalk = $pheanstalk;
0 ignored issues
show
Documentation Bug introduced by
$pheanstalk is of type Pheanstalk\PheanstalkInterface, but the property $pheanstalk was declared to be of type Pheanstalk\Pheanstalk. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
223 27
        $this->pheanstalk->setCurrentClass($this);
224
225 27
        return $this;
226
    }
227
228
    /**
229
     * {@inheritDoc}
230
     */
231
    public function getName()
232
    {
233
        return $this->name;
234
    }
235
236
    /**
237
     * {@inheritDoc}
238
     */
239 1
    public function setName($name)
240
    {
241 1
        $this->name = $name;
242
243 1
        return $this;
244
    }
245
246
    /**
247
     * {@inheritdoc}
248
     */
249 2
    public function create(Workflow $workflow, $force = false): Workflow
250
    {
251 2
        $this->dispatch(new CommandEvent($this, ['workflow' => $workflow]), CommandEvent::CREATE_WORKFLOW);
252
253 2
        $workflow = $this->pheanstalk->create($workflow);
254 2
        return $workflow;
255
    }
256
257
    /**
258
     * {@inheritdoc}
259
     */
260 1
    public function update(Workflow $workflow): Workflow
261
    {
262 1
        $this->dispatch(new CommandEvent($this, ['workflow' => $workflow]), CommandEvent::UPDATE_WORKFLOW);
263
264 1
        return $this->pheanstalk->update($workflow);
265
    }
266
267
    /**
268
     * {@inheritdoc}
269
     */
270 1
    public function createSchedule(Schedule $schedule)
271
    {
272 1
        $this->dispatch(new CommandEvent($this, [
273 1
                'schedule'  => $schedule,
274 1
            ]), CommandEvent::CREATE_SCHEDULE);
275
276 1
        $workflowSchedule = $this->pheanstalk->createSchedule($schedule);
277 1
        return $workflowSchedule;
278
    }
279
280
    /**
281
     * {@inheritdoc}
282
     */
283 1
    public function deleteSchedule(Schedule $schedule)
284
    {
285 1
            $this->dispatch(new CommandEvent($this, [
286 1
                'schedule'  => $schedule,
287 1
            ]), CommandEvent::DELETE_SCHEDULE);
288
289 1
        return $this->pheanstalk->deleteSchedule($schedule);
290
    }
291
292
    /**
293
     * {@inheritdoc}
294
     */
295 1
    public function getSchedule(int $schedule)
296
    {
297 1
        $this->dispatch(new CommandEvent($this, [
298 1
                'schedule'  => $schedule,
299 1
            ]), CommandEvent::GET_SCHEDULE);
300
301 1
        return $this->pheanstalk->getSchedule($schedule);
302
    }
303
304
    /**
305
     * {@inheritdoc}
306
     */
307 1
    public function updateSchedule(Schedule $schedule): Schedule
308
    {
309 1
        $this->dispatch(new CommandEvent($this, [
310 1
                'schedule'  => $schedule,
311 1
            ]), CommandEvent::UPDATE_SCHEDULE);
312
313 1
        return $this->pheanstalk->updateSchedule($schedule);
314
    }
315
316
    /**
317
     * {@inheritdoc}
318
     */
319 1
    public function listSchedules()
320
    {
321 1
        $this->dispatch(new CommandEvent($this, []), CommandEvent::LIST_SCHEDULE);
322
323 1
        return $this->pheanstalk->listSchedules();
324
    }
325
326
    /**
327
     * {@inheritdoc}
328
     */
329 1
    public function createTask(string $name, string $group, string $path, $queue = 'default', $useAgent = false, $user = null, $host = null, $comment = null): Workflow
330
    {
331 1
        $this->dispatch(new CommandEvent($this, [
332 1
            'name'      => $name,
333 1
            'group'     => $group,
334 1
            'path'      => $path,
335 1
            'queue'     => $queue,
336 1
            'useAgent'  => $useAgent,
337 1
            'user'      => $user,
338 1
            'host'      => $host,
339 1
            'comment'   => $comment
340 1
        ]), CommandEvent::CREATE_TASK);
341
342
343 1
        return $this->pheanstalk->createTask($name, $group, $path, $queue, $useAgent, $user, $host, $comment);
344
    }
345
346
    /**
347
     * {@inheritdoc}
348
     */
349 1
    public function createTube(Tube $tube): Tube
350
    {
351 1
        $this->dispatch(new CommandEvent($this, ['tube' => $tube]), CommandEvent::CREATE_TUBE);
352
353 1
        return $this->pheanstalk->createTube($tube);
354
    }
355
356
    /**
357
     * {@inheritdoc}
358
     */
359 1
    public function updateTube(Tube $tube): Tube
360
    {
361 1
        $this->dispatch(new CommandEvent($this, ['tube' => $tube]), COmmandEvent::CREATE_TUBE);
362
363 1
        return $this->pheanstalk->updateTube($tube);
364
    }
365
366
    /**
367
     * {@inheritdoc}
368
     */
369 1
    public function cancel(WorkflowInstance $workflowInstance)
370
    {
371 1
        $this->dispatch(new CommandEvent($this, ['workflowInstance' => $workflowInstance]), COmmandEvent::CANCEL);
372
373 1
        return $this->pheanstalk->cancel($workflowInstance);
374
    }
375
376 1
    public function kill(WorkflowInstance $workflowInstance, TaskInstance $taskInstance)
377
    {
378 1
        $this->dispatch(new CommandEvent($this, ['workflowInstance' => $workflowInstance, 'taskInstance' => $taskInstance]), COmmandEvent::CANCEL);
379
380 1
        return $this->pheanstalk->kill($workflowInstance, $taskInstance);
381
    }
382
383 25
    protected function dispatch(CommandEvent $commandEvent, string $eventName = null)
384
    {
385 25
        if ($this->dispatcher) {
386 25
            $this->dispatcher->dispatch($commandEvent, $eventName);
0 ignored issues
show
Unused Code introduced by
The call to Symfony\Contracts\EventD...erInterface::dispatch() has too many arguments starting with $eventName. ( Ignorable by Annotation )

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

386
            $this->dispatcher->/** @scrutinizer ignore-call */ 
387
                               dispatch($commandEvent, $eventName);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
387
        }
388
    }
389
}
390