聽同事說,現在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一下