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

    Laravel如何监听sql执行语句???

    listen-sql 一个在控制台看到实时 sql 操作的工具

    安装

    1. 通过 composer 安装 (eleven26/listen-sql)。

    composer require "eleven26/listen-sql:~1.0.4" --dev

    2. 注册 Service Provider

    • Laravel: 修改文件 config/app.phpLaravel 5.5+ 不需要

      'providers' => [
          //...
          Eleven26\ListenSql\ListenSqlServiceProvider::class,
      ],
    • Lumen: 修改文件 bootstrap/app.php

      $app->register(Eleven26\ListenSql\ListenSqlServiceProvider::class);

    使用

    php artisan listen-sql:start

    到这一步,去页面刷新的时候,就可以在控制台看到 sql 语句了

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

    PHP项目开发中,CURD 时 是否有必要判断执行成功?

    异常的错误,代码块是不会继续执行了,除非使用try去捕捉,目前我使用的是全局异常处理方式。如果SQL都无法正确解析,我估计应该没测试。每条SQL都写判断感觉看着很难受

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

    Laravel 请教下文档中关于 $fillable 的问题?

    1. 可以在迁移文件里写数据库的时候设置一个默认值

    $table->string('xxxx')->default('');

    2. 可以将 config/database.php 文件内的 mysql 设置里面有个 strict 改成 false

    应该可以解决你的问题

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

    C语言 正则表达式结果不对?

    ~~ 好吧,众审真是个扯淡的功能。
    使用正则表达式最好使用c++11提供的raw string去除转义字符的干扰。
    还有题目的标签是非常重要的,不要乱贴。。

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

    C语言的条件表达式从右向左结合怎么理解

    先说结合性

    严格地讲 C 语言本身没有结合性(与优先级)的概念。它的语法是用 BNF (wiki)表示的。为了便于学习者理解,会提到左结合、右结合,但是它描述有些复杂的运算符的时候有些困难,比如 ?: 。

    z = (a == b ? a : b ? c : d);

    C 语言关于 ?: 的语法是这样定义的:

    conditional-expression : logical-OR-expression ? expression : conditional-expression

    ? 前面是一个 "logical-OR-epxression",而 a==b ? a : b 不能解释为 "logical-OR-expression" 。所以,没有 () 的情况下,不会将 a==b ? a : b 结合在一起。

    a = b = c

    关于 "assignment expression" ,有如下规则:

    assignment-expression : unary-expression assignment-operator assignment-expression

    "assignment-operator" 左侧必须是一个 "unary-epxression" 。a 是 unary-expression ,但是 a = b 不是。所以必然后右侧的 b = c 结合为一个 "assignment-epxression" 。

    所有的规则可以参考 C11标准草案 附录A 。

    再说执行顺序

    C 语言并不是先结合在一起的就会先执行的。

    在同一个表达式内,除非有特殊规定,或者有依赖,否则求值顺序是不一定的。

    对于

    conditional-expression : logical-OR-expression `?` expression `:` conditional-expression

    其中的 logical-OR-expression 一定是最先执行的。然后,根据其结果,选择 expression 与 conditional-epxression 之一执行。

    在这里,

    c == 0? printf("1\n"):(c=2)?(c = 3):printf("4\n")

    c==0 先执行,然后(由于其结果是 true)执行 printf("1\n") 。

    (c=2)?(c = 3):printf("4\n") 虽然被结合在了一起,但是作为外层 ?: 的一部分,根本没有执行。

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

    Promise的done方法实现里面,setTimeout是什么作用?

    就是下一帧里再执行,因为即便倒计时是0或者缺省,它也要走setTimeout的流程,就是将任务加到等待队列,等主线程将当前事情执行结束再去检查等待队列。
    比如:

    setTimeout(() => { console.log(1) }, 0); console.log(2)

    输出为:

    2
    1
  • 董俊俊 回答了问题
    3个月前

    Promise的done方法实现里面,setTimeout是什么作用?

    这个你要和 catch 函数一起理解,任何的 catch 实现都会包一层 try-catch ,如果你这里直接抛错误,就会直接被 catch 掉,不能抛出去,所以需要包一个 settimeout 来达到目的,至于为什么异步函数错误不会被当前 try-catch 捕捉,那是因为异步函数的实际上不在当前的执行队列里,而是会放在后面,所以当前的 try-catch 无法捕捉到。

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

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

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

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

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

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

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

    是用延时队列去操作的

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

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

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

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

    怎么让 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 中大量存在,我以为只需要提醒下别人就知道怎么做了

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

    怎么让 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);
  • 董俊俊 回答了问题
    3个月前

    类似 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 的摆在你面前,你是否要去接纳呢?好了,好话不多说,剩下的自己去慢慢体会

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

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

    • 使用 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 

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

    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');
    }
  • 董俊俊 回答了问题
    3个月前

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

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

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

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

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

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

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

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

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

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

    属于 Category 类 当前 id =Category id

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

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

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

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

最近访客
  • 小花花
    小花花 4周前