drodata

drodata

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

  • 财富值1760
  • 威望值310
  • 总积分5350

个人信息

  • 我觉得没必要在这里纠结,忘掉 Apache 即可。下面两个“周期”多看看或许就理解了。

    下面这段话也有助于理解:

    When an application finishes handling a request, it generates a response object and sends it to the end user. The response object contains information such as the HTTP status code, HTTP headers and body. The ultimate goal of Web application development is essentially to build such response objects upon various requests.

    http://www.yiiframework.com/doc-2.0/guide-runtime-responses.html

  • 这跟平台无关。

    • 你指的“debug 功能消失”是 远端页面底部的工具条消失吗?
    • 远端的应用使用 ./init 环境切换了吗?
  • 关注了
  • 事件的使用分三步:

    • 定义事件和 handlers;
    • 绑定
    • 触发

    在 init() 内绑定是一种常见的方法,好处是打开 AR 模型文件后,通过查看 init() 内绑定的事件就能快速了解事件触发后,都执行了哪些操作。还有一种绑定方式是动态绑定,即在逻辑代码内动态地完成绑定和触发操作。两种绑定方法有不同的使用场景,在 init() 内绑定适合那些通用的操作;动态绑定更加灵活,适合特定情况发生时的一些操作。

    以你的应用场景为例,里面涉及两个事件:用户点击收藏按钮和积分发生变化,假设分别定义为 EVENT_AFTER_CLICKED_LIKE_BUTTONEVENT_AFTER_POINT_CHANGED,之后定义四个 handlers:

    • calculatePostLikeNumber(): 帖子的收藏数+1
    • calculateUserPoint(): 用户的积分+1
    • notifyAuthor(): 发送给帖子作者收藏通知
    • logPoint(): 将积分变化情况记录到日志内

    这四个 handlers 都适合放在 init() 内绑定,因为这些操作适合所有收藏帖子的行为。但是假设你想再加一个功能——如果积分 +1 后用户的积分达到 100 分,将用户所属的用户组由“普通用户”改为“高级用户”,这个操作就不能在 init() 内绑定,而应该使用动态绑定的方法,因为并不是所有点击收藏后都会触发更改用户组操作,还要判断用户的积分是否达标。

    上面我假设的这种情况可以再定义一个"用户积分达到 100" 的事件(假设为 EVENT_POINT_REACHED_100),再定义一个 upgradeUserGroup() handler, 用来升级用户组。

    动态绑定很简单,记住先绑定、后触发的原则即可,代码示例:

    public function calculateUserPoint($event)
    {
        $userPoint++;
        
        if ($userPoint >= 100) {
            $user->on(
                User::EVENT_POINT_REACHED_100,
                [$user, 'upgradeUserGroup']
            );
            $user->trigger(User::EVENT_POINT_REACHED_100);
        }
    }
    
    1. 描述没问题;
    2. 事件支持嵌套,事件 A 的处理函数(handler)内可以再触发事件 B, 进而执行事件 B 的处理函数。记得把所有这些操作放在一个事务内,避免出现 dirty data. 推荐 Stack Overflow 上讲事件使用的一个回答,我觉得讲得简单明了。https://stackoverflow.com/a/28586567/716273
  • 说一个直接的办法:先在 common/config/bootstrap.php 内追加两个 alises:

    Yii::setAlias('@backendweb', 'http://backend.a.com');
    Yii::setAlias('@frontendweb', 'http://www.a.com');
    

    之后就可以在 backend 生成 frontend url 了:

    // in backend app
    echo Yii::getAlias('@frontweb') . Url::to(['/article/view', 'id' => 3]);
    

    至于你说的“遵循 frontend 的路由规则”,不用管它,因为生成的 URL 是前台的链接,routing 的时候自然去 frontend 内的 url rules 去匹配。

  • 试试 Conditional Validation:

    public function rules()
    {
        return [
            ['start_time', 'required', 'when' => function($model) {
                return in_array($model->type, [1, 2]);
            }],
            ['end_time', 'required', 'when' => function($model) {
                return $model->type == 1;
            }],
        ];
    }
    
  • 赞了回答

    生产环境哪能随便抛出具体的错误信息。
    这个给访客看到是有很大风险的。

副总裁 等级规则
5350/10000
资料完整度
50/100
用户活跃度
0/100

Ta的关注

6

Ta的粉丝

15

Ta的访客

63