laravel使用总结(一)

路由

单个路由

  • Route::get($uri, $callback);
  • Route::post($uri, $callback);
  • Route::put($uri, $callback);
  • Route::patch($uri, $callback);
  • Route::delete($uri, $callback);

路由群组

Route::group(['namespace'=>'Admin','prefix'=>'api'],function() {
    //Admin 命名空间 api 路由前缀
    Route::post('/admin/test1', 'AdminController@tes1');
    Route::get('/admin/test2', 'AdminController@tes2');
    Route::get('/admin/test3', 'AdminController@test3');

    Route::group(['middleware' => ['login.auth']], function () {
        // 使用 login.auth 中间件
        Route::Get('/admin/index', 'TestController@index');
        Route::Put('/admin/update', 'MemberController@update');
        Route::post('/admin/store', 'MemberController@store');
    });
});

中间件

1.使用命令生成中间件

php artisan make:middleware checkAge 

2.会在 app/Http/Middleware 目录下生成 checkAge.php,可以在handle方法中判断参数是否合法 或者做登录验证

<?php

namespace App\Http\Middleware;

use Closure;

class checkAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $input = $request->input();
        if(!isset($input['age']) || $input['age']>120){
            $return_value = array(
                'code'      =>config('statuscode.parameter_error'),
                'message'   =>'error',
            );

            return response()->json($return_value);
        }
        
        return $next($request);
    }
}

3. 还需要在Kernel.php文件中注册这个中间件

protected $routeMiddleware = [
        'checkAge'=>\App\Http\Middleware\AuthorityAuth::class,
    ];

控制器

1.使用命令生成中间件,控制器会默认生成到 App\Http\Controllers 目录下,并且会自动生成Admin控制器

php artisan make:controller Admin/LoginController.php

2.关于控制器的命名空间

默认情况下,RouteServiceProvider 中载入 routes.php 文件,并且该路由群组指定定了群组中路由控制器所在的命名空间。如果你在 App\Http\Controllers 目录下选择使用 PHP 命名空间嵌套或组织控制器,只需要使用相对于App\Http\Controllers 命名空间的指定类名即可。因此,如果你的完整控制器类是App\Http\Controllers\Admin\LoginController,你可以像这样注册路由:

    Route::get('foo', 'Admin\LoginController@method');

响应

1.引入相应相关包

    use Illuminate\Support\Facades\Response;

2.返回json和jsonp数据

return response()->json($return_value);
return response()->jsonp($return_value);

3.添加响应头

return response($content)
    ->header('Content-Type', $type)
    ->header('X-Header-One', 'Header Value')
    ->header('X-Header-Two', 'Header Value');

3.添加Cookie

return response($content)
    ->header('Content-Type', $type)
    ->cookie('name', 'value', $minutes);

参数验证

1.使用命令生成验证文件 会在app/Http/Requests 目录下生成 LoginRequest.php文件

php artisan make:request LoginRequest

2.修改验证文件 rules方法为验证规则,response为验证失败返回的数据

    public function authorize()
    {
        return true;
    }

    public function response(array $errors)
    {
        $fields = array();
        foreach($errors as $key=>$error){
            
        }

        $return_value = array(
            'code'      =>config('statuscode.parameter_error'),
            'fields'    =>$fields
        );
        return response()->json($return_value);
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'data.param1'   =>'required',
            'data.param2'   =>'required|in:1,2,3',
            'data.param3'   =>'required',
        ];
    }

3.引入验证文件 需要将默认的参数类型替换为LoginRequest

use App\Http\Requests\LoginRequest.php;

public function login(LoginRequest $request){
    
}

    

异常捕获

目录/app/Exceptions下有一个Handle.php文件 这里可有两个方法可以捕获异常 
  • report 方法用于记录异常或将其发送到外部服务
$reflector = new \ReflectionClass($exception);

        $exception_name =  $reflector->getShortName();

        if($exception_name !== 'ValidationException'){
            $file = $exception->getFile();
            $line = $exception->getLine();
            $message =  $exception->getMessage();

            $error = array(
                'exception_name'    =>$exception_name,
                'uri'               =>\Request::getRequestUri(),
                'file'              =>$file,
                'line'              =>$line,
                'message'           =>$message,
            );


            ExceptionLog::error('Exception',$error,'exception');
        }
  • render 方法负责将异常转换成 HTTP 响应发送给浏览器
        $reflector = new \ReflectionClass($exception);

        $exception_name =  $reflector->getShortName();
        $file = $exception->getFile();
        $line = $exception->getLine();
        $message =  $exception->getMessage();

        $exception_value = array(
            'code'      =>config('statuscode.fail_server'),
            'fields'=>array(
                'server_error'=>array(
                    'field'     =>'server_error',
                    'message'   =>$message,
                    'file'      =>$file,
                    'line'      =>$line
                )
            )

        );

        $return_value = array(
            'code'      =>'500',
            'message'   =>'/error?code=500',
            'file'      =>$file,
            'line'      =>$line,
            'error_message'   =>$message,
        );
        return response()->json($return_value);

自定义 Artisan 命令行工具

生成文件

php artisan make:command Task #app/Console/Commands目录下会生成一个Task.php文件

打开文件 并编辑 修改文件如下

protected $signature = 'Task:Calculate';    ##命令
protected $description = 'Calculate Data';  ##描述

public function handle()
    {
        sleep(1);
        echo "Calculate Data"; ##计算任务
    }

注册命令

## 编辑 app/Console/Kernel.php
protected $commands = [
        \App\Console\Commands\Task::class
    ];

查看命令

root@ubuntu:/www# php artisan --list | grep Task
 Task
  Task:Calculate       Calculate Data

运行命令

php artisan Task:Calculate ##输出calculate data

Service Provider

laravel 实现了 IOC注册了特定的服务 这里通过curl插件做一下演示
服务提供者需要在每个环境下都要加载,只要把它放在这个数组下面就可以了

1.安装

 composer require ixudra/curl ##通过composer安装插件

2.注册服务

Ixudra\Curl\CurlServiceProvider::class ##编辑 config/app.php文件 在providers文件中添加服务

3.使用

use Ixudra\Curl\Facades\Curl;

$response = Curl::to('http://local.laravel.com/api')
        ->get();

任务调度

利用linux的crontab 可以部署不同的任务 如果有多个任务需要部署 则需要编辑多个crontab任务 

laravel的 app/Console/Kernel.php文件 提供了一个 schedule 方法 这里可以定义不同的时间 执行不同的命令
//每天凌晨2点执行计算任务
$schedule->command('Task:Calculate')
    ->withoutOverlapping()
    ->dailyAt('2:00');
    
//每小时执行计算任务
$schedule->command('Task:Calculate')
    ->hourly();    

注册服务 监听sql

希望根据不同环境加载 则编辑app/Providers/AppServiceProvider 文件
public function register()
{
    

    if ($this->app->environment() !== 'production') {
       $this->dbQuerySql();;
    }
    
    public function dbQuerySql(){
        \DB::listen(
            function ($sql) {
                
                foreach ($sql->bindings as $i => $binding) {
                    if ($binding instanceof \DateTime) {
                        $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
                    } else {
                        if (is_string($binding)) {
                            $sql->bindings[$i] = "'$binding'";
                        }
                    }
                }
    
                if(env('DEBUG_SQL_INSERT')){
                    //只记录 insert sql语句
                    $sql_type = strstr($sql->sql,"insert");
                    if(!$sql_type)
                        return;
                }
                $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);
    
                $query = vsprintf($query, $sql->bindings);
    
                $log = array(
                    'query'=>$query,
                );
    
                Log::debug('sql_log',$log,'sql_log');
            }
        );
    }    
}
    

队列

laravel实现了队列服务 目的是将耗时的任务延时处理 从而尽快返回请求 队列支持数据库,Redis等类型。 配置文件在config/queue.php文件中

使用数据库来驱动队列

创建数据库

php artisan queue:table //生成数据库队列的 migration
php artisan migrate //创建该数据库队列表

创建队列

 php artisan make:job SleepJob
队列创建完成之后 会在app/Jobs目录下生成一个SleepJob.php文件
public function handle()
{
    //在handle方法中执行耗时操作
    $value = array(
        'time'=>date('Y-m-d H:i:s')
    );
    file_put_contents('./tmp.log',json_encode($value).PHP_EOL,FILE_APPEND);
    sleep(2);  
}

执行队列

dispatch(new \App\Jobs\SleepJob());

修改配置 异步执行job

  • 编辑.env文件QUEUE_DRIVER=database

查看jobs表数据

{
    "displayName":"App\Jobs\SleepJob",
    "job":"Illuminate\Queue\CallQueuedHandler@call",
    "maxTries":null,
    "timeout":null,
    "data":{
        "commandName":"App\Jobs\SleepJob",
        "command":"O:17:"App\Jobs\SleepJob":4:{s:6:"*job";N;s:10:"connection";N;s:5:"queue";N;s:5:"delay";N;}"
    }
}

消费队列数据

$ php artisan queue:work
 Processing: App\Jobs\SleepJob
队列数据执行完成之后 会自动从数据库中移出

重启队列

队列的数据 只会加载一次 如果修改了代码则需要重启队列
$ php artisan queu:restart
Broadcasting queue restart signal.

守护进程Supervisor

为了防止队列挂掉 则可以配合守护进程
posted @ 2018-01-01 10:49  alin_qu  阅读(987)  评论(0编辑  收藏  举报