Jason571

Jason571

这家伙有点懒,还没写个性签名!

  • 财富值40
  • 威望值0
  • 总积分100

个人信息

  • 回复了 的回复

    观察者模式,与不用观察者模式相比,除了多写了一堆的代码,其他并没体现出什么好处。

    具体以你讲的例子来说:

    但是,当系统变大的时候,这种方法马上面临难以扩展的问题,并且容易出错。
    比如老王不想订阅了,我们需要改源代码。
    比如又增加了一个客户,我们要去改源代码。
    比如xxx,我们都需要改源代码。
    这两个对象的耦合度太高了。

    $model = new Video();
    $model->attach(new LaoWang());
    $model->attach(new XiaoLi());
    $model->attach(new ChuanPu());
    $model->attach(new BingBing());
    $model->new();

    $model = new Video();
    $model->new();
    LaoWang::update($model);
    XiaoLi::update($model);
    ChuanPu::update($model);
    BingBing::update($model);

    两个代码相比,

    前者观察者模式,并没有解决上面作者自己所提出来的那些问题:有需求变动,还是要改代码的,如果仔细看看,反而是观察者模式情况下,改动的代码还要更多

    具体来说(还是借用作者的例子):

    “当我们再增加一个人加入 习大大 的时候,我们只需要增加一个习大大的观察者类,在实现的时候添加注册,而不需要去改Video类和其他的观察者类,将类之间的耦合降低了很多”

    这里说了,增加习大大: 一要增加类,二要注册,其实还有个三,就是得触发。好处呢,是:不用改其他观察者类。

    那么,不用观察者模式,如何?其实一样嘛,一要增加类,二是要调用。没了。是不是更简单?
    上面说的好处:不用改其他类,普通的调用一样不用改其他类嘛,所以这个好处也不是优势,不存在的

    不知道作者如何解释。

    开闭原则 无非是找个好借口,仅此而已。试问,开闭原则,能回答上面的问题吗,解决了上述问题了吗?不解决问题,只是耍花枪。很多人看到个新东西,就喜欢人云亦云,不加思考。

    我们讨论观察者模式,还没等说清楚,再来个开闭原则。说的是概念A的事情,没说明白,然后用概念B来说,好嘛,环环相绕无休止,这叫做避而不答。

  • 回复了 的评论

    系统字典模块

    扩展介绍

    我们在很多系统中,往往需要维护很多字典项目,一般的字典项目包含有一个大类名称、字典项目名称、字典值、等字段,这些内容往往大同小异,
    如在车辆管理中,我们可能需要维护:车辆类型、车辆品牌、车辆用途、路途类别、用车评价、车辆状态等等信息,这些是很简单的数据,
    用来给业务功能使用的,是一个下拉列表形的数据,如果我们为每个这样的简单类型都创建一个表的话,那么有以下坏处:

    1) 如果业务模块很多,就会产生很多这样的表,看起来不雅,维护也不方便,增加工作量。

    2) 会产生很多页面代码(你需要维护界面内容展示和录入),也是看起来不雅,不方便维护,增加工作量。

    3) 代码中调用处理也不好,记不住哪个是具体的字典信息了,太多。

    以上总结一句话,就是做重复工作,就算有一键生成代码的工具,也是不好的。

    如果采用一个公用的字典管理模块能够解决以上问题,那么整个世界就清净了,一句话,简单。
    本扩展能为你解决以上问题。

    插件特点

    1.适合企业级开发,规范多人合作开发,方便统一定义

    2.通过使用缓存,提高运行效率

    3.调用方便、简单,容易使用

    4.本扩展只依赖于 YII2,无其它第三方依赖,简洁、干净

    5.本扩展支持多语言配置

    6.本扩展已完成字典管理界面,开箱即用,无需再次开发。

    7.可按 YII 组件调用,也可以静态调用

    8.组件调用为单例方式,提高效率

    9.新加入了条目排序功能

    ————————————————————————————————————————————————

    安装方法:

    1.推荐通过使用composer.安装此扩展,一切将自动完成

    你可以通过运行以下代码

        php composer.phar require ciniran/yii2-dic "*"
    

    手动安装和配置方法:

    1.下载模块源码并解压缩到你期望的目录,如:

        vendor/ciniran/yii2-dic
    

    2.在 config/main.php 添加如下配置,启用字典管理模块,请注意一定要加入别名,不然可能访问不到

        'modules' => [
            'dic' => [
                'class' => 'ciniran\dic\Module',
            ],
        ],
        'aliases' => [
            '@ciniran/dic' => '@vendor/ciniran/yii2-dic'
        ],
    

    3.在公共配置文件中启用系统组件,按如下配置,您就可以使用 Yii::$app->dic->getKey('base_status');取值了

       'components' => [
              'dic'=>[
                  'class'=>'\ciniran\dic\components\DicTools',
                     ],
              ]
    

    4.程序会自动检测并创建一个 system_dic 的数据表。

    5.本程序支持多语言配置,

    多语言配置文件位@vendor/ciniran/yii2-dic/message/ 目录之下 
    

    ————————————————————————————————————————————————————————

    使用方法:

    1. 在你的后台访问 http://yourdomain/dic,可以进行数据库的字典配置

    2. 视图文件中使用示例:

    
    <?php echo GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            'id',
            'value',
            'name',
            [
                'attribute' => 'status',
                'filter'=>Yii::$app->dic->getKey(base_status),
                'value' => function ($model) {
                    return Yii::$app->dic->getText('do_status', $model->status);
                }
            ],
                     ]
      ?>
    

    具体可调用工具类如下:

    1.强制删除缓存,无返回值

          SysDic::cleanSystemDic();
    

    2.取得所有字典的数组,

         $array = Yii::$app->dic->getAllKeys(); //通过缓存取得
         
         $array = Yii::$app->dic->getAllKeys(false); //不通过缓存取得
    
    

    3.通过设定的名称取得字典数组

          $array =Yii::$app->dic->getKey('base_status'); //通过缓存取得
          
          $array =Yii::$app->dic->getKey('base_status',true); //获得已被禁用的项目
     
    
    

    4.通过设定的字典值取得显示值

            $string = Yii::$app->dic->getText('base_status','1');
    
    

    5.通过显示值取得字典值

            $value = Yii::$app->dic->getCode('base_status','是');
    
    

    6.正式版本加入了静态调用的方式,具体如下

           $value = SysDic::getCode('base_status', '是');
    
    

    如果本扩展有帮助到你,或者您觉得好用,请不要忘记为我点个star,非常感谢!




    感谢发布扩展,刚刚试用了下,发现两个小问题,已在github上提了issue,希望能抽空修复,谢谢。

  • 回复了 的回答

    我觉得你的数据库设计让简单的问题复杂化了,课程、考试和下载资源三个表都属于商品,放在一个表格(假设叫 item )内存储就行了。把 order.type 迁移到 item 表内,整个结果会更清晰一些。

    课程、考试和下载资源,如果都放到一张表中,用type来表示不同的类别,那么会不会影响数据库的效率?再就是并发更新,是否会受影响

  • 回复了 的回答

    支持的,
    比如你Order模型里定义了:

    public function getCourse(){
        return $this->hasOne(Course::className(),['id'=>'goods_id'])
            ->onCondition(['type'=>1]);
    }
    

    那你query里就可以用

    $query->joinWith('course');
    

    如果你要按course的name来搜索,可以用函数回调,比如:

    $query->innerJoinWith([
        'course' => function ($query) {
            $query->andFilterWhere(['like', 'name', $this->coupon_name]);
        }
    ]);
    

    这种方法在提问之前试过,onCondition(['type'=>1]) 会生成 course.type=1 而不是 order.type=1 不是想要的结果;而且$query->joinWith('course')->onCondition(['type'=>1])这种也试过,是在最后生成where条件也不是想要的结果。
    目前看AR好像是不支持的。

  • 提出了问题
    如何写出这个多表关联查询
  • 回复了 的评论

    求助:
    环境:phpstudy
    代码路径:E:\phpStudy\WWW\yii2admin
    vhosts.conf配置如下:

    ServerName local.yii2admin.com
    
    RewriteEngine on
    DocumentRoot "E:\phpStudy\WWW\yii2admin"
    
    # 应用前端主要重写规则
    RewriteCond %{HTTP_HOST} ^local.yii2admin.com$ [NC] 
    RewriteCond %{REQUEST_URI} !^/(backend/web|admin|storage/web)
    RewriteRule !^/frontend/web /frontend/web%{REQUEST_URI} [L]
    
    # 重定向的网页没有一个斜线(注释,如果必要的话)
    #RewriteCond %{REQUEST_URI} ^/admin/$
    #RewriteRule ^(/admin)/ $1 [L,R=301]
    # 禁止斜线重定向
    RewriteCond %{REQUEST_URI} ^/admin$
    RewriteRule ^/admin /backend/web/index.php [L]
    # 后端应用程序的主要重写规则
    RewriteCond %{REQUEST_URI} ^/admin
    RewriteRule ^/admin(.*) /backend/web$1 [L]
    
    <Directory />
        Options FollowSymLinks
        AllowOverride None
        AddDefaultCharset utf-8
    </Directory>
    <Directory "E:\phpStudy\WWW\yii2admin/frontend/web">
        RewriteEngine on
        # 如果一个目录或一个文件存在,请直接使用请求
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # 否则去请求 index.php
        RewriteRule . index.php
        Allow from all
        Require all granted
    </Directory>
    <Directory "E:\phpStudy\WWW\yii2admin/backend/web">
        RewriteEngine on
        # 如果一个目录或一个文件存在,请直接使用请求
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # 否则去请求 index.php
        RewriteRule . index.php
        Allow from all
        Require all granted
    </Directory>
    <Directory "E:\phpStudy\WWW\yii2admin/storage/web">
        RewriteEngine on
        # 如果一个目录或一个文件存在,请直接使用请求
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # 否则去请求 index.php
        RewriteRule . index.php
        Allow from all
        Require all granted
    </Directory>
    <FilesMatch \.(env|htaccess|htpasswd|svn|git)>
        Require all denied
    </FilesMatch>
    

    HOSTS里面解析:127.0.0.1 local.yii2admin.com
    现在访问:http://local.yii2admin.com/或http://local.yii2admin.com/admin

    报错:Forbidden

    You don't have permission to access /admin on this server.

    新手不懂哪里错了,希望作者指点一二

    刚刚碰到样问题,是否已经解决?

  • 回复了 的评论

    由于无法使用composer完成依赖安装,所以我解决了依赖后新建了一个版本库,供大家使用。https://github.com/kunx-edu/moblog

    另附上解决依赖的步骤:

    1. 拷贝yii2离线安装包中的vendor到moblog的根目录
    2. 修改moblog/web/admin.php中的调试模式为true
    3. 根据提示中的内容去github上搜索所需要的包,markdown的包是在npm网站找到的github地址。

    解决了,看下面我发的详细回复。

助理 等级规则
100/200
资料完整度
10/100
用户活跃度
0/100

Ta的关注

3

Ta的粉丝

1

Ta的访客

3