【问题标题】:How to fix 'Static page in sub-directory" issue in Yii2如何修复 Yii2 中的“子目录中的静态页面”问题
【发布时间】:2019-08-23 04:56:49
【问题描述】:

我已经设置了由 Yii2 驱动的网站,但我想在子目录中获取一些静态页面,然后在 url 中显示子目录的名称。例如,在 site/hotel/pacific.php 和 site/mini-rooms/standard.php 中,然后使用 xyz.com/hotel/pacific 和 xyz.com/mini-rooms/standard 访问它们。

我尝试在网上遵循一些示例,但我不确定为什么这些示例不起作用。一些例子也适用于 yii 而不是 yii2。 这是我所做的:

SiteController.php 中,我在使用下面的代码之前创建了一个静态页面,我可以在xyz.com/hotel/pacific 访问它。但现在我将其移至子目录hotel。它以前位于 views/site 文件夹中:

public function actionPacific()
{
    return $this->render('pacific');
}

然后我在view 文件夹内创建了一个文件夹名称pages。在pages 文件夹中,我创建了hotel 文件夹,并在酒店文件夹中放置了pacific.php 文件,所以我有views/site/pages/hotel/pacific.php

同样在SiteController.php,我添加了这个:

public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
        ],
        'captcha' => [
            'class' => 'yii\captcha\CaptchaAction',
            'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
        ],
        'page' => [
            'class'=>'CViewAction',
        ],
        'hotels' => [
            'class'=>'CViewAction',
            'basePath' => 'pages/hotels'
        ],          
    ];
}

然后我通过添加以下代码来配置我的config/web.php

    'urlManager' => [
        'class' => 'yii\web\UrlManager',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing'=>false,
        'rules' => [
            '<alias:[\w\-]+>' => 'site/<alias>',
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',               
        ],
    ],

我在访问 xyz.com/hotel/pacific 时遇到 404 错误。

对于这两个示例 - xyz.com/hotel/pacificxyz.com/mini-rooms/standard,我该如何正确执行此操作。

【问题讨论】:

  • 你在controller/action而不是文件夹结构上映射url,
  • 我删除了这些代码,但无法让它工作,只留下了第一行。我已经更新了这个问题。可以看看吗?
  • 我浏览了一些文档,看起来我遵循的指令对于 yii2 是不同的。例如,CViewAction 似乎不再使用。你能建议如何解决这个问题吗?
  • CViewAction 似乎适用于 Yii1 .. 对于 Yii2,您应该为 miniRoom 创建一个控制器并添加您需要的操作
  • 谢谢。但我真的是 Yii2 的新手。只是学习。获得一些帮助或教程将非常有帮助。

标签: php yii2


【解决方案1】:

据我了解,您正在混合 Yii 12,因为 CWebView 用于 Yii1 而不是 Yii2。所以你需要的可能是yii\web\ViewAction,它代表一个单一的动作。其他人可能会提出更好的答案。

所以如果你有一个目录。

  • views/site/hotel/pacific.php
  • views/site/hotel/five-star.php

并且您想通过输入 URL xyz.com/hotel/pacificfive-star.phpxyz.com/hotel/five-star 来访问 pacific.php 视图。

那么你应该像下面这样配置它们

public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction'
        ],
        'pacific' => [
            'class' => 'yii\web\ViewAction',
            'defaultView' => 'pacific',
            'viewPrefix' => 'hotel'
        ],
        'five-star' => [
            'class' => 'yii\web\ViewAction',
            'defaultView' => 'five-star',
            'viewPrefix' => 'hotel'
        ],
        'captcha' => [
            'class' => 'yii\captcha\CaptchaAction',
            'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null
        ]
    ];
}

然后像下面这样更新 urlManager

'urlManager' => [
        'class' => 'yii\web\UrlManager',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing'=>false,
        'rules' => [
            '/' => 'site/index',
            '<alias:[\w\-]+>' => 'site/<alias>',
            'hotel/<alias:[\w\-]+>' => 'site/<alias>',
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>'
        ]
],

现在,如果您在浏览器中输入xyz.com/hotel/pacificxyz.com/hotel/five-star,它将显示相应的视图。

希望它能解决你的问题。

【讨论】:

  • 我决定在controller文件夹内创建HotelController.php,然后在views文件夹下创建hotel文件夹。然后我在文件夹中添加了 php 视图文件并将它们添加到 HotelController.php 中。虽然我不确定是否有更好的选择,但它可以按我的意愿工作。
【解决方案2】:

我决定在controller 文件夹内创建HotelController.php,然后在views 文件夹下创建hotel 文件夹。然后我在酒店文件夹中添加了pacific.php,并在HotelController.php 中添加了操作代码,如下所示。

public function actionPacific()
{
    return $this->render('pacific');
}

虽然我不确定是否有更好的选择,但它可以按我的意愿工作。我删除了 url 管理器中的规则,因为我现在不需要它们。我只需要转到mysite.com/hotel/pacific 即可显示该页面。我可以在文件夹中创建任意数量的页面,然后添加它们的操作代码。

【讨论】:

    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2021-08-15
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多