zenstruck/object-routing-bundle

该软件包已被废弃,不再维护。未建议替代软件包。

Symfony2 Bundle 允许从对象生成 URL(sf1 风格)。

安装: 540

依赖项: 0

建议者: 0

安全: 0

星星: 8

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

v0.5.1 2015-12-16 15:31 UTC

This package is auto-updated.

Last update: 2020-10-28 14:20:54 UTC


README

Build Status Scrutinizer Code Quality Code Coverage SensioLabs Insight StyleCI Latest Stable Version License

这是一个允许将对象传递给您的路由器的 Symfony Bundle。它通过装饰默认路由器并使用自定义 ObjectRouter 将对象转换为 路由名称路由参数 来工作。这些参数将传递给默认路由器。

对于那些还记得 symfony 1 的用户,这个 Bundle 带回了在该框架中可用的功能。

安装

  1. 使用 composer 安装

     composer require zenstruck/object-routing-bundle
    
  2. 在内核中启用该 Bundle

    // app/AppKernel.php
    
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Zenstruck\ObjectRoutingBundle\ZenstruckObjectRoutingBundle(),
        );
    }

用法

要使用此 Bundle,您必须首先有一个对象。让我们以 BlogPost 为例

namespace Acme\Entity;

class BlogPost
{
    private $id;
    private $slug;
    private $body;

    public function getId()
    {
        return $this->id;
    }

    public function getSlug()
    {
        return $this->slug;
    }

    public function getBody()
    {
        return $this->body;
    }
}

接下来,您必须为该对象创建一些路由

# app/config/routing.yml

blog_post_show:
    pattern:  /blog/{id}-{slug}
    defaults: { _controller: AcmeBundle:BlogPost:show }

blog_post_edit:
    pattern:  /blog/{id}/edit
    defaults: { _controller: AcmeBundle:BlogPost:delete }

blog_post_delete:
    pattern:  /blog/{id}
    defaults: { _controller: AcmeBundle:BlogPost:delete }
    methods:  [DELETE]

不使用此 Bundle

现在,假设您想为博客文章生成一个路由。标准方法如下

Twig:

{# variable "post" is an instance of "BlogPost" with id=1, slug=example #}

{{ path('blog_post_show', { id: post.id, slug: post.slug }) }} {# /blog/1-example #}
{{ path('blog_post_show', { id: post.id, slug: post.slug, view: full }, true) }} {# http://example.com/blog/1-example?view=full #}
{{ path('blog_post_edit', { id: post.id }) }} {# /blog/1/edit #}
{{ path('blog_post_delete', { id: post.id }) }} {# /blog/1 #}

Symfony 控制器:

namespace Acme\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{
    public function myAction()
    {
        $post = // instance of Acme\Entity\BlogPost with id=1, path=example

        // blog_post_show (/blog/1-example)
        $url = $this->generateUrl('blog_post_show', ['id' => $post->getId(), 'slug' => $post->getSlug()]);

        // blog_post_show with extra parameter and absolute (http://example.com/blog/1-example?view=full)
        $url = $this->generateUrl(
            'blog_post_show',
            ['id' => $post->getId(), 'slug' => $post->getSlug(), 'view' => 'full'],
            true
        );

        // blog_post_edit (/blog/1/edit)
        $url = $this->generateUrl('blog_post_edit', ['id' => $post->getId()]);

        // blog_post_delete (/blog/1)
        $url = $this->generateUrl('blog_post_delete', ['id' => $post->getId()]);
    }
}

使用此 Bundle

在此 Bundle 的配置中,设置一个从 BlogPost 到博客文章路由的映射

# app/config/config.yml

zenstruck_object_routing:
    class_map:
        Acme\Entity\BlogPost:
            default_route: blog_post_show
            default_parameters: [id]
            routes:
                blog_post_show: [id, path]
                blog_post_edit: ~
                blog_post_delete: ~

现在生成博客文章的路由变得更加简单

Twig:

{# variable "post" is an instance of "BlogPost" with id=1, slug=example #}

{{ path(post) }} {# /blog/1-example (blog_post_show url because it is the default route) #}
{{ path('blog_post_show', post) }} {# equivalent to above #}
{{ path(post, { view: full }, true) }} {# http://example.com/blog/1-example?view=full #}
{{ path('blog_post_show', post, { view: full }, true) }} {# equivalent to above #}
{{ path('blog_post_edit', post) }} {# /blog/1/edit #}
{{ path('blog_post_delete', post) }} {# /blog/1 #}

Symfony 控制器:

namespace Acme\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{
    public function myAction()
    {
        $post = // instance of Acme\Entity\BlogPost with id=1, slug=example

        // blog_post_show (/blog/1-example)
        $url = $this->generateUrl($post); // blog_post_show url because it is the default route
        $url = $this->generateUrl('blog_post_show', $post); // equivalent to above

        // blog_post_show with extra parameter and absolute (http://example.com/blog/1-example?view=full)
        $url = $this->generateUrl($post, ['view' => 'full'], true);
        $url = $this->generateUrl('blog_post_show', $post, ['view' => 'full'], true); // equivalent to above

        // blog_post_edit (/blog/1/edit)
        $url = $this->generateUrl('blog_post_edit', $post);

        // blog_post_delete (/blog/1)
        $url = $this->generateUrl('blog_post_delete', $post);
    }
}

自定义转换

此 Bundle 包含一个 ClassMapObjectTransformer,它使用 Bundle 的配置将对象类映射到路由。如果您有更复杂的情况,可以添加自己的转换器。只需让您的自定义转换器实现 Zenstruck\ObjectRoutingBundle\ObjectTransformer\ObjectTransformer 并将其注册为带有 zenstruck_object_routing.object_transformer 标签的服务即可。

请参阅 Zenstruck\ObjectRoutingBundle\ObjectTransformer\ClassMapObjectTransformer 以获取参考。

完整默认配置

zenstruck_object_routing:
    class_map:

        # Prototype
        class:

            # Optional - The route to use when an object is passed as the 1st parameter of Router::generate()
            default_route:        null

            # Route parameter as key, object method/public property as value (can omit key if object method/property is the same)
            default_parameters:

                # Examples:
                - id
                - path

            # Route name as key, parameter array as value (can leave parameter array as null if same as default_parameters)
            routes:

                # Examples:
                blog_show:           ~
                blog_edit:
                    - id

                # Prototype
                route_name:           []

注意 1:此 Bundle 的路由器使用 PropertyAccess 组件来访问对象的属性/方法。

注意 2:当映射具有继承关系的多个对象时,请确保按从子到父的顺序排列。例如,如果您有一个具有 Page 父类的 BlogPost 并且两者都进行了映射,请确保将 BlogPost 放在 Page 之前。