2015-08-17 17:00:26 -07:00
< ? 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\Routing\Loader ;
use Symfony\Component\Routing\RouteCollection ;
use Symfony\Component\Config\Resource\DirectoryResource ;
/**
* AnnotationDirectoryLoader loads routing information from annotations set
* on PHP classes and methods .
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
class AnnotationDirectoryLoader extends AnnotationFileLoader
{
/**
* Loads from annotations from a directory .
*
* @ param string $path A directory path
* @ param string | null $type The resource type
*
* @ return RouteCollection A RouteCollection instance
*
* @ throws \InvalidArgumentException When the directory does not exist or its routes cannot be parsed
*/
public function load ( $path , $type = null )
{
$dir = $this -> locator -> locate ( $path );
$collection = new RouteCollection ();
$collection -> addResource ( new DirectoryResource ( $dir , '/\.php$/' ));
$files = iterator_to_array ( new \RecursiveIteratorIterator ( new \RecursiveDirectoryIterator ( $dir ), \RecursiveIteratorIterator :: LEAVES_ONLY ));
usort ( $files , function ( \SplFileInfo $a , \SplFileInfo $b ) {
return ( string ) $a > ( string ) $b ? 1 : - 1 ;
});
foreach ( $files as $file ) {
if ( ! $file -> isFile () || '.php' !== substr ( $file -> getFilename (), - 4 )) {
continue ;
}
if ( $class = $this -> findClass ( $file )) {
$refl = new \ReflectionClass ( $class );
if ( $refl -> isAbstract ()) {
continue ;
}
$collection -> addCollection ( $this -> loader -> load ( $class , $type ));
}
}
return $collection ;
}
/**
* { @ inheritdoc }
*/
public function supports ( $resource , $type = null )
{
2016-04-20 09:56:34 -07:00
if ( ! is_string ( $resource )) {
return false ;
}
2017-02-02 16:28:38 -08:00
2015-08-17 17:00:26 -07:00
try {
$path = $this -> locator -> locate ( $resource );
} catch ( \Exception $e ) {
return false ;
}
2016-04-20 09:56:34 -07:00
return is_dir ( $path ) && ( ! $type || 'annotation' === $type );
2015-08-17 17:00:26 -07:00
}
}