tastphp/framework

View on GitHub
src/Framework/ListenerRegister/ListenerRegisterService.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace TastPHP\Framework\ListenerRegister;

use TastPHP\Framework\Config\YamlService;
use TastPHP\Framework\Container\Container;
use TastPHP\Framework\Event\MiddlewareEvent;

class ListenerRegisterService
{
    public function register(Container $app)
    {
        $app['middlewareEvent'] = function ($app) {
            return new MiddlewareEvent($app);
        };

        $this->registerKernelListeners($app);

        $listeners = $this->parseListenerConfig();

        foreach ($listeners as $listener) {
            if (empty($listener['listener']) || empty($listener['callback']) || empty($listener['event'])) {
                throw new \InvalidArgumentException("property is not defined in listener config.");
            }

            if (!class_exists($listener['listener'])) {
                throw new \Exception("Class " . $listener['listener'] . " not found !");
            }

            if (!is_callable([$listener['listener'], $listener['callback']])) {
                throw new \BadFunctionCallException('Function ' . $listener['callback'] . ' is not callable');
            }

            if (empty($listener['priority'])) {
                $listener['priority'] = 0;
            }
            $app['eventDispatcher']->addListener($listener['event'], [new $listener['listener'], $listener['callback']], $listener['priority']);
        }
    }

    private function registerKernelListeners($app)
    {
        $listeners = \Kernel::getInstance()->getListeners();
        foreach ($listeners as $eventName => $listener) {
            list($listener, $callback) = explode('@', $listener);
            if (!class_exists($listener)) {
                continue;
            }
            $app['eventDispatcher']->addListener($eventName, [new $listener(), $callback]);
        }
    }

    private function parseListenerConfig($listenerConfigAll = [])
    {
        $array = [];
        $listenersConfigs = \Config::parse('listeners');

        foreach ($listenersConfigs as $listenerConfig) {
            $resource = ($listenerConfig['resource']);

            if (is_file(__BASEDIR__ . "/src/" . $resource) && file_exists(__BASEDIR__ . "/src/" . $resource)) {
                $array = YamlService::parse(file_get_contents(__BASEDIR__ . "/src/" . $resource));
            }

            if (is_array($array)) {
                $listenerConfigAll = array_merge($listenerConfigAll, $array);
            }
        }

        return $listenerConfigAll;
    }
}