使用模块自动构建面包屑

rob*_*180 5 breadcrumbs yii2

我的网页有多个模块,我想知道是否有办法在模块主页面添加面包屑,而无需手动添加到所有文件.例如:

Home > MyModule > MyController
Run Code Online (Sandbox Code Playgroud)

aro*_*hev 4

这个问题绝对太广泛了,但这是我使用的解决方案:

<?php

namespace backend\modules\tests\components;

use yii\helpers\ArrayHelper;
use yii\web\Controller as BaseController;
use yii\web\View;

class Controller extends BaseController
{   
    /**
     * @inheritdoc
     */
    public function beforeAction($action)
    {
        if (parent::beforeAction($action)) {
            Yii::$app->view->on(View::EVENT_BEGIN_BODY, function () {
                $this->fillBreadcrumbs();
            });

            return true;
        } else {
            return false;
        }
    }

    /**
     * Fill common breadcrumbs
     */
    protected function fillBreadcrumbs()
    {
        $breadcrumbs = [];

        // Add needed elements to $breadcrumbs below

        $label = 'Tests';
        $breadcrumbs[] = $this->route == '/tests/default/index' ? $label : [
            'label' => $label,
            'url' => ['/tests/default/index'],
        ];

        // ...

        $this->mergeBreadCrumbs($breadcrumbs);
    }

    /**
     * Prepend common breadcrumbs to existing ones
     * @param array $breadcrumbs
     */
    protected function mergeBreadcrumbs($breadcrumbs)
    {
        $existingBreadcrumbs = ArrayHelper::getValue($this->view->params, 'breadcrumbs', []);
        $this->view->params['breadcrumbs'] = array_merge($breadcrumbs, $existingBreadcrumbs);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它基于视图事件和自定义控制器(从 扩展yii\web\Controller)。

接下来您需要的只是从自定义控制器扩展所需的控制器。