美文网首页开发那点事
开发那点事(二)学习两天laravel总结

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

作者: 极客简讯 | 来源:发表于2019-03-26 13:32 被阅读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一下

    相关文章

      网友评论

        本文标题:开发那点事(二)学习两天laravel总结

        本文链接:https://www.haomeiwen.com/subject/ogrgvqtx.html