CSDN搬过来就没有目录,有点想吐槽简书
1.导读
2:配置Laravel环境
2.1:搭建php环境(不细说)
2.2:安装Laravel
3:Laravel基础知识
3.1:路由
3.2:配置mysql数据库
3.3:控制器
3.4:视图模板(blade)
3.5:Eloquent 模型Eloquent 模型
1:导读
介绍下Laravel的入门基础知识【持续更新】
1.1:其实不写博客之类的。今天又用到不怎么用Laravel来写数据接口,没想到又有一些基础知识忘记了,又是一番翻翻找找,所以决定记录下学过的知识,方便以后查找,也可以给初学者一些帮助。其实我也算小白,有些知识点不是很全面还望发现错误的大佬指导。
1.2:Laravel是一款基于PHP优雅(具体优雅在哪里我也说不出来)的Web开源框架,采用了主流的MVC框架(Model<我的理解是Eloquent模型,相当于将数据表映射>——View<前端视图模板等>——Controller<控制器>)
2:配置Laravel环境
2.1:搭建php环境(不细说)
推荐下我用过的两种本地php环境服务器
wamp(推荐,现阶段我使用的是这款)和xampp。
两者共存的时候需要安装时需要修改Apache和mysql的端口,否者会出现端口占用的冲突导致无法启动。
(注意:在安装wamp的时候检查是否安装vmware虚拟机软件,vmware占用了443端口会导致冲突,需要对vmware端口进行修改)
(修改虚拟机端口:打开虚拟机菜单-->编辑-->首选项-->共享虚拟机-->点击“禁用共享”-->修改https端口为4431或者其他-->再点击“启动共享”即可)
xampp修改端口(系统只有一套php环境不用修改)
-
修改apache:找到httpd.conf的配置文件(在面板的apache栏的config,注意不是外围的xampp的config)
——>1.将Listen 80的改为Listen 《你所要的端口》
2.将ServerName localhost:80也修改成前面修改的端口,保存
Apache端口修改
——>点击外围Config,选择Service and port settiongs,然后选择apache选项卡,设置端口为前面修改的端口
在这里插入图片描述 -
修改mySQL端口
修改成你想要的端口(注意:默认连接mysql为3306修改后在进行数据库连接的时候记得传入修改的端口)
在这里插入图片描述
在这里插入图片描述
2.2:安装Laravel
-
用Composer(PHP管理包工具)
1.安装Composer,可以官网下载安装包,也可以镜像下载composer国内镜像网
在安装Composer时有多个php环境时需要注意应选着对应的php版本
在这里插入图片描述
2.打开终端输composer命令创建项目(每回创建项目都用):
composer create-project --prefer-dist laravel/laravel (项目名) (版本号,默认最新版本,我用的5.7.)*
(下载出错可能被墙<先执行镜像再下载,镜像可以查百度最新的,我的好像不能用了>或者composer版本过低<更新:composer update) -
一键安装(其实就是将下载好的Laravel项目放在php的Web目录下)
1.将项目拉到目录后,进行配置 .env文件(无.env德情况下复制 .env.example文件的副本改位.env)
2.生成key。在项目根目录打开终端输入 php artisan key:generate
生成的key会自动填充到.env文件的APP_KEY=。。。。生成的key。。。(没有请自行复制生成的)
3:Laravel基础知识
3.1:路由
路由其实相当于路径,
例如纯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;
});
//在模板是视图中传递需要拼接
//<a href="{{ url('user').'/'.'传递的参数' }}">
//也可以根据需要在路由中定义多个参数:
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,
];
3.2:配置mysql数据库
.env文件的相应位置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306 (默认端口为3306,修改了需要修改为对应端口)
DB_DATABASE=数据库名字
DB_USERNAME=数据库用户名
DB_PASSWORD=数据库密码
3.3:控制器
- 使用Laravel自带的命令行接口:Artisan
打开命令行窗口(shift键加右键)
启动项目:php artisan serve
创建控制器:php artisan make:controller 控制器名字
(创建其他也类似,将make:对应的(例如model,中间键middleware等)修改为对应的)
/* App\Http\Controllers */
<?php
//创建好是的初始状态
//命名空间
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表单验证规则
表单验证错误信息回传的两种方法
- 使用validate
/** 表单验证 */
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
3.4:视图模板(blade)
- 视图模板目录在resources/views中
- 快捷创建模板:新建一个html文件--->将后缀<kbd>html</kbd>修改为<kbd>blade.php</kbd>
{{"使用花括号渲染值"}}
{{--循环和判断用@** 开头 和 @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
3.5:Eloquent 模型Eloquent 模型
- Eloquent 模型类相当于映射一张数据表,通过模型类提供的方法,简化了数据库操作
- 规则(不符合会报错):
1.数据表的主键名称为id,类型为整型,自增长
( 如果组件不是id:protected $primaryKey = 'xh';指定主键。
如果不是自增,通过public $incrementing = false;忽略。
如果不是整形,通过 protected $keyType = 'string';修改对应类型
)
2.数据表包含两个数据类型为datetime的字段,字段的名称为updated_at和created_at,分别保存记录的更新时间和创建时间
(当表中无这两个的时候,
可以通过设置public $timestamps = false;忽略掉,
或者通过 public const CREATED_AT = 'create_time';
public const UPDATED_AT = 'update_time';创建欠缺的字段)
(需要注意的是,laravel的默认时区是UTC,在 config\app.php修改'timezone' =>' PRC' 即可)
3.表名是将类名由驼峰格式转化为小写+下划线(含多个单词的话,多个单词的判断标准是大写字母)
(比如 tbUser对应表名是 tb_users、PostTag 对应表名是 post_tags 等等)
(当类名与表名不一致时可以在该类中声明表名protected $table = 'tb_stuinf';) - 创建php artisan make:model tbUser,创建到 app/Models 目录下