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\Generator\Dumper ;
/**
* PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes .
*
* @ author Fabien Potencier < fabien @ symfony . com >
* @ author Tobias Schultze < http :// tobion . de >
*/
class PhpGeneratorDumper extends GeneratorDumper
{
/**
* Dumps a set of routes to a PHP class .
*
* Available options :
*
* * class : The class name
* * base_class : The base class name
*
* @ param array $options An array of options
*
* @ return string A PHP class representing the generator class
*/
public function dump ( array $options = array ())
{
$options = array_merge ( array (
'class' => 'ProjectUrlGenerator' ,
'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator' ,
), $options );
return <<< EOF
< ? php
use Symfony\Component\Routing\RequestContext ;
use Symfony\Component\Routing\Exception\RouteNotFoundException ;
use Psr\Log\LoggerInterface ;
/**
* { $options [ 'class' ]}
*
* This class has been auto - generated
* by the Symfony Routing Component .
*/
class { $ options [ 'class' ]} extends { $options [ 'base_class' ]}
{
2016-04-20 09:56:34 -07:00
private static \ $declaredRoutes ;
2015-08-17 17:00:26 -07:00
/**
* Constructor .
*/
public function __construct ( RequestContext \ $context , LoggerInterface \ $logger = null )
{
\ $this -> context = \ $context ;
\ $this -> logger = \ $logger ;
2016-04-20 09:56:34 -07:00
if ( null === self :: \ $declaredRoutes ) {
self :: \ $declaredRoutes = { $this -> generateDeclaredRoutes ()};
}
2015-08-17 17:00:26 -07:00
}
{ $this -> generateGenerateMethod ()}
}
EOF ;
}
/**
* Generates PHP code representing an array of defined routes
* together with the routes properties ( e . g . requirements ) .
*
* @ return string PHP code
*/
private function generateDeclaredRoutes ()
{
$routes = " array( \n " ;
foreach ( $this -> getRoutes () -> all () as $name => $route ) {
$compiledRoute = $route -> compile ();
$properties = array ();
$properties [] = $compiledRoute -> getVariables ();
$properties [] = $route -> getDefaults ();
$properties [] = $route -> getRequirements ();
$properties [] = $compiledRoute -> getTokens ();
$properties [] = $compiledRoute -> getHostTokens ();
$properties [] = $route -> getSchemes ();
$routes .= sprintf ( " '%s' => %s, \n " , $name , str_replace ( " \n " , '' , var_export ( $properties , true )));
}
$routes .= ' )' ;
return $routes ;
}
/**
* Generates PHP code representing the `generate` method that implements the UrlGeneratorInterface .
*
* @ return string PHP code
*/
private function generateGenerateMethod ()
{
2016-04-20 09:56:34 -07:00
return <<< 'EOF'
public function generate ( $name , $parameters = array (), $referenceType = self :: ABSOLUTE_PATH )
2015-08-17 17:00:26 -07:00
{
2016-04-20 09:56:34 -07:00
if ( ! isset ( self :: $declaredRoutes [ $name ])) {
throw new RouteNotFoundException ( sprintf ( 'Unable to generate a URL for the named route "%s" as such route does not exist.' , $name ));
2015-08-17 17:00:26 -07:00
}
2016-04-20 09:56:34 -07:00
list ( $variables , $defaults , $requirements , $tokens , $hostTokens , $requiredSchemes ) = self :: $declaredRoutes [ $name ];
2015-08-17 17:00:26 -07:00
2016-04-20 09:56:34 -07:00
return $this -> doGenerate ( $variables , $defaults , $requirements , $tokens , $parameters , $name , $referenceType , $hostTokens , $requiredSchemes );
2015-08-17 17:00:26 -07:00
}
EOF ;
}
}