開發那點事(二)學習兩天laravel總結

聽同事說,現在laravel框架挺火的,就趁着週末休息時間看了看,由於之前對TP5框架比較熟悉,上手比較快,並封裝了一套基於laravel的開發框架,下面跟大家分享一下這兩天學習laravel的收穫,個人對laravel的理解。

1 項目配置文件

laravel框架與TP5一個不同的地方,在laravel根目錄下的.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一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章