Вход Регистрация
Файл: vendor/intervention/image/src/Drivers/AbstractDriver.php
Строк: 177
<?php

declare(strict_types=1);

namespace 
InterventionImageDrivers;

use 
InterventionImageConfig;
use 
InterventionImageExceptionsDriverException;
use 
InterventionImageExceptionsNotSupportedException;
use 
InterventionImageInputHandler;
use 
InterventionImageInterfacesAnalyzerInterface;
use 
InterventionImageInterfacesColorInterface;
use 
InterventionImageInterfacesDecoderInterface;
use 
InterventionImageInterfacesDriverInterface;
use 
InterventionImageInterfacesEncoderInterface;
use 
InterventionImageInterfacesImageInterface;
use 
InterventionImageInterfacesModifierInterface;
use 
InterventionImageInterfacesSpecializableInterface;
use 
InterventionImageInterfacesSpecializedInterface;
use 
ReflectionClass;

abstract class 
AbstractDriver implements DriverInterface
{
    
/**
     * Driver options
     */
    
protected Config $config;

    
/**
     * @throws DriverException
     * @return void
     */
    
public function __construct()
    {
        
$this->config = new Config();
        
$this->checkHealth();
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::config()
     */
    
public function config(): Config
    
{
        return 
$this->config;
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::handleInput()
     */
    
public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface
    
{
        return 
InputHandler::withDecoders($decoders$this)->handle($input);
    }

    
/**
     * {@inheritdoc}
     *
     * @see DriverInterface::specialize()
     */
    
public function specialize(
        
ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface $object
    
): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface {
        
// return object directly if no specializing is possible
        
if (!($object instanceof SpecializableInterface)) {
            return 
$object;
        }

        
// return directly and only attach driver if object is already specialized
        
if ($object instanceof SpecializedInterface) {
            
$object->setDriver($this);

            return 
$object;
        }

        
// resolve classname for specializable object
        
$driver_namespace = (new ReflectionClass($this))->getNamespaceName();
        
$object_path substr($object::class, strlen("Intervention\Image\"));
        
$specialized_classname = $driver_namespace . "\" . $object_path;

        if (!class_exists(
$specialized_classname)) {
            throw new NotSupportedException(
                "
Class '" . $object_path . "' is not supported by " . $this->id() . " driver."
            );
        }

        // create a driver specialized object with the specializable properties of generic object
        
$specialized = new $specialized_classname(...$object->specializable());

        // attach driver
        return 
$specialized->setDriver($this);
    }

    /**
     * {@inheritdoc}
     *
     * @throws NotSupportedException
     * @throws DriverException
     * @see DriverInterface::specializeMultiple()
     */
    public function specializeMultiple(array 
$objects): array
    {
        return array_map(
            function (string|object 
$object): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface {
                return 
$this->specialize(
                    match (true) {
                        is_string(
$object) => new $object(),
                        is_object(
$object) => $object,
                    }
                );
            },
            
$objects
        );
    }
}
Онлайн: 2
Реклама