介绍下Laravel的入门基础知识【持续更新】
1.1:其实不写博客之类的。今天又用到不怎么用Laravel来写数据接口,没想到又有一些基础知识忘记了,又是一番翻翻找找,所以决定记录下学过的知识,方便以后查找,也可以给初学者一些帮助。其实我也算小白,有些知识点不是很全面还望发现错误的大佬指导。
1.2:Laravel是一款基于PHP优雅(具体优雅在哪里我也说不出来)的Web开源框架,采用了主流的MVC框架(Model<我的理解是Eloquent模型,相当于将数据表映射>——View<前端视图模板等>——Controller<控制器>)
推荐下我用过的两种本地php环境服务器
wamp(推荐,现阶段我使用的是这款)和xampp。
两者共存的时候需要安装时需要修改Apache和mysql的端口,否者会出现端口占用的冲突导致无法启动。
(注意:在安装wamp的时候检查是否安装vmware虚拟机软件,vmware占用了443端口会导致冲突,需要对vmware端口进行修改)
(修改虚拟机端口:打开虚拟机菜单–>编辑–>首选项–>共享虚拟机–>点击“禁用共享”–>修改https端口为4431或者其他–>再点击“启动共享”即可)
xampp修改端口(系统只有一套php环境不用修改)
路由其实相当于路径,
例如纯php访问php文件时输入:*****.php访问,
而命名一个路由可以直接:根目录/路由名 进行访问
/* routes/web.php */
//Route:对应的http请求方法('路由名,/代表根路径','可以是回到函数也可以是对应的控制器中的函数')
//常见的get和post
Route::get('/', function () {
//返回一个模板视图(html模板的php文件)(具体在resources/views中)
return view('welcome');
//返回视图并携带参数,视图在文件夹(默认resources/views为根目录)下需要用点(.)连接
//例如resources/views/v/v.blade.php ----> v.v
//return view('文件夹.视图名字 ',['参数1'=>'值'])
});
//注意的是进行post请求时,直接通过浏览器输入默认的get请求,
//直接请求post会报MethodNotAllowedHttpException错误,需要调用form表单进行post请求
Route::post('/','控制器名字@调用控制器中对应的方法名');
//还有其他的http请求
Route::put('***', '***@***');
Route::patch('***', '***@***');
Route::delete('***', '***@***');
Route::options('***', '***@***');
/*一个路由响应多个http请求*/
//响应指定的http请求
Route::match(['get', 'post'], '/', function () {
});
//响应所有的
Route::any('/', function () {
});
/*路由参数,只能为英文字母和下划线*/
//从 URL 中捕获用户的 ID,可以通过定义路由参数来执行此操作:
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
//在模板是视图中传递需要拼接
//
//也可以根据需要在路由中定义多个参数:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
});
//可选参数?,需要指定默认值(可以时null或具体值)
Route::get('user/{name?}', function ($name = null) {
return $name;
});
//正则表达式约束
Route::get('user/{id}/{name}', function ($id, $name) {
//id为0到9的一个或多个数字,name为a到z的一个或多个字母
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
/*路由前缀*/
//适用于归类:前缀/路由名字
Route::prefix('前缀')->group(function (){
//一系列路由
});
/*中间键*/
//类似于vue的路由守卫
//(对每条路由进行检查,例如:是否登录的用户认证,根据判断是否放行)
//login为在创建并在在App\Http\Kemel.php 注册的中间键
Route::middleware('login')->group(function () {
//内部的路由都进行中间键验证
Route::get('dashboard', function () {
return view('dashboard');
});
Route::get('account', function () {
return view('account');
});
});
//创建中间件
//php artisan make:middleware Login
//创建好后在App\Http\Middleware目录下
/*---------App\Http\Middleware、Login---------*/
namespace App\Http\Middleware;
use Closure;
class Login
{
public function handle($request, Closure $next)
{
//获取保存的session值:session()->get('键值')
$user_id = session()->get('user_id');
//进行判断
if (empty($user_id)) {
//不符合,重定向返回到login页面
return response()->view('login');
}
//通过放行
return $next($request);
}
}
/*---------App\Http\Kemel.php---------*/
//注册中间键($routeMiddleware局部注册,$middleware为全局注册)
protected $routeMiddleware = [
//******
//注册
'login' => \App\Http\Middleware\Login::class,
];
.env文件的相应位置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306 (默认端口为3306,修改了需要修改为对应端口)
DB_DATABASE=数据库名字
DB_USERNAME=数据库用户名
DB_PASSWORD=数据库密码
/* App\Http\Controllers */
//创建好是的初始状态
//命名空间
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//使用构建器访问数据库时引入
use Illuminate\Support\Facades\DB;
class 创建时候定义的控制器名字 extends Controller
{
//编写对应方法,对应方法在路由中调用
function a(){
//return "返回字符串";
//返回模板视图
//返回视图并携带参数,视图在文件夹(默认resources/views为根目录)下需要用点(.)连接
//例如resources/views/v/v.blade.php ----> v.v
//return view('文件夹.视图名字 ',['参数1'=>'值'])
return view('v',['a'=>1]);
}
}
/** 获取数据请求 */
function b(Request $request){
//需要引入use Illuminate\Http\Request;(默认引入)
//dd(打印详细,适合调试)
// 获取到所有的请求数据
dd($request->all());
/** 筛选指点字段,$request中剩下的为筛选好的字段*/
//排除指定字段
dd($request->except('addr'));
//筛选指定字段
dd($request->only(['name', 'sex', 'age']));
//------------
//判断是否包含指定字段
//exists为has的别名,功能相同
dd($request->has('name'));
//获取指定字段(只能获取GET 请求传递的参数)
$request->get('name');
/** 建议用input */
$a = $request->input('a', '默认值');
//一、仅只取get数据(两种)
$request->query->get('name', '未设值');
$request->query('name', '未设值');
//二、仅只取post数据(一种)
$request->request->get('name', '未设值');
//三、get和post一起取,同名post覆盖get(三种)
$request->input('name', '未设值');
$request->name;
$request->get('name', '未设值');
}
}
/** 使用DB访问数据库*/
function c(Request $request){
// 首先需要引入DB类,控制器需加入
//use Illuminate\Support\Facades\DB;
/**原生的增删改查---》DB::对应方法('sql语句',['参数数组'];*/
$a = DB::select('select * from table');
//参数绑定
$b = DB::select('select * from table where xm=?', ['xm' => '值']);
//插入
$r = DB::insert('insert into table(xh,xm) values(?,?)',['111','哈哈哈']);
//改
$u = DB::update('update table set xm=? where xh=?',['111','哈哈哈']);
//删除
$d = DB::delete('delete from table where xh=?',['11']);
/** 使用构建器 table()*/
//获取所有数据
$ga = DB::table('表名')->get();
//按需查询
$xm='111';
//where('字段','判定条件:= , !=,>,<等,默认=','值')
$ga1 = DB::table('表名')->where('xm',$xm)->get();
//获取第一条数据
$ga2 = DB::table('表名')->first();
//附带增删改查
//加select()查询指定字段(返回指定字段)
$ga3 = DB::table('表名')->select('指定字段')->get();
//插入数据
//将insert替换成insertGetId可以返回插入后的id(只对自增长id有用)
$ga4=DB::table('表明')->insert(['xh'=>'555','xm'=>'赵云']);
//更新
$ga5 = DB::table('表名')->update(['pwd' =>'123456']);
//删除
$ga6 = DB::table('表名')->where('id','=',4)->delete();
//清空整张表(不重置id)
$ga7 = DB::table('表名')->delete();
//清空并重置id
$ga8 = DB::table('表名')->truncate();
}
Laravel表单验证规则
表单验证错误信息回传的两种方法
/** 表单验证 */
function d(Request $request){
//判断请求方法
//判断是否为post请求
$request->isMethod('post');
//定义规则,键为模板视图定义的表单字段(前端定义的表单字段)
$rules =['username'=>['required','max:50'],
'email'=>['required','max:150','email'],
'pwd'=>['required','same:pwd_cfg','min:6'],
'pwd_cfg'=>['required','min:6'],
'type'=>['required','in:G,A']
];
//翻译规则,默认为英文
$msg =['username.required'=>'用户名不能为空',
'pwd.required'=>'密码不能为空',
'email.required'=>'邮箱不能为空',
'email.email'=>'邮箱格式不对',
'pwd.same'=>'密码和确认密码不一致',
'pwd.min'=>'密码要大于等于6位',
'pwd_cfg.required'=>'确认密码不能为空',
];
//$this->validate() 方法验证用户请求
//不通过直接返回错误信息
$this->validate($request, $rules,$msg);
//通过按需操作
return '表单验证通过';
}
/** ------------模板视图文件--------- */
{
{
--判断是否有错误信息回传--}}
@if ($errors->any())
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{
{
$error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{
{url('post请求的路径')}}" method="post">
{
{
-- csrf验证通证,没加报419--}}
{
!! csrf_field() !!}
{
{
-- old函数为记录上次的表单值--}}
<label>用户名:<input type="text" name="username" placeholder="用户名" value="{
{ old('username') }}"/></label>
<label>邮箱:<input type="text" name="email" placeholder="邮箱" value="{
{ old('email') }}"/></label>
<label>密码:<input type="password" name="pwd" placeholder="密码" value="{
{ old('pwd') }}"/></label>
<button type="submit">注册</button>
</form>
/** 消息回传*/
function e(Request $request){
//表单验证也可以直接调用验证类的静态方法进行验证(控制器要先引用Validator 类)
//use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(),$rules,$msg);
//消息回传主要利用写入session
//如还需要回传表单信息,末尾加上->withInput();
return redirect()->back()->with('回传定义的session键','值');
//错误信息回传
return redirect()->back()->withErrors('错误的信息');
}
/** ---------模板中*-----*/
在blade模板
@if(session()->has('msg'))
{
{
session()->get('msg')}}
@endif
{
{
"使用花括号渲染值"}}
{
{
--循环和判断用@** 开头 和 @end**结尾--}}
{
{
--变量等可以是控制器回传的--}}
@if(!empty('判断是否为空'))
@endif
@foreach($v as $key=>$a)
@endforeach
{
{
--asset('路径')会将指定的路径生成相对路径--}}
{
{
-- 项目需要用到的css,js,图片文件或者任何想通过网址直接存储的文件,都要放在public文件夹下--}}
{
{
--public文件夹是对外公开的,其他文件夹都不对外公开--}}
{
{
--引入外部文件:*** href="{
{asset('路径')}}"--}}
{
{
--指定路由路径:
action="{
{url('路径')}}"
--}}
{
{
--创建父模板:创建一个作为父模版,后续视图继承后就不需要其他html标签等--}}
{
{
-- @yield 定义一个用来填充内容的位置
子页面用 @section (XX) 就可以往 yield 写入内容
--}}
{
{
-----------------父------------------}}
<title>@yield('title')</title>
@yield('content')
<p>父在子显示的内容</p>
@show
{
{
-----------------子------------------}}
@extends('父路径,有文件夹需用点连接')
@section('title','子要显示的内容')
@section('content')
{
{
-- 父模板输出--}}
@parent
<p>这是子页面输出的内容</p>
@endsection