关于fecshop中classMap使用的问题

问题咨询 · xi_qing · 于 2年前 发布 · 1168 次阅读

由于业务需要,需要在产品分类表中增加一个字段,因此需要重写fecshop\models\mongodb\Category.php,使用了classMap来加载新的model,程序运行的时候一直提示命名空间丢失,不知道是哪里配置错误了,麻烦大家帮忙看下。谢谢! 重写的Category.php如下:

<?php
namespace appadmin\local\local_models\mongodb;

use yii\mongodb\ActiveRecord;

class Category extends ActiveRecord
{
    /**
     * mongodb collection 的名字,相当于mysql的table name
     */
    public static function collectionName()
    {
        return 'category';
    }
    /**
     * mongodb是没有表结构的,因此不能像mysql那样取出来表结构的字段作为model的属性
     * 因此,需要自己定义model的属性,下面的方法就是这个作用
     */
    public function attributes()
    {
        return [
            '_id',
            'parent_id',
            'name',
            'status',
            'url_key',
            'level',
            'thumbnail_image',
            'image',
            'filter_product_attr_selected',
            'filter_product_attr_unselected',
            'description',
            'menu_custom',
            'title',
            'meta_description',
            'meta_keywords',
            'include_in_menu',
            'is_feature',
            'available_sort_by',
            'default_sort_by',
            'theme',
            'active_from',
            'active_to',
            'created_at',
            'updated_at',
            'created_user_id',
            'ori_id',//..此处为增加字段
            //other
            /*
                category filter
                category product


            */
        ];
    }
}

YII的classmap配置如下:

<?php

return [
    //'fecshop\app\appfront\helper\test\My' => '@appfront/helper/My.php',
    "fecshop\models\mongodb\Category"=>"appadmin\local\local_models\mongodb\Category.php",
];

执行时报错如下:

Http status: 500 Internal Server Error
ajaxOptions: error
thrownError: Internal Server Error
Exception (Unknown Class) 'yii\base\UnknownClassException' with message 'Unable to find 'fecshop\models\mongodb\Category' in file: appadmin\local\local_models\mongodb\Category.php. Namespace missing?' 

in G:\WorkSpace\php\fecshop\vendor\yiisoft\yii2\BaseYii.php:295

Stack trace:
#0 [internal function]: yii\BaseYii::autoload('fecshop\\models\\...')
#1 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fecshop\services\category\CategoryMongodb.php(37): spl_autoload_call('fecshop\\models\\...')
#2 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fecshop\services\Category.php(61): fecshop\services\category\CategoryMongodb->getByPrimaryKey('57b6afecf656f25...')
#3 [internal function]: fecshop\services\Category->actionGetByPrimaryKey('57b6afecf656f25...')
#4 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fecshop\services\Service.php(48): call_user_func_array(Array, Array)
#5 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fecshop\app\appadmin\modules\AppadminbaseBlockEdit.php(50): fecshop\services\Service->__call('getByPrimaryKey', Array)
#6 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fecshop\app\appadmin\modules\AppadminbaseBlockEdit.php(50): appadmin\local\local_services\Categoryext->getByPrimaryKey('57b6afecf656f25...')
#7 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fecshop\app\appadmin\modules\Catalog\block\category\Index.php(30): fecshop\app\appadmin\modules\AppadminbaseBlockEdit->init()
#8 G:\WorkSpace\php\fecshop\vendor\yiisoft\yii2\base\Object.php(107): fecshop\app\appadmin\modules\Catalog\block\category\Index->init()
#9 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fec\controllers\FecController.php(41): yii\base\Object->__construct()
#10 G:\WorkSpace\php\fecshop\vendor\fancyecommerce\fecshop\app\appadmin\modules\Catalog\controllers\CategoryController.php(29): fec\controllers\FecController->getBlock()
#11 [internal function]: fecshop\app\appadmin\modules\Catalog\controllers\CategoryController->actionIndex()
#12 G:\WorkSpace\php\fecshop\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
#13 G:\WorkSpace\php\fecshop\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)
#14 G:\WorkSpace\php\fecshop\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('index', Array)
#15 G:\WorkSpace\php\fecshop\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('catalog/categor...', Array)
#16 G:\WorkSpace\php\fecshop\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
#17 G:\WorkSpace\php\fecshop\appadmin\web\index.php(55): yii\base\Application->run()
#18 {main}

不知道应该如何进行配置才不会提示命名空间丢失?

共收到 3 条回复
water#12年前 0 个赞

你上面使用搞错了,具体的使用,我这里有一篇文章,你没有仔细看:

通过配置的方式重写某个Yii2 文件 或第三方扩展文件,Yii2 classMap

你的使用犯了好几个错误:

1.配置出错

<?php

return [
    //'fecshop\app\appfront\helper\test\My' => '@appfront/helper/My.php',
    "fecshop\models\mongodb\Category"=>"appadmin\local\local_models\mongodb\Category.php",
];

你看你上面的注释里面的配置,你在看你的配置,你都没有按照注释来,注释已经写了一个例子。应该改为:

<?php

return [
    //'fecshop\app\appfront\helper\test\My' => '@appfront/helper/My.php',
    "fecshop\models\mongodb\Category"=>"@appadmin/local/local_models/mongodb/Category.php",
];

第二个错误,你的重写后的Category.php,也就是你的 appadmin\local\local_models\mongodb\Category.php 文件的namespace,必须使用 你要重写的文件的namespace,也就是fecshop\models\mongodb,你重写后的Category.php的文件内容如下:

<?php
namespace fecshop\models\mongodb;

use yii\mongodb\ActiveRecord;

class Category extends ActiveRecord
{
    /**
     * mongodb collection 的名字,相当于mysql的table name
     */
    public static function collectionName()
    {
        return 'category';
    }
    /**
     * mongodb是没有表结构的,因此不能像mysql那样取出来表结构的字段作为model的属性
     * 因此,需要自己定义model的属性,下面的方法就是这个作用
     */
    public function attributes()
    {
        return [
            '_id',
            'parent_id',
            'name',
            'status',
            'url_key',
            'level',
            'thumbnail_image',
            'image',
            'filter_product_attr_selected',
            'filter_product_attr_unselected',
            'description',
            'menu_custom',
            'title',
            'meta_description',
            'meta_keywords',
            'include_in_menu',
            'is_feature',
            'available_sort_by',
            'default_sort_by',
            'theme',
            'active_from',
            'active_to',
            'created_at',
            'updated_at',
            'created_user_id',
            'ori_id',//..此处为增加字段
            //other
            /*
                category filter
                category product


            */
        ];
    }
}

这两个错误搞定后,就可以了。

water#22年前 0 个赞

一定要记住,重写后的文件的namespace和重写前的文件的namespace要一致。都是fecshop\models\mongodb;

因此你复制过来文件内容,直接修改就可以了。namespace不需要改动。

xi_qing#32年前 0 个赞

@water #2楼 嗯嗯,明白了,现在可以用了,谢谢!也为自己的不细心感到抱歉!

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