Keep Learning, Keep Running

批量删除git分支

删除除了master外的本地分支

git branch | grep -v "master" | xargs git branch -D

给你的网站加上公众号消息模板异常提醒吧

Laravel 拥有非常好的异常处理机制,所有的异常都会经过 App\Exceptions\Handlerreport 方法进行处理( 查看详情 )。

然而我所见过大部分公司或者组织,都没有很好的查看日志习惯,以至于有可能有一堆错误日志或者影响用户体验的地方却没有发现。

你可以选择邮件通知你的网站异常

public function report(Exception $exception)
{
    // 你也可以选择短信通知,土豪随意
    Sms::send($phone, [$exception]);
    // 比较传统的通知方式
    Mail::to($request->user())->send(new ExceptionNotify($exception));
    return parent::report($exception);
}

Continue Reading...

Speedy - 简洁灵活的 Laravel 管理后台

Speedy是基于 vue2 + bootstrap 的 laravel 管理后台,能够快速开发好一个权限后台,而且能够非常方便的生成一级或者二级菜单。

项目地址: https://github.com/HanSon/speedy

欢迎前来 star 以及提 issue !

file

安装

composer require hanson/speedy

Continue Reading...

laravel5.3的bug 无法在一个项目中使用多个同一数据库驱动

最近做项目掉进一个深坑,以至于一个小问题烦恼我两天以至于怀疑人生。

新项目需要连接两个mysql数据库,然而却出现无论如何也查询不了第二个数据库的情况。

经历了多次断点调试,google无止境搜索,询问印度阿三无果的情况下,也只能查看源码解决问题了。

最终发现在laravel的ConnectionFactory类的createConnection方法中有这么一段

protected function createConnection($driver, $connection, $database, $prefix = '', array $config = [])
{
    if ($this->container->bound($key = "db.connection.{$driver}")) {
        return $this->container->make($key, [$connection, $database, $prefix, $config]);
    }

    switch ($driver) {
        case 'mysql':
            return new MySqlConnection($connection, $database, $prefix, $config);
        case 'pgsql':
            return new PostgresConnection($connection, $database, $prefix, $config);
        case 'sqlite':
            return new SQLiteConnection($connection, $database, $prefix, $config);
        case 'sqlsrv':
            return new SqlServerConnection($connection, $database, $prefix, $config);
    }

    throw new InvalidArgumentException("Unsupported driver [$driver]");
}

$this->container->bound($key = "db.connection.{$driver}") 通过driver去跟容器做了绑定,也就是当你有第二个一样driver的数据库时,调用 $this->container->make()方法也会同样返回第一个绑定的 connection,这样无论如何也只能查询第一个了。

修改后

if ($this->container->bound($key = "db.connection.{$driver}.{$config['name']}")) {
    return $this->container->make($key, [$connection, $database, $prefix, $config]);
}

通过传入connection自定义的名称,能够避免重复

只可惜我提PR时对方表示5.3不作bug修复,很诧异。。。

PR在此
issue在此

微信一键自动拜年脚本

项目链接 https://github.com/HanSon/vbot

git clone https://github.com/HanSon/vbot.git
cd vbot
composer install
php example/bainian.php

此脚本可以对有设置备注名称的联系人进行发送,适用于备注名为真实姓名的联系人,同时可以设置白名单或者黑名单或者其他情况进行发送。

use Hanson\Vbot\Foundation\Vbot;
use Hanson\Vbot\Message\Entity\Text;

$robot = new Vbot([
    'tmp' => __DIR__ . '/./../tmp/',
    'debug' => true
]);

$robot->server->setCustomerHandler(function () {
    $whiteList = ['some remark name...', 'some remark name...'];
    $blackList = ['some remark name...', 'some remark name...'];
    contact()->each(function($item, $username) use ($whiteList, $blackList){
        // 发送白名单
        if($item['RemarkName'] && in_array($item['RemarkName'], $whiteList)){
            Text::send($username, $item['RemarkName'] . ' 新年快乐');
        }
        // 黑名单不发送
//        if($item['RemarkName'] && !in_array($item['RemarkName'], $blackList)){
//            Text::send($username, $item['RemarkName'] . ' 新年快乐');
//        }
        // 全部人发送
//        if($item['RemarkName']){
//            Text::send($username, $item['RemarkName'] . ' 新年快乐');
//        }
    });
    exit;
});

$robot->server->run();

当然,这只是一种娱乐方式,别过于执着,不喜勿喷

Vbot微信机器人,全自定义的灵活机器人

Vbot是基于微信web API实现的机器人,通过实现匿名函数能够实现多种自定义的效果

例如:

  • 消息转发

  • 红包提醒(有点鸡肋)

  • 留言统计

  • 自定义回复

  • 防撤回

  • 特殊关键词触发事件

等等,这里就不一一列举,可以参考 详细例子

安装

composer require hanson/vbot

使用

require_once __DIR__ . './../vendor/autoload.php';

use Hanson\Vbot\Foundation\Vbot;

function reply($reply){
    return http()->post('http://www.tuling123.com/openapi/api', [
        'key' => 'your tuling api key',
        'info' => $reply
    ], true)['text'];
}

$robot->server->setMessageHandler(function ($message) {
    // 文字信息
    if ($message instanceof Text) {
        // 联系人自动回复
        if ($message->fromType === 'Contact') {

            return reply($message->content);
            // 群组@我回复
        } elseif ($message->fromType === 'Group' && $message->isAt) {
            
            return reply($message->content);
        }
    }
});

$robot->server->run();

项目地址:https://github.com/hanson/vbot

文档地址:https://github.com/HanSon/vbot/wiki

欢迎大家提交issue和PR让vbot更加完善

也可以加我刚新建的QQ群进行交流:492548647

elasticsearch出现SearchPhaseExecutionException的解决方案

在使用elasticsearch时出现了异常,显示SearchPhaseExecutionException[Failed to execute phase [query], all shards failed]

解决方案为curl -XPUT 'localhost:9200/*/_settings' -d ' { "index" : { "number_of_replicas" : 0 } } '

原文出处

团队中使用git的正确姿势!

最近换到新公司后,对git又有更加深刻的认识了,git能够非常好的解决团队开发,解决冲突(配合JB[jetbrains]效果更棒)

谨记

无论如何,请在分支上开发,保持分支是干净的,仅有你这次任务的代码!

fork到自己的项目中

fork到项目中,然后从clone自己fork下来的任务,这样就能保证你每次都会push到自己的项目中

增加团队项目的地址

之后假若遇到冲突,是需要重新拉去团队项目的最新代码的,以及在新任务开始时,都需要从团队的master中创建分支

增加一个项目源 git remote add org git:***** org为你组织的名称,随便起名即可

创建属于这次任务的分支

开始任务前,第一件事就是为你即将开展的任务创建分支 git checkout -b yourbranch(必须要从项目的团队上线分支上checkout出来,例:org/master)

开发完本次任务后,不要急着push!不要急着push!不要急着push! 重要的事情说三遍

先commit,这样就能记录你本次任务所修改的文件

切换回自己的测试分支

一般团队也会有测试的分支,直接checkout 团队的测试分支即可

合并分支

切换后需要把你的开发分支merge进来

push!

这时候可以push了,要注意的就是请确保你push的是自己的项目源,一般是 origin ,因人而异

提交PR

如果没有任何冲突,这里会很流畅的显示能够自动合并,下方显示修改的文件只有你自己所修改的文件

不能自动合并怎么办?

这是通常是因为有人跟你在测试环境中修改了相同的文件,只要在你自己的测试分支中重新pull一下(记得是pull团队的测试分支),然后IDE就让你修改冲突,只要你修改完后就能重新提交了。

Windows下配置vagrant homestead环境

自从公司使用了vagrant后,觉得无比的舒服,便花一天时间在家也配置了一下

准备工作

先下载以下文件

virtualBox这里我是下载5.0.24的版本,至于为什么不下载最新的5.1.0,因为装了之后总是提示下载最新版本,4.* , 5.0.* ,就是没有提及5.1.0,便下载了5.0中最新的版本。

以上文件除了virtualBox外皆为当前最新版本(2016-7-17)
PS:请务必使用迅雷下载,毕竟迅雷有加速buff(别问我如何使用迅雷下载,问这话我觉得你应该转行了)


Continue Reading...

laravel 中 Facades的原理以及代码剖析

Facades

原理

In the context of a Laravel application, a facade is a class that provides access to an object from the container. The machinery that makes this work is in the Facade class. Laravel's facades, and any custom facades you create, will extend the base Illuminate\Support\Facades\Facade class.

A facade class only needs to implement a single method: getFacadeAccessor. It's the getFacadeAccessor method's job to define what to resolve from the container. The Facade base class makes use of the __callStatic() magic-method to defer calls from your facade to the resolved object.

简单来说,门面是通过一个魔术方法__callStatic()把静态方法映射到真正的方法上。

本文我们用Route来举例,

Route::get('/', function(){
    # 
}

Continue Reading...