Laravel框架实现404页面500页面友好提示

0x01 背景

  程序开发的时候,我们开发者都会开启debug,来调试程序,以及打印我们想看到的数据。但是当项目上线的时候,如果再开启debug,那就是在给广大的黑客们开启属于他们的机会了。虽然Laravel框架关闭debug后就不会将报错信息显示在页面上,但是也并不美观。而且纯英文的提示在国内来看也并不太好。所以这个时候就需要做友好的提示页面了

0x02 正文

  1. 要实现友好提示其实就是抓取每个页面的状态码,如果不是200,那么就根据状态码进行区分返回404或者500页面

  2. Laravel框架中有一个默认抓取并返回报错信息的文件,

app\Exceptions\Handler.php

  1. 我们来修改一下这个文件的render方法

    public function render($request, Exception $e)
    {
        if ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        }

        $debug = config('app.debug', false);  // 判断debug是否开启
        if (empty($debug)) {  // 如果debug关闭
            $result = method_exists($e, 'getStatusCode');
            if (!empty($result)) {
                // 404友情提示
                $statusCode = $e->getStatusCode();
                if ($statusCode == 404) {
                    return response()->view('error', [
                        'info' => '抱歉,指定的页面不存在.',
                        'url' => '/',
                        'code' => 404,
                        'msg' => 'Sorry, page not found.'
                    ]);
                }
            } else {
                // 出现错误提示
                return response()->view('error', [
                    'info' => '抱歉,好像出错了.',
                    'url'  => '/',
                    'code' => 503,
                    'msg'  => 'Error,It have been wrong.'
                ]);
            }
        } else {
            // 如果开启debug模式
            return parent::render($request, $e);
        }

    }

0x03 结语

error是实现做好的模板,直接调用即可。

Laravel条形码/二维码生成实战实例

0x01 安装

使用composer直接拉取组件milon/barcode

laravel 5.0/5.1

composer require milon/barcode 5.1

laravel 5.2/5.3/5.4

composer require milon/barcode 5.3

然后在config/app.php增加

'providers' => [
    ...
    Milon\Barcode\BarcodeServiceProvider::class,
    ...
]

如果需要更改配置直接使用命令

php artisan vendor:publish

添加别名

'aliases' => [
    ...
    'DNS1D' => Milon\Barcode\Facades\DNS1DFacade::class,
    'DNS2D' => Milon\Barcode\Facades\DNS2DFacade::class,
]

该组件支持的条形码类型:
PDF417,C39,C39 +,C39E,C39E +,C93,S25,S25 +,I25,I25 +,C128,C128A,C128B,C128C等等

0x02 使用

laravel 5.2/5.3/5.4在use进DNS1D和DNS2D之后,直接就可以使用

echo DNS1D::getBarcodeSVG("4445645656", "PHARMA2T");
echo DNS1D::getBarcodeHTML("4445645656", "PHARMA2T");
echo '<img src="data:image/png,' . DNS1D::getBarcodePNG("4", "C39+") . '" alt="barcode"   />';
echo DNS1D::getBarcodePNGPath("4445645656", "PHARMA2T");
echo '<img src="data:image/png;base64,' . DNS1D::getBarcodePNG("4", "C39+") . '" alt="barcode"   />';
echo DNS1D::getBarcodeSVG("4445645656", "C39");

laravel 5.1需要进行单例引入才可以使用

 private static $DNS1D;

/**
 * PrintController constructor.
 * @param DNS1D $DNS1D
 */
public function __construct(DNS1D $DNS1D)
{
    self::$DNS1D = $DNS1D;
}

然后再使用

echo '<img src="data:image/png,' . self::$DNS1D->getBarcodePNG("425X5", "C128") . '" alt="barcode"   />';

现在就出现条形码了

jQuery获取input提交的数组的值

在我们开发中,input中name的名字,如果使用name="jQueryArray[]"的形式,最后取值的时候是一个数组。例如:

<input type="text" name="jQueryArray" value="1111"/><br/>  
<input type="text" name="jQueryArray" value="1221"/><br/>  
<input type="text" name="jQueryArray" value="1331"/><br/>  

这时候使用:

$("input[name='jQueryArray']");

可以将所有name为jQueryArray的input框的值取出来,并且可以for循环将所有的值取出来,但是对于习惯使用jQuery中的val()来取值的我们却发现,这里如果使用

$("input[name='jQueryArray']")[0].val();

来取值会报错。

这是因为这个时候取出来的是一个input对象,所以我们可以使用原生js来取值,也就是:

$("input[name='jQueryArray']")[0].value;

当然,如果您非要使用val()来取值也是可以的,但是这里就需要将input对象转换为jQuery对象:

$($("input[name='ajaxOrderId']")[0]).val();

当然还可以

$("input[name^='jQueryArray']").each(function(i){
    if(i == 2) {
         alert(this.value);
     }
});

利用jQuery的each()函数来进行循环,获取其中的值。注意的是这里的this是原生DOM对象。

Laravel消息队列异步执行-发送邮件

0x01 配置

1、修改.env,我这里是采用的数据库,一般是用的异步服务器或者redis。我这里只是用作测试

QUEUE_DRIVER=database

2、添加数据库,执行

php artisan queue:table

php artisan queue:failed-table

php artisan migrate  

3、创建队列任务,我这里使用的是发送邮件的例子

php artisan make:job SendReminderEmail

0x02 控制器

use Mail;
use App\Jobs\SendReminderEmail;  

public function email()
{
        $datas = \DB::table('data_email')->get();
        foreach($datas as $data){
            dispatch(new SendReminderEmail($data->name,$data->email));
        }
        return redirect('/users');
}

0x03 队列文件
编辑队列文件SendReminderEmail.php

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mail;

class SendReminderEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $name;
    protected $email;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($name, $email)
    {
        $this->name = $name;
        $this->email = $email;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

        // 如果参试大于三次
        if ($this->attempts() > 3) {
            \Log::info($this->name.'邮件参试失败过多');
        }else{
            // 每次进来休息3秒钟
            sleep(3);
            $flag = Mail::send('emails.test',['name'=>$this->name],function($message){
                $message ->to($this->email)->subject('邮件测试');
            });
            echo $this->name;
            if($flag){
                \Log::info($this->name.'邮件发送成功');
            }else{
                \Log::info($this->name.'邮件发送失败');
            }
        }
    }

    public function failed()
    {
        \Log::error($this->name.'队列任务执行失败'."\n".date('Y-m-d H:i:s'));
    }
}

0x04 开始并查看记录

在网站根目录执行,开始监听:

 php artisan queue:listen

查看storage/logs/laravel.log

[2017-05-14 02:06:25] local.INFO: 亲6邮件发送成功  
[2017-05-14 02:06:30] local.INFO: 亲7邮件发送成功  
[2017-05-14 02:06:35] local.INFO: 亲1邮件发送成功  
[2017-05-14 02:06:40] local.INFO: 亲2邮件发送成功  
[2017-05-14 02:06:45] local.INFO: 亲3邮件发送成功  
[2017-05-14 02:06:50] local.INFO: 亲4邮件发送成功  
[2017-05-14 02:06:55] local.INFO: 亲5邮件发送成功  

测试成功。。。。

Laravel原生SQL打印之SQL监听

0x01 创建SQL监听器

Laravel 5.1版本:

php artisan make:listener QueryListener --event=illuminate.query  

Laravel 5.2、5.3、5.4版本:

php artisan make:listener QueryListener --event=Illuminate\\Database\\Events\\QueryExecuted   

0x02 注册SQL监听事件

Laravel 5.1版本:

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 illuminate.query 事件的监听器为 QueryListener
头部引入 use App\Listeners\QueryListener;
protected $listen = [  
        'illuminate.query' => [
            QueryListener::class,
        ],
    ];

Laravel 5.2、5.3、5.4版本:

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 Illuminate\Database\Events\QueryExecuted 事件的监听器为 QueryListener

protected $listen = [  
        'Illuminate\Database\Events\QueryExecuted' => [
            'App\Listeners\QueryListener',
        ],
    ];

0x03 编写SQL打印逻辑代码
Laravel 5.1版本
编辑app/Listeners/QueryListener.php文件

/**
     * 日志打印方法.
     *
     * @param  illuminate.query  $event
     * @return void
     */
    public function handle($sql, $params)
    {
        // 如果env中属于本地开发则进入该判断
        if (env('APP_ENV', 'production') == 'local') {
            foreach ($params as $index => $param) {
                if ($param instanceof \DateTime) {
                    $params[$index] = $param->format('Y-m-d H:i:s');
                }
            }
            $sql = str_replace("?", "'%s'", $sql);
            array_unshift($params, $sql);
            // dd($params);
            \Log::info('SQL语句输出------------>'.call_user_func_array('sprintf', $params));
        }
    }

Laravel 5.2、5.3、5.4版本

/**
     * 日志打印方法.
     *
     * @param  illuminate.query  $event
     * @return void
     */
    public function handle(QueryExecuted $event)
    {
        if (env('APP_ENV', 'production') == 'local') {
            $sql = str_replace("?", "'%s'", $event->sql);

            $log = vsprintf($sql, $event->bindings);

            Log::info($log);
        }
    }

0x04 查看效果

打开storage/logs/laravel.log可查看到所有的SQL语句

[2017-05-14 00:43:22] local.INFO: select count(*) as aggregate from `data_users` where `status` = '1'  
[2017-05-14 00:43:22] local.INFO: select * from `data_users` where `status` = '1' order by `addtime` desc limit 10 offset 0