You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
5.1 KiB
PHP

<?php
/**
* Exception FailedToMakeInstance.
*
* @link https://www.mwpd.io/
*
* @copyright 2019 Alain Schlesser
* @license MIT
*/
/**
* Copyright 2021 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
declare(strict_types = 1);
namespace Google\Web_Stories\Exception;
use Google\Web_Stories\Infrastructure\Injector\InjectionChain;
use RuntimeException;
/**
* Exception thrown when the injector couldn't instantiate a given class or
* interface.
*
* @internal
*
* @since 1.6.0
*/
final class FailedToMakeInstance extends RuntimeException implements WebStoriesException {
// These constants are public so you can use them to find out what exactly
// happened when you catch a "FailedToMakeInstance" exception.
public const CIRCULAR_REFERENCE = 100;
public const UNRESOLVED_INTERFACE = 200;
public const UNREFLECTABLE_CLASS = 300;
public const UNRESOLVED_ARGUMENT = 400;
public const UNINSTANTIATED_SHARED_INSTANCE = 500;
public const INVALID_DELEGATE = 600;
/**
* Create a new instance of the exception for an interface or class that
* created a circular reference.
*
* @since 1.6.0
*
* @param string $interface_or_class Interface or class name that
* generated the circular
* reference.
* @param InjectionChain $injection_chain Injection chain that led to the
* circular reference.
*/
public static function for_circular_reference(
string $interface_or_class,
InjectionChain $injection_chain
): self {
$message = \sprintf(
'Circular reference detected while trying to resolve the interface or class "%s".',
$interface_or_class
);
$message .= "\nInjection chain:\n";
foreach ( $injection_chain->get_chain() as $link ) {
$message .= "{$link}\n";
}
return new self( $message, self::CIRCULAR_REFERENCE );
}
/**
* Create a new instance of the exception for an interface that could not
* be resolved to an instantiable class.
*
* @since 1.6.0
*
* @param string $interface_name Interface that was left unresolved.
*/
public static function for_unresolved_interface( string $interface_name ): self {
$message = \sprintf(
'Could not resolve the interface "%s" to an instantiable class, probably forgot to bind an implementation.',
$interface_name
);
return new self( $message, self::UNRESOLVED_INTERFACE );
}
/**
* Create a new instance of the exception for an interface or class that
* could not be reflected upon.
*
* @since 1.6.0
*
* @param string $interface_or_class Interface or class that could not be
* reflected upon.
*/
public static function for_unreflectable_class( string $interface_or_class ): self {
$message = \sprintf(
'Could not reflect on the interface or class "%s", probably not a valid FQCN.',
$interface_or_class
);
return new self( $message, self::UNREFLECTABLE_CLASS );
}
/**
* Create a new instance of the exception for an argument that could not be
* resolved.
*
* @since 1.6.0
*
* @param string $argument_name Name of the argument that could not be
* resolved.
* @param string $class_name Class that had the argument in its
* constructor.
*/
public static function for_unresolved_argument( string $argument_name, string $class_name ): self {
$message = \sprintf(
'Could not resolve the argument "%s" while trying to instantiate the class "%s".',
$argument_name,
$class_name
);
return new self( $message, self::UNRESOLVED_ARGUMENT );
}
/**
* Create a new instance of the exception for a class that was meant to be
* reused but was not yet instantiated.
*
* @since 1.6.0
*
* @param string $class_name Class that was not yet instantiated.
*/
public static function for_uninstantiated_shared_instance( string $class_name ): self {
$message = \sprintf(
'Could not retrieve the shared instance for "%s" as it was not instantiated yet.',
$class_name
);
return new self( $message, self::UNINSTANTIATED_SHARED_INSTANCE );
}
/**
* Create a new instance of the exception for a delegate that was requested
* for a class that doesn't have one.
*
* @since 1.6.0
*
* @param string $class_name Class for which there is no delegate.
*/
public static function for_invalid_delegate( string $class_name ): self {
$message = \sprintf(
'Could not retrieve a delegate for "%s", none was defined.',
$class_name
);
return new self( $message, self::INVALID_DELEGATE );
}
}