first commit
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
/**
|
||||
* Akeeba Engine
|
||||
*
|
||||
* @package akeebaengine
|
||||
* @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
|
||||
* @license GNU General Public License version 3, or later
|
||||
*/
|
||||
|
||||
namespace Akeeba\Engine\Postproc\Exception;
|
||||
|
||||
defined('AKEEBAENGINE') || die();
|
||||
|
||||
use Akeeba\Engine\Postproc\Base;
|
||||
use Exception;
|
||||
use RuntimeException;
|
||||
use Throwable;
|
||||
|
||||
class EngineException extends RuntimeException
|
||||
{
|
||||
protected $messagePrototype = 'The %s post-processing engine has experienced an unspecified error.';
|
||||
|
||||
/**
|
||||
* Construct the exception. If a message is not defined the default message for the exception will be used.
|
||||
*
|
||||
* @param string $message [optional] The Exception message to throw.
|
||||
* @param int $code [optional] The Exception code.
|
||||
* @param Exception|Throwable $previous [optional] The previous throwable used for the exception chaining.
|
||||
*/
|
||||
public function __construct($message = "", $code = 0, $previous = null)
|
||||
{
|
||||
if (empty($message))
|
||||
{
|
||||
$engineName = $this->getEngineKeyFromBacktrace();
|
||||
$message = sprintf($this->messagePrototype, $engineName);
|
||||
}
|
||||
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the engine name (class name without the namespace) from the PHP execution backtrace.
|
||||
*
|
||||
* @return mixed|string
|
||||
*/
|
||||
protected function getEngineKeyFromBacktrace()
|
||||
{
|
||||
// Make sure the backtrace is at least 3 levels deep
|
||||
$backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 5);
|
||||
|
||||
// We need to be at least two levels deep
|
||||
if (count($backtrace) < 2)
|
||||
{
|
||||
return 'current';
|
||||
}
|
||||
|
||||
for ($i = 1; $i < count($backtrace); $i++)
|
||||
{
|
||||
// Get the fully qualified class
|
||||
$object = $backtrace[$i]['object'];
|
||||
|
||||
// We need a backtrace element with an object attached.
|
||||
if (!is_object($object))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the object is not a Postproc\Base object go to the next entry.
|
||||
if (!($object instanceof Base))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the bare class name
|
||||
$fqnClass = $backtrace[$i]['class'];
|
||||
$parts = explode('\\', $fqnClass);
|
||||
$bareClass = array_pop($parts);
|
||||
|
||||
// Do not return the base object!
|
||||
if ($bareClass == 'Base')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
return $bareClass;
|
||||
}
|
||||
|
||||
return 'current';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user