【问题标题】:How does Routing in PHP Yii work?PHP Yii 中的路由是如何工作的?
【发布时间】:2014-03-17 18:04:20
【问题描述】:

我来自 Rails 和 codeIgniter 背景,我习惯于查看 routes.rb 或 routes.php 但是从 Yii 框架中阅读了一些文档,我无法弄清楚路由是如何工作的?它是由配置文件自动完成的吗?如果是那怎么办?

查看 main.php 配置文件,我相信以下几行创造了魔力:

    '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>',
        ),
    ),

但是为什么控制器标签里面有一个 w+ 呢? id 标签是如何工作的?

为什么url必须以index.php开头?为什么不能简单 本地主机/控制器名称/操作?

【问题讨论】:

    标签: php yii routing


    【解决方案1】:

    欢迎来到 Yii! URL 管理器非常强大,您可以几乎做任何您需要的事情。

    网址不必以 index.php 开头 - 尝试以下设置:

    'urlManager'=>array(
        'showScriptName' => false, // Removes index.php from URL
        'urlFormat'=>'path',       // Uses /controller/action rather than query vars
        'useStrictParsing'=>true,  // Prevents generic rule matching
        'rules'=>array(
        ),
    ),
    

    至于规则中的+w,这是Regex——或者更确切地说是Yii 的Regex 的基本版本。您可以在路由中设置参数并让它们仅匹配某些正则表达式模式:

    // URL /articles/an-article-321 routed to ArticleController and ActionView Method
    // I'm setting up the params $_GET['slug'] and $_GET['id']
     'articles/<slug:[a-z-]+>-<id:\d+>' => 'article/view' 
    

    【讨论】:

    • 看起来好像添加 showScriptName => false 会使我的所有链接都断开?
    • 您是手动构建链接,包括index.php/whatever,还是使用CHtml::link()Controller::createUrl()?后者将在您更改规则时更新。您是否还在使用 .htaccess 文件来重写所有 URL?
    • 我只是创建了自动生成的应用程序,它有一些链接。在阅读了有关删除 index.php 和路由的文章后,我了解到在我的情况下,必须将 .htaccess 文件放在我的项目 www/testdrive 的根目录中。该文件必须包含 yiiframework.com/doc/guide/1.1/en/topics.url#hiding-x-23x 。但是,现在看起来链接指向 localhost/site/action 很好,但它们都返回 404。如果我使用 localhost/index.php/site/action,那么它们可以正常工作
    • 在添加 .htaccess 之后,它看起来好像服务器返回了 500 内部错误。你需要日志吗?
    • 如果您获得 500,则 .htaccess 文件中一定存在某种语法错误或权限问题。
    【解决方案2】:

    首先,这里有一个很好的指南:http://www.larryullman.com/2013/02/18/understanding-routes-in-the-yii-framework/

    为了回答您的问题(或其中一些问题),您粘贴的行基本上告诉 Yii 如何处理这些“漂亮”的 url,例如它需要一个控制器名称,然后是一个 id(d+ 表示数字),以及它将路由到控制器/视图。

    另请注意,控制器和操作有命名约定,例如。用户控制器,actionView()。

    关于你的 index.php 问题,这是 Nginx / Apache htaccess 的工作,在 CodeIgniter 中也应该是一样的。

    希望这会有所帮助。

    附:你可以在这里阅读更多关于 URL 的信息http://www.yiiframework.com/doc/guide/1.1/en/topics.url

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 2012-09-07
      • 2016-12-21
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多