最近发表的话题
最近发表的评论
  • 想做一个自己的开源项目,但写了一个注册登录之后就不知道怎么做下去了 at 1周前

    bootstrap+flex搞定页面

  • 关于&符号 at 2周前

    原因就如1楼所解释,解决方法是引用使用完要unset掉:

     $data = [1, 2, 3];
     foreach ($data as &$value) {
        $value = $value * 2;
     }
    unset($value)
  • 有人遇到过谷歌浏览器上传选择图片有时成功,有时会卡死,显示程序无响应的问题吗 at 3周前

    以前遇到过开着搜狗输入法上传图片就会卡死,关闭则没问题。

  • element ui 中的 table 组件条件区块为什么不显示呢? at 3周前

    如果这个条件 v-if="!scope.row.children" 为 true,就显示这个,否则就显示else那一块。

  • 容器越来越多。现在普遍的使用方式是 docker 是一个容器一个应用比较好,还是一个容器多个应用比较推荐 at 3周前

    一个容器一个应用好,这也是官方推荐的方式。优点有:

    • 容器可复用,可灵活组合
    • 容器体积较小,易于分发
    • 容器间可设置网络隔离,更加安全
      ……

    之前遇到过的一个情况,使用为知笔记Docker镜像作私有部署时,由于它不是使用docker compose编排的形式,而是所有应用打包成一个镜像,里面有个elastic search服务,占了很大内存,我却无法在其他程序复用这个服务。

    所以,建议使用docker compose作为容器编排管理工具,一个容器一个服务。

  • validate 验证 at 3周前

    使用nullable,例如:

    $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
        'publish_at' => 'nullable|date',
    ]);
  • 对现在感到迷茫 at 1个月前

    @勺颠颠 真的么?

  • 回复报错 at 1个月前
    @g-sabo 错误信息提示找不到这个表(上个课程没有这个表),排查一下哪里用到了models表吧
  • Laravel 日志有时候有权限有时候没有权限? at 1个月前

    问答:关于 file 缓存,偶尔出现 file_put_contents () error 的疑惑
    可以参考这个回答。在配置文件中配置日志文件的相关权限,具体方法在官方文档中配置的相关章节中有提到。

  • 回复报错 at 1个月前

    models表不存在

  • 怎么实现根据用户的客户端不同,选择不同的模版呢? at 1个月前

    可以封装view公用方法,模板文件名使用一定的规则区分PC和mobile,判断是mobile则修改传入的模板名,比如:topic -->mobile_topic

  • 6.0 版本的后台管理,缓存配之后报错 at 1个月前

    @Mengwei 这个管理后台可能就当做练习用用吧

  • 想问下这个后台真的有实用价值吗? at 1个月前

    价值不大,存在一个问题是:配置文件里写闭包,导致配置文件无法缓存,大概跟着做一遍就好。

  • 执行 PHP artisan config:cache 之后出现报错 at 1个月前

    试试先把各种缓存清理掉:php artisan optimize:clear

  • 邮箱不能接受验证信息问题 at 1个月前

    @272361997 看不出问题,可以从这几方面去排查:
    1.收件邮箱有问题,收件地址收不到邮件,或者邮件被放到垃圾箱
    2.发邮件服务器问题
    3.代码问题

  • 邮箱不能接受验证信息问题 at 1个月前

    看不出问题所在,最好提供更详细的信息,比如具体操作步骤。

  • 请问下,notifications 表中的数据写入逻辑在哪里呢 at 1个月前

    这个逻辑非常长,先扔结论,写在这里:
    \vendor\laravel\framework\src\Illuminate\Notifications\Channels\DatabaseChannel.php

    public function send($notifiable, Notification $notification)
    {
        return $notifiable->routeNotificationFor('database', $notification)->create(
            $this->buildPayload($notifiable, $notification)
        );
    }

    简要分析:
    假如从app\Observers\ReplyObserver.php开始

    public function created(Reply $reply)
    {
        $reply->topic->reply_count = $reply->topic->replies->count();
        $reply->topic->save();
    
        // 通知话题作者
        $reply->topic->user->notify(new TopicReplied($reply));
    }

    notify方法位于vendor\laravel\framework\src\Illuminate\Notifications\RoutesNotifications.php

    public function notify($instance)
     {
         app(Dispatcher::class)->send($this, $instance);
     }

    接着,send方法位于\vendor\laravel\framework\src\Illuminate\Notifications\ChannelManager.php

    public function send($notifiables, $notification)
     {
         return (new NotificationSender(
             $this, $this->container->make(Bus::class), $this->container->make(Dispatcher::class), $this->locale)
         )->send($notifiables, $notification);
     }

    这里面的send又位于\vendor\laravel\framework\src\Illuminate\Notifications\NotificationSender.php

    public function send($notifiables, $notification)
        {
            $notifiables = $this->formatNotifiables($notifiables);
    
            if ($notification instanceof ShouldQueue) {
                return $this->queueNotification($notifiables, $notification);
            }
    
            return $this->sendNow($notifiables, $notification);
        }

    关键看sendNow,位于vendor\laravel\framework\src\Illuminate\Notifications\NotificationSender.php

    public function sendNow($notifiables, $notification, array $channels = null)
        {
            $notifiables = $this->formatNotifiables($notifiables);
    
            $original = clone $notification;
    
            foreach ($notifiables as $notifiable) {
                if (empty($viaChannels = $channels ?: $notification->via($notifiable))) {
                    continue;
                }
    
                $this->withLocale($this->preferredLocale($notifiable, $notification), function () use ($viaChannels, $notifiable, $original) {
                    $notificationId = Str::uuid()->toString();
    
                    foreach ((array) $viaChannels as $channel) {
                        $this->sendToNotifiable($notifiable, $notificationId, clone $original, $channel);
                    }
                });
            }
        }

    注意到via方法,获取到的是通知类里面定义的,位于app\Notifications\TopicReplied.php

        public function via($notifiable)
        {
            return ['database', 'mail'];
        }

    所以通知的频道包含有database,将会存数据到notifications表。
    接着关注sendToNotifiable方法,

    protected function sendToNotifiable($notifiable, $id, $notification, $channel)
        {
            if (! $notification->id) {
                $notification->id = $id;
            }
    
            if (! $this->shouldSendNotification($notifiable, $notification, $channel)) {
                return;
            }
    
            $response = $this->manager->driver($channel)->send($notifiable, $notification);
    
            $this->events->dispatch(
                new Events\NotificationSent($notifiable, $notification, $channel, $response)
            );
        }

    存数据到数据库的动作包含在send方法中,而$channel是database的时候,send方法则是vendor\laravel\framework\src\Illuminate\Notifications\Channels\DatabaseChannel.php中的send方法:

        public function send($notifiable, Notification $notification)
        {
            return $notifiable->routeNotificationFor('database', $notification)->create(
                $this->buildPayload($notifiable, $notification)
            );
        }

    这就到达开头的结论。展开来,routeNotificationFor方法在\vendor\laravel\framework\src\Illuminate\Notifications\RoutesNotifications.php中:

    public function routeNotificationFor($driver, $notification = null)
        {
            if (method_exists($this, $method = 'routeNotificationFor'.Str::studly($driver))) {
                return $this->{$method}($notification);
            }
    
            switch ($driver) {
                case 'database':
                    return $this->notifications(); //<--
                case 'mail':
                    return $this->email;
            }
        }

    因为User模型和Notification是多态关系,其关联定义在:vendor\laravel\framework\src\Illuminate\Notifications\HasDatabaseNotifications.php中:

        public function notifications()
        {
            return $this->morphMany(DatabaseNotification::class, 'notifiable')->orderBy('created_at', 'desc');
        }

    所以,上面的send,大概操作就是:$user->notifications()->create($data),即把通知数据存到数据库中。

  • 微信消息类型判断,为什么表情包是 text? at 1个月前

    你可以return整个message(return $message),看看里面是什么

  • 使用 intervention 上传保存几 M 的图片就报错,上传几百 k 的就可以 at 1个月前

    看报错是图片格式不对,可打印一下$request->file('file')看看。

  • 磁盘使用 local 驱动,文件存储默认储存在那? at 1个月前
    @maogu $path = $request->file('avatar')->store('avatars', ['disk' => 'public']);