【问题标题】:Yii relation between createURL and urlManagercreateURL 和 urlManager 之间的 Yii 关系
【发布时间】:2014-04-22 00:51:08
【问题描述】:

我是 Web 开发的新手,我花了几个小时试图了解 Yii 以及它如何处理 URL。教程看了几十遍还是没看懂。

我正在尝试为按钮小部件、菜单小部件、控制器操作和基本 HTML 链接设置 URL。看来 Yii 处理所有这些路由的方式不同,我无法让它工作。

这是一个例子。 我需要从protected/views/site 文件夹中的一个页面到protected/modules 中的一个模块。 所有 以下命令给我CException 错误SiteController cannot find the requested view [...] .../yii/framework/web/CController.php(878) 文件时发出以下命令...

$this->render(Yii::app()->createURL('module/action'));
$this->render(Yii::app()->createURL('/module/action'));
$this->render(Yii::app()->createAbsoluteURL('module/action'));
$this->render(Yii::app()->createAbsoluteURL('/module/action'));
$this->render('module');
$this->render('/module');
$this->render('//module')
$this->render('module/action');
$this->render('/module/action');

我以为我收到了这个错误,因为createURL() 给了我/app/index.php/module/action。相反,我想要http://mysite/app/index.php/module/action。感谢@Jonnny,我能够使用createAbsoluteURL() 获得完整的URL。
问题是我仍然遇到同样的错误。如果我输入http://mysite/app/index.php/module/action,我会得到我想要的模块,但是如果我尝试通过 Yii 渲染页面,我会得到 CException 错误。

令人沮丧的是,我可以在 Yii 的其他区域轻松地在控制器之间移动。例如,如果我将参数设置为 YiiBooster 小部件,例如 ...

array('label' => 'Menu Option',
      'url' => array('/controller/action')

...无论我从哪个控制器开始,我都会被路由到http://mysite/app/index.php/controller/action。控制器/动作的 URL 模式与模块/动作的 URL 模式相同,为什么 Yii 不能带我进入模块/动作?

更新: 在我更好地理解 Yii 之前,我使用的是在 http://www.highnd.com/articles/yii-framework/yii-url-links-and-redirection 上找到的解决方案。我现在可以使用以下命令访问模块: $this->redirect(Yii::app()->createAbsoluteURL('module'));

【问题讨论】:

    标签: php yii yii-booster


    【解决方案1】:

    渲染用于显示某个视图文件。您不需要在它之前添加 createUrl()。只需传递您要渲染的控制器/动作,如果您经常从控制器渲染,您可以只传递视图文件名。所以

    $this->render('view', array('model' => $model)); // here view would be the view file (view.php) that relates to the model instance. 
    

    您正在使用的 Yii 助推器小部件要求您提供可以作为路由传递的特定 url。简而言之,我认为您使用渲染不正确。它用于显示带有布局的视图文件。

    createUrl() - 为这里定义的指定操作创建一个相对 URL 控制器。

    createAbsoluteUrl() - 为指定操作创建一个绝对 URL 在这个控制器中定义。

    如果你想要一个完整的 URL,你需要 createAbsoulteUrl()。

    【讨论】:

    • 我仍然对为什么 createURL 省略了 URL 的 http://mysite/ 部分感到困惑。
    • 当我按照您的示例进行操作时,我收到错误 SiteController cannot find the requested view,因为我正在尝试导航到一个模块,并且出于我真的希望我能理解的原因,我只能在输入时访问该模块手动输入完整的 URL。
    • 更新了我的答案,希望这能回答你关于离开http://mysite/的问题
    • 使用createAbsoluteUrl(),我仍然得到SiteController cannot find the requested view "http://mysite/app/index.php/controller"。但是,如果我手动输入 URL,它就可以正常工作。
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2013-12-24
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多