我想要做的是将/{id}
分隔到它自己的路由表中,所以如果省略它,我可以设置一个默认ID并使用相同的路由表。
的index.php:
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
$routes = new RouteCollection();
$routes->add('month_view', new Route('/{id}/month/{year}/{month}',
array('_controller' => function(Request $request) {
$id = $request->get('id'
$year = $request->get('year');
$month = $request->get('month');
return MonthController::showAction($id, $year, $month);
})));
$routes->add('day_view', new Route('/{id}/day/{year}/{month}/{day}',
array('_controller' => function(Request $request) {
$id = $request->get('id');
$year = $request->get('year');
$month = $request->get('month');
$day = $request->get('day');
return DayController::showAction($id, $year, $month, $day);
})));
$framework = new Framework($routes);
$framework->handle(Request::createFromGlobals())->send();
Framework.php:
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\HttpKernel;
use Symfony\Component\EventDispatcher\EventDispatcher;
class Framework extends HttpKernel\HttpKernel
{
public function __construct($routes)
{
$context = new RequestContext();
$matcher = new UrlMatcher($routes, $context);
$resolver = new HttpKernel\Controller\ControllerResolver();
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new HttpKernel\EventListener\RouterListener($matcher));
$dispatcher->addSubscriber(new HttpKernel\EventListener\ResponseListener('UTF-8'));
parent::__construct($dispatcher, $resolver);
}
}
这适用于使用Symfony2组件但不使用整个Symfony2框架的项目。
答案 0 :(得分:0)
您可能需要考虑3个选项:
1
最简单的解决方案是使用关键字作为id,因此url可能看起来像
/default/month/2015/12
那么你会认识到$id == 'default'
中的showAction
并使用某个默认ID来显示数据这一事实
2
与1.相同,但您不会检查$id == 'default'
中是否showAction
,而是为网址创建showDefaultAction
/month/{year}/{month}
(无id参数)
3
再次基于1.但是你要添加2个路由:/{id}/month/{year}/{month}
一个需要$ id为整数,另一个需要一个字符串('default'选项),然后你可以引导它们两个不同的动作(show / showDefault)