董俊俊 的个人动态
  • 董俊俊 回答了问题
    9个月前

    用git reset撤回了提交,然后同步到了远端仓库,其他人怎么更新回退?git pull没有更新

    git pull 下来的修改是在origin/master上,因为其他人的提交在这个之后,所以不会默认合并。如果需要的话可以强制与远程版本一致:git reset --hard origin/master

    注意:这个会将其他人的本地修改回退。非常不建议在提交远程仓库之后通过git reset --hard回退!!!

  • 董俊俊 回答了问题
    9个月前

    微信红包过期 24 小时后自动返回, 是怎么做到的

    我之前做的一个红包过期退款功能

    是用延时队列去操作的

    红包创建成功后,将红包放进一个延时队列 

    onQueue('bounce')->delay(Carbon::now()->addHours(24))

    即 24 小时后去执行这个队列任务,在任务中去查下这个红包是否被领完,没领完就去退返余额,领完就不做任何操作

  • 董俊俊 回答了问题
    9个月前

    怎么让 Laravel 5.3 支持多个 mail driver,并且能在运行中切换?

    我下面详细列一下,以供参考。

    1. Laravel 内置的几种发送邮件的方法:MailerMailableMailableMailerNotification MailChannel ,每种方式都有其对应的 send 和 queue 方法。但是所有的 send 和 queue 都最终调用了 Mailer::send 来执行发送。你可以跟踪下它们的源代码,最终就跑到同一个地方了。所以我们只需要重写 Mailer::send 这一处就可以扩展(自定义)整个 Laravel Mailer 系统的发送功能了。
    2. 具体点我们要重写的是 Mail::sendSwiftMessage 这个方法,把 $this->swift 这一处改成我们的,比如 $this->getSwiftMailerForMessage($message)->send(....); 其他地方都不用动。
    3. 我们新增加的这个 getSwiftMailerForMessage 方法可以写到 Mailer 类中,就像你代码中那样。我在上面的回复里提到了『建议缓存 SwiftMailer』的意思是在自定义的 Mailer 中维护一个数组保存已经创建过的 SwiftMailer 实例。或者更好的方式是创建一个 SwiftMailerManager 类,逻辑分离。Laravel 中大量使用了这种 Manager 类,例如 AuthManager, FilesystemManager, 或者最终执行邮件发送的 TransportManager 等,都是为了实现「多实例」场景。 你随便找一个系统的 Manager 看看代码,实现一个 Manager 非常简单。我们的 SwiftMailerManager 就是根据 name 和 name 对应的配置文件来创建并缓存 SwiftMailer 实例。
    4. 自定义 MailServiceProvider 可以继承它,或者使用我们的 AppServiceProvider,AppServiceProvider 的 register 中 $this->app->singleton('mailer', ...), 因为 AppServiceProvider 是在系统的 MailServiceProvider 之后(config/app.php 的 providers 数组中),所以 AppServiceProvider 会覆盖掉系统的 app ('mailer') 注册行为,系统的 mailer 单例也不会生成的。建议使用我们的 AppServiceProvider 而不是继承 MailServiceProvider ,有一个好处是不用关心 MailServiceProvider 到底干了什么,或者哪天它把你重载的方法修改了或移除了,你都不用操心他。使用 AppServiceProvider 没有耦合。
    5. 一个 SwiftMailer 对应一个 transport,可以说他两之间是一对一的关系。所以扩展的话应该是创建多个 SwiftMailer ,跟其内部的 transport 没有关系。也不要调用 TransportManager 的 setDefaultDriver 来改变默认的 transport。合理的做法是创建 SwiftMailer 时,根据 SwiftMailer 的配置找到需要的 transport driver,然后调用 TransportManager 的 driver($name) 来获取需要的 transport。这部分功能就是在上面说的 SwiftMailerManager 里做的。这样下来的结果是 SwiftMailer 和 具体使用的 transport 都可以配置了,类似系统的其他管理类,比如 database, 支持多个 connection 每个 connection 又可以灵活配置其 driver。所以我们的 SwiftMailerManager 同时支持多个邮件服务商,同一邮件服务商支持多个不同账号,运行时也可以随意切换:根据收件人地址选择国内还是国外的服务商(transport driver) 或者同一服务商的不同账号(比如申请 100 个免费额度的账号:laughing: )。 当然,对于切换账号这种行为可能就不需要再新建 swift+transport 了,替换现成的也可以,这就属于优化范畴了。
    6. 缓存创建的 SwiftMailer 对象。尤其是对于队列,创建的 SwfitMailer 对象可能不止一次被使用到。 SwiftMailerManager 已经自带缓存。如果要在自定义的 Mailer 中管理 SwiftMailer 实例,定义一个数组即可,比如 protected $swiftMailers = [];,然后在 __construct 中加入默认项 $this->swiftMailers['default'] = $this->swift; 上面提到的 getSwiftMailerForMessage 方法判断 $message 逻辑后会从这个数组中获取 SwiftMailer 实例,如果不存在就创建并缓存到 $swiftMailers 数组中。
    7. 如果是使用 SwiftMailerManager. 可以把 app('swift.mailer') 和 app('swift.transport') 的 register 也重写掉,使用 SwiftMailerManager 的 defaultDriver 即可。
    8. Mailer 中要发送的 $message 包含了所有邮件数据,具体方法请查看 Swift_Message 。获取收件地址的方法是 getTo(),在 Mailer 里处理这块东西, getTo() 是最恰当的方式。
    9. 建议做成一个独立的扩展包,并将其开源 :)

    以上就是我上一个回复的具体实现。总结下就是:

    • 创建 SwiftMailerManager ,其根据配置文件或 customCreator 创建、缓存、管理 SwiftMailer 实例。
    • 继承 Mailer 重写 $this->swift 部分,在 AppServiceProvider 中注册并替换 app('mailer') 单例。

    这样扩展后,外部调用方没有学习和使用成本,系统的所有发送邮件方式都兼容。有一点迁移工作就是把以前的 mail.config 改成多 driver 的 mail.config 。

    p.s. 这种架构在 Laravel 中大量存在,我以为只需要提醒下别人就知道怎么做了

  • 董俊俊 回答了问题
    9个月前

    怎么让 Laravel 5.3 支持多个 mail driver,并且能在运行中切换?

    可以从手动设置 mail config 入手

       $mail=DB::table('mail_settings')->first();
      $config = array(
                   'driver' => $mail->driver,
                   'host' => $mail->host,
                   'port' => $mail->port,
                   'from' => array('address' => $mail->from_address, 'name' => $mail->from_name),
                   'encryption' => $mail->encryption,
                   'username' => $mail->username,
                   'password' => $mail->password,
                   'sendmail' => '/usr/sbin/sendmail -bs',
                   'pretend' => false
               );
       Config::set('mail',$config);
  • 董俊俊 回答了问题
    9个月前

    类似 Laravel 框架这样显式路由的写法真的好吗?

    Laravel 给了你更多的自由,但是你不想要自由,我还有什么好说的?

    1. Route 和 Controller 是两个东东,为什么一定要绑定在一起?
    2. 有些场景根本不需要 Controller 啊,比方说一个静态页面,这时候你去定义一个 Controller 是不是多此一举?
    3. 如果同一个 Controller 的方法需要被多个路由共用呢?
    4. 如果你是在开发 RESTFUL API,你描述的隐式路由怎么体现 HTTP 动词?
    5. Route 多了你可以分文件甚至分文件夹管理啊,Laravel 并有没有强制要求你只使用一个 route.php。
    6. 你需要快速定位你的 controller,你可以把 uri 注释在方法头部,然后全局搜索不就好了?
    7. Route 和 Controller 更应该发挥好自己的职责,而不要抢了他人的风头,不然就混乱了。
    8. Laravel 的 Route 有分组、中间件、别名、前缀等等诸多优秀的特性,你应该多关注这些。
    9. ...

    所以,你只是习惯了以前的 Route,现在有一种更优秀 Route 的摆在你面前,你是否要去接纳呢?好了,好话不多说,剩下的自己去慢慢体会

  • 董俊俊 回答了问题
    9个月前

    问下研究过【附近的人】功能的朋友,你的解决是什么?

    • 使用 Redis GEO
    • mysql 就能搞定,
      算法的问题用勾股定理
      假设中心点的坐标为 (a, b)

      select sqrt (ABS((x - a)*(y - b))) as distance
      where distance <= 50
      order by distance
    • MongoDB
    • 印象中几年前国家电网的内网 GIS 系统是用 PostgreSQL 实现。
    • PostgreSQL+PostGIS 这种之前也有听到过。 
    • ElasticSearch 和 PostgreSQL 也支持 Geo 特性
    • 用过 ElasticSearch,专业做搜索,还能配合其他的查询、排序、聚合功能。

    原来看到了 http://www.cocoachina.com/ios/20141118/102... 又看到了 https://github.com/mjaschen/phpgeo 

  • 董俊俊 回答了问题
    9个月前

    Laravel 为什么从控制器调用 model 的时候 不能先调用 where 语句?

    文章里写的是错的,所以运行出来就有问题了。

    因为没有购买看不到文章里的内容,但是根据你们的回复看到示例代码是这样的。

    出错的代码在这行:

    $query = $this->recent();

    运行这行代码会出现什么效果呢?就是你会得到一个新的 Illuminate\Database\Eloquent\Builder 对象,所以之前的 where 条件会丢失。所以正确的写法应该是:

    public function scopeWithOrder($query, $order)
    {
        switch ($order) {
            case 'recent':
                $query->recent();
                break;
    
            default:
                $query->recentReplied();
                break;
        }
    
        return $query->with('user', 'category');
    }
  • 董俊俊 回答了问题
    9个月前

    感觉 hieu-le/active 这个组件并没有多方便啊?

    我觉得更方便的地方在于
    if_route () - 判断当前对应的路由是否是指定的路由;
    if_route_param () - 判断当前的 url 有无指定的路由参数。
    if_query () - 判断指定的 GET 变量是否符合设置的值;
    if_uri () - 判断当前的 url 是否满足指定的 url;
    if_route_pattern () - 判断当前的路由是否包含指定的字符;
    if_uri_pattern () - 判断当前的 url 是否含有指定的字符;
    拥有这些吧

  • 董俊俊 回答了问题
    9个月前

    Laravel 关联模型的 migration 中,没有采用外键约束

    要避免这类错误的发生,只需要在关联数据删除时,基于业务逻辑做联动删除即可。例如删除话题时,将所属的回复删除;或者是删除用户时,将用户发布过的话题和回复删除。

    从实现的机制来看,可以有分以下两种类型:

    • 代码监听器 —— 利用 Eloquent 监控器 的 deleted 事件连带删除,好处是灵活、扩展性强,不受底层数据库约束,坏处是当删除时不添加监听器,就会出现漏删;
    • 外键约束 —— 利用 MySQL 自带的外键约束功能,好处是数据一致性强,基本上不会出现漏删,坏处是有些数据库不支持,如 SQLite。

    如果使用的是 MySQL 或者其分支,我们一般会选择『外键约束』的方式来实现。当然,如果业务上有特殊的逻辑,就会优先考虑代码监听器的灵活性。

  • 董俊俊 回答了问题
    9个月前

    Laravel 一对一关联模型的问题?

    属于 Category 类 当前 id =Category id

  • 董俊俊 回答了问题
    9个月前

    大家有没有发现如果用 larabbs.dev 就会出现 your connection is not secure?

    因为 Chrome 在某个版本更新之后就会强制把.dev 的域名跳转到 HTTPS,所以现在推荐使用.localhost .invalid .test 或者 .example,详情看 Laravel News 的报道

    https://laravel-news.com/chrome-63-now-for...

  • 董俊俊 回答了问题
    9个月前

    如何让 Bootstrap 分页尺寸适应手机屏幕 ?

    手机的很少用页码吧,都是上一页,下一页,最多给你一个跳转页码。

    Laravel中有简单分页的方法,可以试一下

  • 董俊俊 回答了问题
    9个月前

    Laravel-debugbar 需要账号密码?

    由于 GitHub 对其 API 的速率限制,可能会发生 Composer 提示身份验证,询问您的用户名和密码,以便它可以继续其工作。
    如果您不希望向 Composer 提供 GitHub 凭据,可以使用以下过程手动创建令牌:
    在 GitHub 上创建 OAuth 令牌。
    将其添加到正在运行的配置中 composer config -g github-oauth.github.com
    现在 Composer 应该安装 / 更新而不要求身份验证。

    最简单的方式,把中文镜像改回来,使用原来的,

  • 董俊俊 回答了问题
    9个月前

    批量获取微信用户信息,在循环中多次请求微信url链接,带上的access_token失效

    加上判断,失效时重新获取Access token
    可能有次数限制?

  • 董俊俊 回答了问题
    9个月前

    求教 Python 练习,单词排序

    只输入一个单词的时候 last word 一定是 z 对吧?
    因为你只输入一个单词的时候一定不会运行最后一个判断,你需要把倒数第二个 continue 删掉,无论前一个条件是真是假都应该判断这个单词是不是出现在单词表最后的单词

  • 董俊俊 回答了问题
    9个月前

    求教 Python 练习,单词排序

    或者直接把你这段代码后面的两个 continue 去掉不就好了…

  • 董俊俊 回答了问题
    9个月前

    求教 Python 练习,单词排序

    把用户输入的词放到一个 list 里面,然后在输出的时候先把 list 排序,然后输出第一个和最后一个

  • 董俊俊 回答了问题
    9个月前

    PHP 能否读取.db 文件?

    php 用 sqlite 读啊,好像微信 sqlite 是加密

最近访客
  • 小花花
    小花花 3个月前