deep-web-solutions/wordpress-framework-foundations

View on GitHub
src/includes/Services/AbstractHandlerService.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace DeepWebSolutions\Framework\Foundations\Services;

use DeepWebSolutions\Framework\Foundations\DependencyInjection\ContainerAwareInterface;
use DeepWebSolutions\Framework\Foundations\Logging\LoggingService;
use DeepWebSolutions\Framework\Foundations\Logging\LoggingServiceAwareInterface;
use DeepWebSolutions\Framework\Foundations\PluginAwareInterface;
use DeepWebSolutions\Framework\Foundations\PluginInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;

\defined( 'ABSPATH' ) || exit;

/**
 * Template for encapsulating some of the most often required abilities of a handler service.
 *
 * @since   1.0.0
 * @version 1.0.0
 * @author  Antonius Hegyes <a.hegyes@deep-web-solutions.com>
 * @package DeepWebSolutions\WP-Framework\Foundations\Services
 */
abstract class AbstractHandlerService extends AbstractService implements ServiceInterface, HandlerAwareInterface {
    // region TRAITS

    use HandlerAwareTrait {
        set_handler as protected set_handler_trait;
    }

    // endregion

    // region MAGIC METHODS

    /**
     * AbstractHandlerService constructor.
     *
     * @since   1.0.0
     * @version 1.0.0
     *
     * @param   PluginInterface         $plugin             Instance of the plugin.
     * @param   LoggingService          $logging_service    Instance of the logging service.
     * @param   HandlerInterface|null   $handler            Instance of the handler used.
     */
    public function __construct( PluginInterface $plugin, LoggingService $logging_service, ?HandlerInterface $handler = null ) {
        parent::__construct( $plugin, $logging_service );
        $this->set_default_handler( $handler );
    }

    // endregion

    // region INHERITED METHODS

    /**
     * {@inheritDoc}
     *
     * @since   1.0.0
     * @version 1.0.0
     */
    public function set_handler( HandlerInterface $handler ): bool {
        if ( ! \is_a( $handler, $this->get_handler_class() ) ) {
            return false;
        }

        if ( $handler instanceof PluginAwareInterface ) {
            $handler->set_plugin( $this->get_plugin() );
        }
        if ( $handler instanceof LoggingServiceAwareInterface ) {
            $handler->set_logging_service( $this->get_logging_service() );
        }

        $this->set_handler_trait( $handler );
        return true;
    }

    // endregion

    // region HELPERS

    /**
     * Registers a default handler if one has not been set through the container.
     *
     * @since   1.0.0
     * @version 1.0.0
     *
     * @param   HandlerInterface|null       $handler    Handler passed on in the constructor.
     *
     * @throws  NotFoundExceptionInterface      Thrown if the NullLogger is not found in the plugin DI-container.
     * @throws  ContainerExceptionInterface     Thrown if some other error occurs while retrieving the NullLogger instance.
     */
    protected function set_default_handler( ?HandlerInterface $handler ): void {
        if ( ! \is_a( $handler, $this->get_handler_class() ) ) {
            $handler_class = $this->get_default_handler_class();

            if ( \is_null( $handler_class ) ) {
                $handler = null;
            } else {
                $plugin  = $this->get_plugin();
                $handler = ( $plugin instanceof ContainerAwareInterface )
                    ? $plugin->get_container()->get( $handler_class )
                    : new $handler_class();
            }
        }

        if ( ! \is_null( $handler ) ) {
            $this->set_handler( $handler );
        }
    }

    /**
     * Returns the class name of the default handler.
     *
     * @since   1.0.0
     * @version 1.0.0
     *
     * @return  string|null
     */
    protected function get_default_handler_class(): ?string {
        return null;
    }

    /**
     * Returns the class name of the used handler for better type-checking.
     *
     * @since   1.0.0
     * @version 1.0.0
     *
     * @return  string
     */
    abstract protected function get_handler_class(): string;

    // endregion
}