客户Symfony2框架中的多阶段路由

时间:2015-01-29 16:43:05

标签: php symfony

我想要做的是将/{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框架的项目。

1 个答案:

答案 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)