2013-10-08 120 views
3

如果我想让每个url呼叫与我在/ExplicitControllerName/ExplicitActionToRun之后定义的呼叫不同,那么路由看起来会如何。为symfony 2中的控制器/动作定义默认路由

例如一些伪代码:

default_pathing: 
    pattern: /{controller}/{action} 
    defaults: { _controller: Bundle:Default:index } 

所以,如果我去 www.example.com/Page/About

它会叫我的控制器

class Page extends Controller 
{ 
    public AboutAction() 
    { 
     // Called by above URL 
    } 
} 

这个问题没有回答:Symfony2/routing/use parameters as Controller or Action name

想象一下,我有100页有很多子路由页面,每次都做几乎相同的路由。我想为所有这100个控制器做1个路由。我们将如何做到这一点?

PS我可真要的东西,如C#.NET MVC 4.0路由中,它允许您设置一个典型的设置路由你可能有哪怕至少是其发展

回答

2

你问题并不完全清楚,但这里有一些提示。

我能想象你正在试图解决两个用例:

1)你已经有很多某种CMS页面的,像你约例如,这些页面没有太多的逻辑和公正使一些人认为,在这种情况下,你会是这样的:

class CMSPageController 
{ 
    public function renderPage($pageSlug) 
    { 
     $page = $this->cmsPageRepository->findBySlug($pageSlug); 

     // your logic to render the view 
    } 
} 

而且根据路由配置:

<route id="cms_page_view" pattern="/cms/{pageSlug}"> 
    <default key="_controller">cms_page.controller.page:renderPage</default> 
    <requirement key="_method">GET</requirement> 
    <requirement key="slug">[0-9a-zA-Z\-\.\/]+</requirement> 
</route> 

2)你有更复杂的要求,和/或遵循特异性ic模式来命名您的控制器/操作,因此您需要编写自定义UrlMatcherInterface实现。看看native implementation知道从哪里开始。它可以让你定义一个回退。

+0

干杯的人,将检查此并回馈给你! – Jimmyt1988

+0

它是一个很好的解决方案,但是你也需要保持对蠕虫的控制,因为当你有一个捕获所有控制器时,除非你的控制器非常精确,否则它基本上不可能发生404异常。 – Flosculus

+0

Flosculus,没错,但我认为OP意识到了这样的行为,通过我们可以想象的路由器匹配来自数据库的页面,并在没有找到匹配的情况下返回404。 –

0

这可以使用在讲座和方法级过度或者SensioFrameworkExtraBundle的@Route注解......

...或更多地飘逸着更少的使用说明来实现FOSRestBundle的automatic route generation与隐性资源名称。也许你需要使用一些FOSRestBundle的manual route definition annotations来更正一些生成的路线。

这两种方法最初仍然需要明确地将路由资源添加到您的app/config/routing.yml

例为进口@Route

# import routes from a controller directory 
blog: 
    resource: "@SensioBlogBundle/Controller" 
    type:  annotation 

例为进口FOSRestBundle

users: 
    type:  rest 
    resource: Acme\HelloBundle\Controller\UsersController 

你可以解决具有导入所有资源:

如果您不打算使用数百个控制器,并且没有太多的编译器通行证,自定义注释等的经验,那么只要将注册资源注册到路由配置。