duplicated the DebugClassLoader in the Debug component
This commit is contained in:
parent
32947b2fc8
commit
d146461250
@ -1,6 +1,11 @@
|
|||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
2.4.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* deprecated the DebugClassLoader as it has been moved to the Debug component instead
|
||||||
|
|
||||||
2.3.0
|
2.3.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -22,6 +22,8 @@ namespace Symfony\Component\ClassLoader;
|
|||||||
* @author Christophe Coevoet <stof@notk.org>
|
* @author Christophe Coevoet <stof@notk.org>
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
|
*
|
||||||
|
* @deprecated Deprecated since version 2.4, to be removed in 3.0. Use the DebugClassLoader provided by the Debug component instead.
|
||||||
*/
|
*/
|
||||||
class DebugClassLoader
|
class DebugClassLoader
|
||||||
{
|
{
|
||||||
|
@ -4,6 +4,7 @@ CHANGELOG
|
|||||||
2.4.0
|
2.4.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
* added a DebugClassLoader able to wrap any autoloader providing a findFile method
|
||||||
* improved error messages for not found classes and functions
|
* improved error messages for not found classes and functions
|
||||||
|
|
||||||
2.3.0
|
2.3.0
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Debug;
|
namespace Symfony\Component\Debug;
|
||||||
|
|
||||||
use Symfony\Component\ClassLoader\DebugClassLoader;
|
use Symfony\Component\Debug\DebugClassLoader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers all the debug tools.
|
* Registers all the debug tools.
|
||||||
@ -51,8 +51,6 @@ class Debug
|
|||||||
ini_set('display_errors', 1);
|
ini_set('display_errors', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (class_exists('Symfony\Component\ClassLoader\DebugClassLoader')) {
|
DebugClassLoader::enable();
|
||||||
DebugClassLoader::enable();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
133
src/Symfony/Component/Debug/DebugClassLoader.php
Normal file
133
src/Symfony/Component/Debug/DebugClassLoader.php
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Debug;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Autoloader checking if the class is really defined in the file found.
|
||||||
|
*
|
||||||
|
* The ClassLoader will wrap all registered autoloaders providing a
|
||||||
|
* findFile method and will throw an exception if a file is found but does
|
||||||
|
* not declare the class.
|
||||||
|
*
|
||||||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
|
* @author Christophe Coevoet <stof@notk.org>
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
class DebugClassLoader
|
||||||
|
{
|
||||||
|
private $classFinder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param object $classFinder
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function __construct($classFinder)
|
||||||
|
{
|
||||||
|
$this->classFinder = $classFinder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the wrapped class loader.
|
||||||
|
*
|
||||||
|
* @return object a class loader instance
|
||||||
|
*/
|
||||||
|
public function getClassLoader()
|
||||||
|
{
|
||||||
|
return $this->classFinder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces all autoloaders implementing a findFile method by a DebugClassLoader wrapper.
|
||||||
|
*/
|
||||||
|
public static function enable()
|
||||||
|
{
|
||||||
|
if (!is_array($functions = spl_autoload_functions())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($functions as $function) {
|
||||||
|
spl_autoload_unregister($function);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($functions as $function) {
|
||||||
|
if (is_array($function) && !$function[0] instanceof self && method_exists($function[0], 'findFile')) {
|
||||||
|
$function = array(new static($function[0]), 'loadClass');
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_autoload_register($function);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables the wrapping.
|
||||||
|
*/
|
||||||
|
public static function disable()
|
||||||
|
{
|
||||||
|
if (!is_array($functions = spl_autoload_functions())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($functions as $function) {
|
||||||
|
spl_autoload_unregister($function);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($functions as $function) {
|
||||||
|
if (is_array($function) && $function[0] instanceof self) {
|
||||||
|
$function[0] = $function[0]->getClassLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_autoload_register($function);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds a file by class name
|
||||||
|
*
|
||||||
|
* @param string $class A class name to resolve to file
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function findFile($class)
|
||||||
|
{
|
||||||
|
return $this->classFinder->findFile($class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the given class or interface.
|
||||||
|
*
|
||||||
|
* @param string $class The name of the class
|
||||||
|
*
|
||||||
|
* @return Boolean|null True, if loaded
|
||||||
|
*
|
||||||
|
* @throws \RuntimeException
|
||||||
|
*/
|
||||||
|
public function loadClass($class)
|
||||||
|
{
|
||||||
|
if ($file = $this->classFinder->findFile($class)) {
|
||||||
|
require $file;
|
||||||
|
|
||||||
|
if (!class_exists($class, false) && !interface_exists($class, false) && (!function_exists('trait_exists') || !trait_exists($class, false))) {
|
||||||
|
if (false !== strpos($class, '/')) {
|
||||||
|
throw new \RuntimeException(sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class));
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,10 +9,9 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Symfony\Component\ClassLoader\Tests;
|
namespace Symfony\Component\Debug\Tests;
|
||||||
|
|
||||||
use Symfony\Component\ClassLoader\ClassLoader;
|
use Symfony\Component\Debug\DebugClassLoader;
|
||||||
use Symfony\Component\ClassLoader\DebugClassLoader;
|
|
||||||
|
|
||||||
class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
|
class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
@ -41,12 +40,27 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$reflProp = $reflClass->getProperty('classFinder');
|
$reflProp = $reflClass->getProperty('classFinder');
|
||||||
$reflProp->setAccessible(true);
|
$reflProp->setAccessible(true);
|
||||||
|
|
||||||
$this->assertNotInstanceOf('Symfony\Component\ClassLoader\DebugClassLoader', $reflProp->getValue($function[0]));
|
$this->assertNotInstanceOf('Symfony\Component\Debug\DebugClassLoader', $reflProp->getValue($function[0]));
|
||||||
|
|
||||||
|
DebugClassLoader::disable();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new \Exception('DebugClassLoader did not register');
|
DebugClassLoader::disable();
|
||||||
|
|
||||||
|
$this->fail('DebugClassLoader did not register');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ClassLoader
|
||||||
|
{
|
||||||
|
public function loadClass($class)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function findFile($class)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -24,8 +24,7 @@
|
|||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"symfony/http-foundation": "",
|
"symfony/http-foundation": "",
|
||||||
"symfony/http-kernel": "",
|
"symfony/http-kernel": ""
|
||||||
"symfony/class-loader": ""
|
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-0": { "Symfony\\Component\\Debug\\": "" }
|
"psr-0": { "Symfony\\Component\\Debug\\": "" }
|
||||||
|
Reference in New Issue
Block a user