我有一种情况,我希望 URL 指示子页面(如“网站/页面/子页面”),但我认为拥有单独的控制器没有意义。(目前我只有一个控制器;SiteController.php
。)
我正在新的 Yii2 Basic 站点中重新创建现有站点的站点结构。
客户在其现有站点中有一个名为“laptop-repair”的页面,其中链接了许多页面,例如“laptop-overheat”。所以 URI 需要看起来像“笔记本电脑维修/笔记本电脑过热”。
解决方案:
在 config>web.php 的 urlManager 中,我添加了一条新规则(注意,规则的顺序很重要,较早的规则优先):
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'/' => 'site/index',
[
'pattern' => 'laptop-repair/<page:.*>',
'route' => 'site/laptop-repair',
'defaults' => ['page' => 'index'],
],
...
],
],
在SiteController.php
我已经对要制作为父页面的页面进行了操作:
public function actionLaptopRepair()
{
return $this->render('laptop-repair');
}
我替换为:
public function actionLaptopRepair($page)
{
return $this->render("/site/laptop-repair/$page");
}
前导斜杠是必要的,它可以覆盖 Yii 应用程序的默认行为,即在 'views>{controllerName}' 中查找视图。例如,render('laptop-repair');
视图文件laptop-repair.php
需要位于“views>site”中,因为控制器的名称是 SiteController,而render("/site/laptop-repair/$page");
对应$page
于“views>site>laptop-repair”中的视图文件 ( )。这允许您在子目录中组织视图。
我在 'views>site' 中创建了一个名为 'laptop-repair' 的新文件夹,将父页面 ( laptop-repair.php
) 的视图移动到新目录中并重命名了它index.php
。我将新子页面的视图文件放在新目录('views>site>laptop-repair')和父视图()旁边index.php
。
除了在我的导航小部件中创建 URL 之外,一切正常。在以下工作正常的情况下,在我实施上述操作后,“笔记本电脑修复”链接中断:
echo Nav::widget([
'options' => ['class' => 'navbar-nav ml-auto'],
'items' => [
['label' => 'Home', 'url' => ['/site/index']],
[
'label' => 'Repair Services',
'items' => [
['label' => 'Desktop PC Repairs', 'url' => ['/site/pc-repair']],
['label' => 'Laptop Repairs', 'url' => ['site/laptop-repair']],
['label' => 'Mobile Phone Repairs', 'url' => ['/site/mobile-phone-repair']],
...
修复只是将相关行更改为:
['label' => 'Laptop Repairs', 'url' => ['/laptop-repair']],
创建从父页面到子页面的链接如下所示:
<?= Html::a('Laptop overheating?', ['laptop-repair/laptop-overheating'], ['class' => '', 'title' => 'Laptop overheating']) ?>
要将父页面的链接添加到子页面的面包屑,我替换了:
$this->title = 'Laptop Over Heating?';
$this->params['breadcrumbs'][] = $this->title;
和:
$this->title = 'Laptop Over Heating?';
$this->params['breadcrumbs'][] = ['label' => 'Laptop repair', 'url' => ['/laptop-repair']];
$this->params['breadcrumbs'][] = $this->title;
在子页面的视图文件中。