mercredi 7 février 2018

Dependency Injection with Adapter Pattern and Type Hinting

I'm trying to get my head around type hinting in combination with adapters.

The system fetches XML feeds via different services and updates the database with the changes - I am refactoring to help learn design patterns.

Log Interface:

interface LoggerAdapterInterface {
    public function debug($string);
    public function info($string);
    public function error($string);
}

MonoLog Adapter

class MonoLogAdapter implements LoggerAdapterInterface
{
    public $logger;

    public function __construct(\Monolog\Logger $logger)
    {
        $this->logger = $logger;
    }

    public function debug($string)
    {
        $this->logger->debug($string);
    }

    public function info($string)
    {
        $this->logger->info($string);
    }

    public function error($string)
    {
        $this->logger->error($string);
    }
}

FeedFactory

class FeedFactory
{
    public function __construct()
    {

    }

    public static function build(LoggerAdapter $logger, $feedType)
    {
        // eg, $feedType = 'Xml2u'
        $className = 'Feed' . ucfirst($feedType);

        // eg, returns FeedXml2u
        return new $className($logger);
    }
}

Implementation

// get mono logger
$monoLogger = $this->getLogger();

// create adapter and inject monologger
$loggerAdapter = new MonoLogAdapter($monoLogger);

// build feed object
$Feed = FeedFactory::build($loggerAdapter, 'Xml2u');

Error

PHP Catchable fatal error:  Argument 1 passed to FeedFactory::build() 
must be an instance of LoggerAdapter, instance of MonoLogAdapter 
given, called in /src/shell/feedShell.php on line 64 and defined in 
/src/Feeds/FeedFactory.php on line 25

So I am using the LoggerAdapter so that I am not tied to one logging platform. The problem is that when I create a new instance of MonoLogger and try to inject it into the factory - PHP type-hinting does not realize that MonoLogger implements LoggerAdapter.

Am I doing something wrong here?

Aucun commentaire:

Enregistrer un commentaire