laravel使用总结(一)


安装

composer create-project laravel/laravel learnlaravel5 --prefer-dist v5.3.*

安装成功之后会自动生成一个key

> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
The compiled class file has been removed.
> php artisan key:generate
Application key [base64:z6FDVhrWJfYFyjjFpJp3tmIsbqvcSAPHsHjDBN3oNpE=] set successfully.

查看目录

tree 

目录结果

├── app
│   ├── Console 
│   │   └── Kernel.php 
│   ├── Exceptions
│   │   └── Handler.php
│   ├── Http
│   │   ├── Controllers
│   │   │   ├── Auth
│   │   │   │   ├── ForgotPasswordController.php
│   │   │   │   ├── LoginController.php
│   │   │   │   ├── RegisterController.php
│   │   │   │   └── ResetPasswordController.php
│   │   │   └── Controller.php
│   │   ├── Kernel.php
│   │   └── Middleware
│   │       ├── EncryptCookies.php
│   │       ├── RedirectIfAuthenticated.php
│   │       └── VerifyCsrfToken.php
│   ├── Providers
│   │   ├── AppServiceProvider.php
│   │   ├── AuthServiceProvider.php
│   │   ├── BroadcastServiceProvider.php
│   │   ├── EventServiceProvider.php
│   │   └── RouteServiceProvider.php
│   └── User.php
├── artisan
├── bootstrap
│   ├── app.php
│   ├── autoload.php
│   └── cache
├── composer.json
├── config
│   ├── app.php
│   ├── auth.php
│   ├── broadcasting.php
│   ├── cache.php
│   ├── compile.php
│   ├── database.php
│   ├── filesystems.php
│   ├── mail.php
│   ├── queue.php
│   ├── services.php
│   ├── session.php
│   └── view.php
├── database
│   ├── factories
│   │   └── ModelFactory.php
│   ├── migrations
│   │   ├── 2014_10_12_000000_create_users_table.php
│   │   └── 2014_10_12_100000_create_password_resets_table.php
│   └── seeds
│       └── DatabaseSeeder.php
├── gulpfile.js
├── package.json
├── phpunit.xml
├── public
│   ├── css
│   │   └── app.css
│   ├── favicon.ico
│   ├── index.php
│   ├── js
│   │   └── app.js
│   ├── robots.txt
│   └── web.config
├── readme.md
├── resources
│   ├── assets
│   │   ├── js
│   │   │   ├── app.js
│   │   │   ├── bootstrap.js
│   │   │   └── components
│   │   │       └── Example.vue
│   │   └── sass
│   │       ├── app.scss
│   │       └── _variables.scss
│   ├── lang
│   │   └── en
│   │       ├── auth.php
│   │       ├── pagination.php
│   │       ├── passwords.php
│   │       └── validation.php
│   └── views
│       ├── errors
│       │   └── 503.blade.php
│       ├── vendor
│       └── welcome.blade.php
├── routes
│   ├── api.php
│   ├── console.php
│   └── web.php
├── server.php
├── storage
│   ├── app
│   │   └── public
│   ├── framework
│   │   ├── cache
│   │   ├── sessions
│   │   └── views
│   └── logs
└── tests
    ├── ExampleTest.php
    └── TestCase.php

app目录是开发的核心目录

  • app/Console 主要是和自定义Artisan命令相关
  • app/Exceptions 异常捕获相关,可以编写自定义异常
  • app/Http/Controllers 控制器相关
  • app/Http/Middleware 中间件,进入控制器之前,可以对URL进行拦截做权限判断,登录判断等
  • app/Http/request 默认不存在,可以通过命令生成,主要是和参数验证相关
  • app/Http/Providers 服务提供者类
  • app/Http/Jobs 默认不存在,可以通过命令生成,用于存放队列任务。可以将耗时任务放到这里
  • bootstrap 启动时,需要加载一些必要的文件
  • config 存放配置文件,也可以自定义配置文件
  • database 数据库相关,可以通过代码生成数据库表和产生一些测试数据
  • public/index,php 系统默认入口文件,需要在服务器端指定
  • resources 资源文件
  • routes 路由文件,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

为了防止队列挂掉 则可以配合守护进程

转载于:https://www.cnblogs.com/alin-qu/p/8166281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值