开发那点事

开发那点事(二)学习两天laravel总结

2019-03-26  本文已影响15人  极客简讯

听同事说,现在laravel框架挺火的,就趁着周末休息时间看了看,由于之前对TP5框架比较熟悉,上手比较快,并封装了一套基于laravel的开发框架,下面跟大家分享一下这两天学习laravel的收获,个人对laravel的理解。

1 项目配置文件

laravel框架与TP5一个不同的地方,在laravel根目录下的.env文件是项目配置文件,其中包括数据库,邮箱,调试模式等一些配置。


env配置文件

2 控制器与路由

那么,laravel框架的控制器位于app/Http/Controllers文件夹下。在编写接口时,可以直接在方法中添加Request参数获取由前端传递的信息


控制器示例

路由文件则位于根目录下的routes文件夹下面,开发时在路由文件下进行配置路由,才能进行正确的访问。需要注意的地方,routes文件夹下 web.php与 api.php的区别。在web.php中配置的路由直接访问即可,而在api.php文件中配置的路由访问时则需要在模块名前加入api。

其次路由中直接配置相关参数,在控制器中可以直接获取
web.php

Route::any('/test/{code}', 'Api\IndexController@index');

控制器

 public function index(Request $request, $code)
    {
        print_r($code);
        (new LoginValidator())->checkData($request->all(), 'login');
        exit("成功");
    }

3 自定义异常以及全局异常处理

我们能自定义一个class类继承Exception定义它相关的一些参数,输出给前端

class BaseException extends Exception
{
//以下定义的变量 在全局异常处理类中会用到
    public $status = 0;//服务器状态码 0代表异常,1代表正确响应
    public $code = 400;//Http状态码 404 .402
    public $msg = "param error";//错误具体信息
    public $errorCode = -1;//自定义错误码

    /**
     * 构造函数,接收一个关联数组
     * @param array $params 关联数组只应包含code、msg和errorCode,且不应该是空值
     */
    public function __construct($params = [])
    {
        if (!is_array($params)) {
            return;
        }
        if (array_key_exists('code', $params)) {
            $this->code = $params['code'];//将传递过来的值赋值给成员变量(java里的说法)
        }
        if (array_key_exists('msg', $params)) {
            $this->msg = $params['msg'];
        }
        if (array_key_exists('errorCode', $params)) {
            $this->errorCode = $params['errorCode'];
        }
        if (array_key_exists('status', $params)) {
            $this->errorCode = $params['status'];
        }
    }
}

laravel的异常配置文件位于app/Exceptions下的Handler.php,项目遇到异常时会调用到其中的render方法,在该方法内将自定义的异常进行处理

 public function render($request, Exception $exception)
    {

        if ($exception instanceof BaseException) { //判断为自定义异常时
            header("HTTP/1.0 400");
            $this->code = $exception->code;//将BaseException中的值赋值给成员变量,最后进行输出
            $this->msg = $exception->msg;
            $this->errorCode = $exception->errorCode;
            $this->status = $exception->status;
        } else if ($exception instanceof NotFoundHttpException) {//访问路径不存在
            $this->code = -1;
            $this->msg = "请求路径不存在";
            $this->errorCode = -1;
            $this->status = 0;
        } else {//其他错误
            if (config('app.debug')) {//判断是否为调试模式,
                //返回默认界面
                return parent::render($request, $exception);
            } else {
                //返回json数据
                $this->code = 500;
                $this->msg = "服务器内部错误";
                $this->errorCode = 999;
                $this->status = 0;
                $this->recordLog($exception);//日志记录
            }
        }
        $result = [
            "responseMessage" => $this->msg,
            "responseCode" => $this->errorCode,
            "data" => []
        ];
        exit(json_encode($result, $this->code));
    }

4 验证器

在laravel中可以使用验证门面Validator(Illuminate\Support\Facades\Validator)来校验前端输入合法性。其中make方法用来传递相关的参数,而passes方法则用来是否验证成功,以下是个人封装的自定义验证器

class BaseValidator extends Validator
{
    protected $scene = [];
    protected $msg = [];

    public function __construct()
    {

    }

    public function checkData($data, $sceneName)
    {
        if (!$this->scene || !is_array($this->scene[$sceneName])) {
            throw new BaseException(['msg' => 'scene参数不合法']);
        }
        if (!$this->msg || !is_array($this->msg)) {
            throw new BaseException(['msg' => 'msg参数不合法']);
        }

        $validator = self::make($data, $this->scene[$sceneName], $this->msg);//data 前端传递过来的参数,scene验证场景,$msg输出相关信息
        if (!($validator->passes())) {
            throw new ValidatorException(['msg' => current($validator->errors()->messages())[0]]);  //不通过则抛出异常
        }

    }
}

5 模型

laravel可以通过命令直接生成模型文件

php artisan make:model Models/Member

通过table变量来指定表名,在方法中进行相关的操作

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Error extends Model
{
    protected $table = 'error_correction';

    public static function getErrorList($pageNo, $pageSize)
    {
        return self::offset(($pageNo - 1) * $pageSize)->limit($pageSize)->get([DB::raw("ifnull(pid,'') as stationId")]);
    }
}

6 助手函数

在app中新建文件夹,并定义util文件

<?php
/**
 * Created by PhpStorm.
 * User: zw215
 * Date: 2019/3/23
 * Time: 11:26
 */
if (!function_exists('my_test')) {
    function my_test()
    {
        return 'hello world';
    }
}

在composer.json文件中autoload属性下加入files字段

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files" : [
            "app/common/util.php"
        ]
    },

最后通过以下命令,我们定义的控制器就能直接使用util.php文件中定义的函数

composer dump-autoload

最后

附上我封装的基于laravel的开发框架git地址:https://gitee.com/zw21544182/firstLaravel.git,喜欢的可以star一下

上一篇下一篇

猜你喜欢

热点阅读