官术网_书友最值得收藏!

Using regular expressions in URL rules

One of the "hidden" features of Yii URL router is that you can use regular expressions that are pretty powerful when it comes to strings handling.

Getting ready

  1. Create a fresh Yii application using yiic webapp as described in the official guide and find your protected/config/main.php. It should contain the following:
    // application components
    'components'=>array(
       …
       // uncomment the following to enable URLs in path-format
       /*
       'urlManager'=>array(
          'urlFormat'=>'path',
          'rules'=>array(
             '<controller:\w+>/<id:\d+>'=>'<controller>/view',
             '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
             '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
          ),
       ),
  2. Delete everything from rules as we are going to start from scratch.
  3. In your protected/controllers, create PostController.php with the following code inside:
    class PostController extends CController
    {
      public function actionView($alias)
      {
          echo "Showing post with alias $alias.";
      }
    
      public function actionIndex($order = 'DESC')
      {
          echo "Showing posts ordered $order.";
      }
    
      public function actionHello($name)
      {
       echo "Hello, $name!";
      }
    }

    This is our application controller we are going to access using our custom URLs.

  4. Configure your application server to use clean URLs. If you are using Apache with mod_rewrite and AllowOverride turned on, then you should add the following lines to the .htaccess file under your webroot folder:
    Options +FollowSymLinks
    IndexIgnore */*
    RewriteEngine on
    
    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # otherwise forward it to index.php
    RewriteRule . index.php

How to do it...

We want our PostController actions to accept parameters according to some rules and give "404 not found" HTTP response for all parameters that do not match. In addition, post index should have an alias URL archive.

Let's use regular expressions to achieve it:

'post/<alias:[-a-z]+>' => 'post/view',
'(posts|archive)' => 'post/index',
'(posts|archive)/<order:(DESC|ASC)>' => 'post/index',
'sayhello/<name>' => 'post/hello',

Now, you can try the following URLs:

// success

http://example.com/post/test-post

// fail

http://example.com/post/another_post

// success

http://example.com/posts

// success

http://example.com/archive

// fail

http://example.com/archive/test

// success

http://example.com/posts/ASC

// success

The following screenshot shows that the URL http://example.com/post/test-post has run successfully:

The following screenshot shows that the URL http://example.com/archive/test did not run successfully and encountered an error:

How it works...

You can use regular expressions in both parameter definition and the rest of the rule. Let's read our rules one by one.

'post/<alias:[-a-z]+>' => 'post/view',

Alias parameter should contain one or more English letter or a dash. No other symbols are allowed.

'(posts|archive)' => 'post/index',

Both posts and archive are leading to post/index.

'(posts|archive)/<order:(DESC|ASC)>' => 'post/index',

Both posts and archive are leading to post/index. Order parameter can only accept two values: DESC and ASC.

'sayhello/<name>' => 'post/hello',

You should specify the name part but there are no restrictions on what characters are allowed.

Note that regardless of the rule used, the developer should never assume that input data is safe.

There's more...

To learn more about regular expressions, you can use the following sources:

See also

  • The recipe named Configuring URL rules in this chapter
  • The recipe named Creating URL rules for static pages in this chapter
主站蜘蛛池模板: 图木舒克市| 寻乌县| 南靖县| 隆回县| 扎兰屯市| 宝兴县| 壶关县| 阳西县| 天祝| 丹巴县| 夏津县| 长葛市| 伊金霍洛旗| 景宁| 凌云县| 三亚市| 新泰市| 乐安县| 个旧市| 赤峰市| 吉安县| 苗栗市| 佳木斯市| 广饶县| 南城县| 客服| 温宿县| 亚东县| 都江堰市| 卢龙县| 洛宁县| 中宁县| 共和县| 汤阴县| 宕昌县| 赣州市| 屏边| 荣昌县| 鄂伦春自治旗| 平定县| 开远市|