Completed
Pull Request — master (#4)
by dan
14:39
created

Broadcast/Broadcaster.php (1 issue)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace IrishDan\NotificationBundle\Broadcast;
4
5
use IrishDan\NotificationBundle\Channel\ChannelInterface;
6
use IrishDan\NotificationBundle\Notification\NotifiableInterface;
7
use IrishDan\NotificationBundle\Notification\NotificationInterface;
8
9
/**
10
 * Class Broadcaster
11
 *
12
 * @package IrishDan\NotificationBundle\Broadcast
13
 */
14
class Broadcaster
15
{
16
    protected $notifiable;
17
    protected $channel;
18
    protected $config;
19
    protected $channelName;
20
21
    /**
22
     * Broadcaster constructor.
23
     *
24
     * @param NotifiableInterface $notifiable
25
     * @param ChannelInterface    $channel
26
     * @param array               $config
27
     */
28
    public function __construct(NotifiableInterface $notifiable, ChannelInterface $channel, array $config)
29
    {
30
        // Set the data for Slack Broadcasts
31
        if (!empty($config['webhook'])) {
32
            $notifiable->setSlackWebhook($config['webhook']);
33
        }
34
35
        // Set data for pusher broadcasts
36
        if (!empty($config['channel_name'])) {
37
            $notifiable->setPusherChannel($config['channel_name']);
38
        }
39
40
        $this->notifiable = $notifiable;
41
        $this->channel = $channel;
42
        $this->config = $config;
43
        $this->channelName = $channel->channelName();
44
    }
45
46
    /**
47
     * @param NotificationInterface $notification
48
     */
49
    public function broadcast(NotificationInterface $notification)
50
    {
51
        $notification->setNotifiable($this->notifiable);
52
        $notification->setChannel($this->channelName);
53
54
        // Format and send the broadcast.
55
        $this->channel->setDispatchAsEvent(false);
0 ignored issues
show
It seems like you code against a concrete implementation and not the interface IrishDan\NotificationBun...hannel\ChannelInterface as the method setDispatchAsEvent() does only exist in the following implementations of said interface: IrishDan\NotificationBundle\Channel\Channel.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
56
        $this->channel->formatAndDispatch($notification);
57
    }
58
}