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\Config\Resource\DirectoryResource ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Routing\RouteCollection ;
2015-08-17 17:00:26 -07:00
/**
* 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 )
{
2018-11-23 12:29:20 +00:00
if ( ! is_dir ( $dir = $this -> locator -> locate ( $path ))) {
return parent :: supports ( $path , $type ) ? parent :: load ( $path , $type ) : new RouteCollection ();
}
2015-08-17 17:00:26 -07:00
$collection = new RouteCollection ();
$collection -> addResource ( new DirectoryResource ( $dir , '/\.php$/' ));
2017-04-13 15:53:35 +01:00
$files = iterator_to_array ( new \RecursiveIteratorIterator (
2018-11-23 12:29:20 +00:00
new \RecursiveCallbackFilterIterator (
new \RecursiveDirectoryIterator ( $dir , \FilesystemIterator :: SKIP_DOTS | \FilesystemIterator :: FOLLOW_SYMLINKS ),
2017-04-13 15:53:35 +01:00
function ( \SplFileInfo $current ) {
return '.' !== substr ( $current -> getBasename (), 0 , 1 );
}
),
\RecursiveIteratorIterator :: LEAVES_ONLY
));
2015-08-17 17:00:26 -07:00
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 )
{
2018-11-23 12:29:20 +00:00
if ( 'annotation' === $type ) {
return true ;
}
if ( $type || ! \is_string ( $resource )) {
2016-04-20 09:56:34 -07:00
return false ;
}
2017-02-02 16:28:38 -08:00
2015-08-17 17:00:26 -07:00
try {
2018-11-23 12:29:20 +00:00
return is_dir ( $this -> locator -> locate ( $resource ));
2015-08-17 17:00:26 -07:00
} catch ( \Exception $e ) {
return false ;
}
2017-04-13 15:53:35 +01:00
}
}