开发那点事(二)学习两天laravel总结
听同事说,现在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一下