axis/axis-curly-routing-plugin

此包已被废弃,不再维护。没有建议的替代包。

此插件向symfony 1.x引入了一个新的路由类,其模式使用大括号,就像Symfony2的路由一样。

安装: 117

依赖: 0

建议者: 0

安全: 0

星标: 2

关注者: 1

分支: 1

开放问题: 1

类型:symfony1-plugin

1.0.0 2013-09-06 12:30 UTC

This package is not auto-updated.

Last update: 2020-04-03 16:02:15 UTC


README

此插件向symfony 1.x引入了一个新的路由类,其模式使用大括号,就像Symfony2的路由一样。

安装

使用Composer。只需将此依赖项添加到您的composer.json

  "require": {
    "axis/axis-curly-routing-plugin": "dev-master"
  }

使用方法

现在您可以使用大括号路由。只需在您的routing.yml文件中声明具有指定CurlyRoute类的路由即可

curly_route:
  url: /hello/{name}
  param: { module: test, action: sayHello }
  class: CurlyRoute

这就完了。您可以使用与任何symfony路由相同的引用方式引用此路由。

用于生成URL

<?php echo url_for('curly_route', array('name' => 'world')) ?>

用于路由请求到控制器

class testActions extends sfActions
{
  public function executeSayHello($request)
  {
    return $this->renderText('Hello, ' . $request['name']);
  }
}

是的。您可以使用这些路由做一些酷的事情。

分层URL

实现此路由的主要原因是能够在路由中使用路径变量。例如,您想在URL中使用类似分层结构的东西

您可以使用默认的symfony路由做这件事

asset:
  url: /:path/:filename.:sf_format
  param: { ... }
  requirements:
    path: .*

这可以将请求从/my/assets/path/image.png路由到定义的控制器。但是当您需要为该路径生成URL时,您将得到这个: /my%2Fassets%2Fpath/image.png

大括号路由使您能够用于这类任务。

asset:
  url: /{path}/{filename}.{sf_format}
  param: { ... }
  class: CurlyRoute
  requirements:
    path: .*
    sf_format: \w+

任何符号分隔的变量

blog_post:
  # you cannot use path like '/blog/:slug-:id.html' using default symfony routes
  url: /blog/{slug}-{id}.html
  param: { ... }
  class: CurlyRoute
  requirements:
    slug: .+
    id:   \d+

Propel Object路由升级版

您可以使用CurlyObjectRoute处理propel对象请求,就像您使用sfPropelRoute一样。

blog_post:
  url: /blog/{slug}-{id}.html
  param: { ... }
  class: CurlyObjectRoute
  options:
    model: BlogPost
    query_methods: [ filterPublished ]
    # Note: there is no 'type' option because CurlyObjectRoute
    #   doesn't support collection routes for now.
  requirements:
    slug: .+
    id:   \d+

您可以使用它就像使用sfPropelRoute一样。用于生成URL

<?php echo url_for('blog_post', $post) ?>

or

<?php echo url_for('blog_post', array('id' => $post->getId(), 'slug' => $post->getSlug())) ?>

并从控制器检索对象

class blogActions extends sfActions
{
  public function executeShowPost($request)
  {
    $post = $this->getRoute()->getObject();
  }
}

命名空间

有时您需要在URL中使用对象属性加上其他变量。现在您可以使用CurlyObjectRoute处理此类问题,只需定义命名空间即可

blog_post:
  url: /{username}blog/{post.slug}-{post.id}.html
  param: { ... }
  class: CurlyObjectRoute
  options:
    model: BlogPost
    query_methods: [ filterPublished ]
    namespace: post # Note this option
  requirements:
    username: \w+
    post.slug: .+
    post.id:   \d+

使用方法。用于生成URL

<?php echo url_for('blog_post', array('post' => $post, 'username' => 'anonymous')) ?>

or 

<?php echo url_for('blog_post', array(
    'post.id' => $post->getId(),
    'post.slug' => $post->getSlug(),
    'username' => 'anonymous'
  )) ?>

or

<?php echo url_for('blog_post', array(
    'post' => array(
        'id' => $post->getId(),
        'slug' => $post->getSlug()
    ),
    'username' => 'anonymous'
  )) ?>

并从控制器检索对象

class blogActions extends sfActions
{
  public function executeShowPost($request)
  {
    $post = $this->getRoute()->getObject('post');
  }
}

每个路由多个对象

您还可以在路由中使用多个对象。

show_product:
  url: /shop/{category.path}/{product.slug}-{product.id}.html
  param: { ... }
  class: CurlyObjectRoute
  options:
    transform:
      product:
        model: Product
        query_methods: [ filterPublished, filterInStock ]
      # or you can use short syntax if there is only model option for a namespace
      category: Category
  requirements:
    slug: .+
    id:   \d+

使用方法。用于生成URL

<?php echo url_for('show_product', array('category' => $category, 'product' => $product)) ?>

并从控制器检索对象

class shopActions extends sfActions
{
  public function executeShowProduct($request)
  {
    /** @var $category Category */
    $category = $this->getRoute()->getObject('category');
    /** @var $product Product */
    $product = $this->getRoute()->getObject('product');
  }
}

注意:要使用CurlyObjectRoute,您应通过安装PropelORMPlugin将您的项目升级到使用Propel 1.6

扩展大括号路由

您可以使用任何自定义参数转换器与CurlyRoute一起使用。使用transform选项定义它们。

weird_route:
  url: /say/{weird_word}
  class: CurlyRoute
  options:
    transform:
      weird_transformer:
        class: myProjectWeirdRouteVarTransformer
        # ... any other options
    # or short syntax
    # transform: myProjectWeirdRouteVarTransformer

要在您的项目中实现自定义参数转换器,创建一个实现\Axis\S1\CurlyRouting\Transformer\DataTransformerInterface的类。

class myProjectWeirdRouteVarTransformer implements \Axis\S1\CurlyRouting\Transformer\DataTransformerInterface
{
  public function transformForUrl($params, $variables, $options = array())
  {
    $params['weird_word'] = 'foo'.$params['word'].'bar'
    unset($params['word']);
    return $params;
  }

  public function transformForController($params, $variables, $options = array())
  {
    $weird = $params['weird_word'];
    if (substr($weird, 0, 3) == 'foo') $weird = substr($weird, 3);
    if (substr($weird, -3) == 'bar') $weird = substr($weird, 0, -3);

    unset($params['weird_word']);
    $params['word'] = $weird;
    return $params;
  }
}

此转换器接收一组参数作为输入,并返回一个由路由使用的参数结果的数组。

当您生成URL时,将使用transformForUrl方法的输出结果。

This code:
<?php echo url_for('weird_route', array('word' => 'hello')) ?>
will output:
/say/foohellobar

另一方面,通过导航到该URL(/say/foohellobar),路由将获取值为foohellobarweird_word变量。然后它将通过您所有路由定义的数据转换器,您将在请求和控制器中获得转换后的变量。

class weirdActions extends sfActions
{
  public function executeSay($request)
  {
    $this->renderText($request['word']); // this will output 'hello'
  }
}

您可以在不需要实现自定义路由的情况下使用自定义转换器来执行许多酷炫的操作。顺便说一句,CurlyObjectRoute使用转换器来处理对象请求。查看该类以获取有关参数转换器的更多信息。您可以串联它们并重用已实现的代码。

听起来很棒,不是吗?