module新controller管用,但如果只是重写一下module,不拷贝view,module下的页面都显示404

bug问题 · ganbugandong · 于 5年前 发布 · 1734 次阅读

因为想用新的调整过的layout view,所以需要重写Customer的module文件。

Customer config如下: appfront/config/fecshop_local_modules/Customer.php

return [
    'customer' => [
        'class' => 'appfront\local\local_modules\Customer\ModuleOverride',
        'controllerMap' => [
            'sourcing' => 'appfront\local\local_modules\Customer\controllers\SourcingController'
        ],
        'params'=> [
		... (省略了)
		]
	]
]

新建的ModuleOverride文件如下: appfront/local/local_modules/Customer/ModuleOverride.php

namespace appfront\local\local_modules\Customer;

use fecshop\app\appfront\modules\AppfrontModule;
use Yii;

class ModuleOverride extends AppfrontModule
{
    public $blockNamespace;

    public function init()
    {
        // 以下代码必须指定
        $nameSpace = __NAMESPACE__;
        // 如果 Yii::$app 对象是由类\yii\web\Application 实例化出来的。
        if (Yii::$app instanceof \yii\web\Application) {
            // 设置模块 controller namespace的文件路径
            $this->controllerNamespace = $nameSpace . '\\controllers';
            // 设置模块block namespace的文件路径
            $this->blockNamespace = $nameSpace . '\\block';
        // console controller
        //} elseif (Yii::$app instanceof \yii\console\Application) {
        //	$this->controllerNamespace 	= 	$nameSpace . '\\console\\controllers';
        //	$this->blockNamespace 	= 	$nameSpace . '\\console\\block';
        }
        //$this->_currentDir			= 	__DIR__ ;
        //$this->_currentNameSpace	=   __NAMESPACE__;

        // 设置该模块的view(theme)的默认layout文件。
        Yii::$service->page->theme->layoutFile = 'dashboard.php';
        parent::init();
    }
}

因为只是改了layout,所以view部分只建了新的layout view文件。 appfront/theme/addropshipping/theme01/layouts/dashboard.php

然后发现customer下的页面都显示404。后来试着新建了一个controller,因为新controller需要建相应的view,建完发现新controller的页面倒是都能正常打开(也是用的新的layout)。

不知道哪里的问题,谢谢

共收到 2 条回复 问题提问
Fecmall#15年前 0 个赞

如果你只是想在原来的customer modules基础上面添加新的controller,配置中覆盖class

return [
    'customer' => [
        'controllerMap' => [
            'sourcing' => 'appfront\local\local_modules\Customer\controllers\SourcingController'
        ],
        'params'=> [
		... (省略了)
		]
	]
]

也就是上面的配置部分,class部分去掉,如果你想重写某个controller,那么你在controllerMap中添加重写的controller即可

如果你在module config使用了新的class,那么你重写的是整个模块,下面的代码你可以看到

public function init()
    {
        // 以下代码必须指定
        $nameSpace = __NAMESPACE__;
        // 如果 Yii::$app 对象是由类\yii\web\Application 实例化出来的。
        if (Yii::$app instanceof \yii\web\Application) {
            // 设置模块 controller namespace的文件路径
            $this->controllerNamespace = $nameSpace . '\\controllers';
            // 设置模块block namespace的文件路径
            $this->blockNamespace = $nameSpace . '\\block';
        }
        //$this->_currentDir			= 	__DIR__ ;
        //$this->_currentNameSpace	=   __NAMESPACE__;

        // 设置该模块的view(theme)的默认layout文件。
        Yii::$service->page->theme->layoutFile = 'dashboard.php';
        parent::init();
    }

$this->controllerNamespace = $nameSpace . '\\controllers';,这个代码的意思应该能读懂吧?这个变量就是设置controller的文件路径,也就是怎么找controller, 这里执行后,controller就会去 appfront\local\local_modules\Customer\controllers里面找,这个里面肯定找不到,然后就会报错

多读一下源码。

确实是这里的问题,谢谢!

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics