nercury/object-router

允许创建和管理对象的友好路由。需要 doctrine-orm 来存储路由。

v1.2.5 2014-03-13 07:31 UTC

This package is auto-updated.

Last update: 2024-09-07 21:02:59 UTC


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'