nercury / object-router
允许创建和管理对象的友好路由。需要 doctrine-orm 来存储路由。
v1.2.5
2014-03-13 07:31 UTC
Requires
- php: >=5.3.2
- doctrine/orm: >=2.1.0
- sensio/framework-extra-bundle: >=2.0.0
- symfony/symfony: >=2.1
README
允许创建和管理对象的友好路由。提供了一种管理路由重定向的方法。具有独特的 slug 生成器。
- 这是一个从 [locale, slug] 到 [object type, id] 以及相反的映射。
- 您可以通过向 object_router 服务提供地区和 slug 来获取对象类型和 id,反之亦然。
- 路由 slug 的更改是通过 object_router 服务完成的。
- 此捆绑包已预配置了控制器,该控制器使用 object_router 配置根据对象类型加载另一个控制器和操作。您可以使用此控制器或创建自己的控制器。
- 路由解析器使用 doctrine 缓存来提高速度。
- 已测试,并与 Johannes M. Schmitt 的 i18n-routing-bundle 兼容。
安装
推荐使用 Composer 进行安装。
配置和使用
对于升级到 1.2,请阅读升级说明。
要设置到某个对象(例如产品)的路由,请设置事件监听器
<service id="my_product.object_route_listener" class="%my_product.object_route_listener.class%"> <tag name="kernel.event_listener" event="object_router.get_response" method="onRouteResponseGetEvent" /> <!-- setters --> </service>
根据您的需求,您可以立即返回响应(例如重定向响应、未找到响应等),或者可以将路由转发到您的控制器。一个转发服务的示例如下
use Nercury\ObjectRouterBundle\Event\ObjectRouteEvent; /** * Returns a response based on object route slug */ class ObjectRouteListener { /** * @var \Symfony\Bundle\FrameworkBundle\HttpKernel */ private $kernel; public function setKernel($kernel) { $this->kernel = $kernel; } public function onRouteResponseGetEvent(ObjectRouteEvent $event) { // if the object type is "product", handle it the specified way if ($event->getObjectType() == 'product') { $options = $event->parameters->all(); $options['productId'] = $event->getObjectId(); $event->setResponse($this->kernel->forward('MyProductBundle:Product:view', $options)); } } }
字符串 "product" 被理解为应路由到指定操作的对象类型。
要使用默认对象路由控制器发送前面提到的事件,请在 routing.yml 的末尾添加以下内容
NercuryObjectRouterBundle: resource: "@ObjectRouterBundle/Controller/" type: annotation prefix: /
它定义了最后一个路由规则为对象路由
/{slug}
它将 {page} 参数重定向到接收到的实际控制器和操作
'id' => $resolved_object_id,
要为某个对象分配路由 slug,请使用
$this->get('object_router.routing')->setSlug('product', $id, $locale, 'test-route');
当通过访问页面时,应将 URL 路由到产品操作
/test-route
您可以通过调用以下内容来获取产品的 URL
$this->get('object_router.routing')->generateUrl('product', $id); // get url in current locale
地区可以指定为附加参数
$this->get('object_router.routing')->generateUrl('product', $id, $locale);
分页
此外,还定义了分页路由
/{slug}/page-{page}
它将 {page} 参数重定向到接收到的实际控制器和操作
'id' => $resolved_object_id, 'page' => $page,
要获取带有页码的 URL,请使用
$this->get('object_router.routing')->generateUrlWithPage('product', $id, $page);
自定义操作
可以很容易地使用自定义操作代替提供的两个操作。更多文档请参阅 doc/custom_action.rst。
重定向
要创建到对象的重定向
$this->get('object_router.redirect')->addRedirectToObject('product', $id, $locale, $redirectFromSlug);
此外,还可以指定重定向类型(默认为永久重定向)
$this->get('object_router.redirect')->addRedirectToObject('product', $id, $locale, $redirectFromSlug, 301);
要禁用重定向,请设置此配置
object_router: controllers: []
生成器
由于对象 slug 需要是唯一的,因此有一个生成器可以自动生成和设置此类 slug。生成器可以使用任何字符串作为 slug 的来源。生成的 slug 作为字符串返回
$finalSlug = $this->get('object_router.generator')->setUniqueSlug('product', $id, $locale, 'Not unique text', true); // $finalSlug contains 'not-unique-text'