前提注意
laravel中,php路径使用 ./ 开头,html路径使用 / 开头
路由
路由分组
Route::group(['prefix'=>'admin'],function(){})
Route::get('/', function () {
return view('welcome');
});
Route::get('basic1',function (){
return "Hello World";
});
Route::post('basic2',function (){
return "basic2";
});多请求路由
Route::match(['get','post'],'multy1',function (){
return 'multy1';
});
Route::any('multy2',function (){
return 'multy2';
});路由参数
Route::get('{user/id}',function ($id) {
return 'User-name'.$id;
});
Route::get('user/{id}/{name?}',function ($id,$name='sean'){
return 'User-id-'.$id.'-name-'.$name;
})->where(['id'=>'[0-9]+','name'=>'[A-Za-z]+']);1.{id}为必选参数,{name?}为可选参数,可选参数在形参里要设默认值
2.结尾->where,给参数添加筛查,不通过将无法访问,用正则表达式筛查】
重定向路由
Route::get('basic1',function (){
return "Hello World";
});
Route::redirect('/zouni','basic1');视图路由
//1
Route::get('view', function () {
return view('admin/login');
});
//2
Route::view('view','admin/login');路由别名/命名路由
Route::get('user/center',['as'=>'center',function(){
return route('center');
}]);
Route::get('user/qwq',function(){
return route('center');
})->name('center');1.命名路由为生成URL或重定向提供了方便
2.可以通过路由名称进行重定向,并且将取得的参数也传到重定向的位置
Route::get('shopping/{id}/profie',function ($id){
return 'my url:'.route('profie',[
'id'=>$id
]);
})->name('profie');
Route::get('redirect/{id}',function ($id){
return redirect()->route('profie',[
'id'=>$id
]);
});路由群组
Route::group(['prefix'=>'member'],function (){
Route::get('user/center',['as'=>'center',function(){
return route('center');
}]);
Route::any('multy2',function (){
return 'membe-multy2';
});
});1.用Route::prefix('member')->group(function(){//});也可以添加前缀
路由模型绑定
/// route
Route::get('user/{user}',function (App\Modelqwq $user){
return $user->email;
});/// model
class Modelqwq extends Model
{
protected $table='user';
public function getRouteKeyName()
{
return 'user_name'; // TODO: Change the autogenerated stub
//设置通过什么属性寻找
}
}一、控制器
1.创建控制器
php artisan make:controller TestControllerRoute::get('user/{id}', 'TestController@test1');
TestController 控制器名我们可以任意指定。文件默认会创建在 app\Http\Controllers 目录下。
namespace App\Http\Controllers\Home;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Input;
class TestController extends Controller
{
//
public function index(){
echo 'home index';
}
public function test1(){
echo '<br><hr/>';
}
}2.访问控制器
在路由文件 routes/web.php 中配置路由就可以访问了。
** Route::get('/test', 'TestController@index'); **
如果完整的控制器类名为 App\Http\Controllers\Photos\AdminController,你在路由中应当采用如下的形式注册:
Route::get('foo', 'Photos\AdminController@method');
3.获取用户输入
获取用户的输入,一般推荐通过依赖注入的方式来获取。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function test(Request $request)
{
//获取所有请求数据
$data = $request->all();
//获取指定请求数据
$id = $request->input('id');
}
}控制器中间件
在控制器的构造方法中指定中间件会更方便。使用控制器构造函数中的 middleware 方法, 你可以很容易地将中间件分配给控制器的行为。你甚至可以约束中间件只对控制器类中的某些特定方法生效:
class UserController extends Controller
{
/**
* 实例化一个控制器实例
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}还能使用闭包来为控制器注册中间件。闭包的方便之处在于,你无需特地创建一个中间件类来为某一个特殊的控制器注册中间件:
$this->middleware(function ($request, $next) { // ... return $next($request);});二、中间件
1.创建中间件
php artisan make:middleware Check
2.编写中间件
一般默认先拦截后返回
public function handle($request, Closure $next)
{
//请求执行
$response=$next($request);
//拦截代码
if($request->get('id')!=1){
return redirect(url('login'));
}
//固定返回,让其继续执行代码
return $response;
}3.注册中间件
*** 在 Http/Kernel.php 文件,在路由配置中间件的区域进行注册; ***
protected $routeMiddleware = ['check' => \App\Http\Middleware\Check::class]
4.使用中间件
Route::get('/admin','LoginController@index)->middleware('check);
或者
Route::group(['middleware'=>'check'],function(){});
//宣传页面
Route::any('activity0',['uses'=>'StudentController@activity0']);
//活动页面
Route::group(['middleware'=>'activity'],function (){
Route::any('activity1',['uses'=>'StudentController@activity1']);
Route::any('activity2',['uses'=>'StudentController@activity2']);
});伪造表单方法
因为 HTML 表单不能生成 PUT,PATCH 和 DELETE 请求,所以你需要添加一个隐藏的 _method 字段来伪造这些 HTTP 动作。 这个 Blade 指令 @method 可以为你创建这个字段:
<form action="/foo/bar" method="POST">
@method('PUT')
</form>二、DB类
1. 数据库创建配置
2. 增加信息
对数据库中的某个表增加数据主要有两个函数可以实现, insert() insertGetId()
insert(数组) 可以同时添加一条或多条数据,返回值类型是布尔类型
insertGetId(一维数组) 只能添加一条数据,返回自增id
注意:DB::table('无前缀的表面')
2.1. insert()
//定义关联操作的表
$db = DB::table('member');
//使用insert增加记录
$result = $db -> insert([
[
'name' => '马冬梅',
'age' => '18',
'email' => 'abc@qq.com'
],
[
'name' => '刘德华',
'age' => '38',
'email' => 'a123@qq.com'
]
]);2.2. insertFetId()
//使用insertFetId插入一条
$result = $db -> insertGetId([
'name' => '一条',
'age' => '210',
'email' => 'maqi'
]);
dd($result);3. 修改数据
数据修改可以使用update()、increment()、 decrement()
Update表示可以修改整个记录中的全部字段;
Increment 和 decrement表示修改数字字段的数值(递增或递减),典型应用:记录登录次数、积分的增加。
案例:
$db = DB::table('member');
$res = $db -> where('name','=','张三') -> update([
'name'=>'1三'
]);
$res = $db -> where('name','=','张三') -> increment('age',3);4. 查询数据(get)
(1) 取出基本数据
- 案例1:获取menmber表中所有的数据
DB::table('member').get();
返回的值是一个集合对象
循环取下数据是对象不是数组
$db = DB::table('member');
foreach($db->get() as $key => $value){
echo("id是:{$key}---{$value->id}<br>");
}*** 是对象对象对象 ***
- 案例2:获取id < 10的所有数据
$db = DB::table('member');
$data = $db->where('id','<','15')->get();- 案例3:获取id>15并且年龄小于20的数据
$db = DB::table('member');
$data = $db->where('id','<','15')-> where('age','<','20')->get();- 案例4:并且 将where改为orwhere
(2) 取出单行数据
$data = $db->where('id','<','15')-> first();
(3) 取出具体数据
$data = $db->where('id','15')-> value('name');
(4) 获取某些字段数据(多个字段)
DB::table('member')->select('name','age')->get();
(5) 排序操作
$db = DB::table('member')->orderBy('id','desc')->get();
(6) 分页操作
DB::table('member')->limit(3)->offset(2)->get(); //从第2条数据开始 输出后3条
Limit: 表示限制输出的条数
Offset: 表示从什么地方开始
5. 删除数据【了解】
有两种方式:物理删除(本质是删除)、逻辑删除(本质是修改)
Delete 表示删除记录;
Truncate表示清空整个数据表;
物理删除
DB::table('table_name')->where('id',1)->delete();
例如:删除id为1 的记录
$db = DB::table('member');
$res = $db->where('id',10)->delete();
dd($res); //返回值影响的条数6. 执行任意SQL语句
(1)执行影响记录的语句 statement
DB::statement("insert into member values(null,'')");
(2)执行select操作
$res = DB::select("select * from member");
三、视图(view)
温建平习惯小写
文件名的后缀是(.blade.php)
展示视图的方法
return view('user.welcome');
return view('user\welcome');
判断视图文件是否存在
if (View::exists('emails.customer')) {
//
}变量分配与展示
语法:
- view(模板文件名,数组) 数组就是需要分配的变量集合,数组是一个键值数组
- view(模板文件名)->with(数组)
- view(模板文件名)->(名称,值)->(名称,值)
使用 view() 方式渲染一个视图后,在.blade.php的视图文件中,模板中输出变量使用""
分配:
$date = date('Y-m-d H:i:s',time());
$day='日';
return view('test3',['date'=>$date,'day'=>$day]);展示:
<body>
<h1>这里是test3视图</h1>
<h2>这里展示</h2>
<p>现在时间是{{$date}}</p>
</body>compact函数往视图(传参)
compact函数是php内置函数。作用主要是打包数组。
语法:compact('变量名1','变量名20',.....)
return view('test3',compact('date','day'));
#### 直接使用函数
> 回顾: 在 smarty模板引擎中存在一个图书符号“|” ,名称称之为变量修饰符。作用就是在视图中解释变量(使用函数去处理变量)。
*** 语法:{{ 函数名 (参数1,参数2) }} ***
*** 说明:函数名可以是php内置的,也可以是laravel框架中定义的。***
案例:在视图中将时间戳转为正常格式。
```php
<p>现在时间是{{date('Y-m-d H:i:s',$time)}}</p>
```循环
laravel循环
@foreach($data as $key=>$item)
//循环体
//$loop
@endforeach| 属性 | 说明 |
|---|---|
$loop->index | 当前迭代的索引(0开始) |
$loop->iteration | 当前循环迭代(1开始) |
$loop->remaining | 循环中剩余迭代数 |
$loop->count | 被循环的数组元素个数 |
$loop->first | 是否为第一次迭代 |
$loop->last | 是否为最后一次迭代 |
$loop->even | 是否为偶数次数迭代 |
$loop->odd | 是否为奇数次数迭代 |
$loop->depth | 当前循环的嵌套深度 |
$loop->parent | 嵌套循环中的父循环的循环变量 |
继承与包含
父级
<h1>我是头部</h1>
@yield('mainbody') //命名区块
<h1>我是底部</h1>子级
@extends('home.test.parent') //extends()继承模板文件 完整路径
@section('mainbody') //绑定区块
<h1>是正文内容</h1>
@endsection
<!-- include引入 --> //另一种引入方式
@include('home.test.parent')静态文件引入
*** 引入时默认引入public文件 ***
<link rel="stylesheet" href="/css/style.css"> //第一种更好用
<link rel="stylesheet" href="{{URL::asset('css/style.css')}}">//与下相等
<link rel="stylesheet" href="{{asset('css')}}/style.css">四、CSRF
1、什么是 CSRF 攻击
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
Laravel提供了一个全局帮助函数 csrf_token 来获取该 Token 值,因此只需要在试图提交表单中添加如下HTML代码即可在请求中带上Token:
2、Laravel中如何避免 CSRF 攻击
案例:通过案例实现 csrf 的机制验证
①创建两个路由,一个用于展示表单(get),另处处理请求(post)
//csrf验证
Route::get('/home/test6','TestController@test6');
Route::post('/home/test7','TestController@test7');②创建对应的方法
//csrf攻击方法
//基础表单
public function test6(){
return view('home.test.test6');
}
//处理请求
public function test7(){
return '请求提交成功';
}③访问失败,需携带token
<form action="{{route('test7')}}" method="POST">
姓名:<input type="text" name="name" placeholder="请输入姓名">
//hidden隐藏表单
<input type="hidden" name="_token" value="{{csrf_token()}}">
</form> <form action="{{route('test7')}}" method="POST">
姓名:<input type="text" name="name" placeholder="请输入姓名">
{{csrf_field()}}
</form>两者的区别:
- csrf_token 只输出 token 的值
- csrf_field 输出了整个input隐藏域
在后期使用选择:大部分可以随意。但有一个情况没有选择,必须使用 的,这个情况就是的方式。
$.get(url,{_token:});
3、从 SCRF 验证中排除例外路由
(1) 单个路由排除
该文件在app/Http/Middleware/VerifyCsrfToken.php文件内
protected $except = [
//该处写需要排除csrf验证的路由
'home/test/test7',
];(2) 全部排除
使用通配符
protected $except = [
'*',
'stripe/*',
];五、模型操作(AR模式)[理解]
Laravel 自带的 Eloquent ORM 提供了一个美观、简介的与数据库打交道的 ActiveRecord 实现,每张数据表都对应一个与该表进行交互的“Model 模型’,模型允许你在表中进行数据查询,以及插入、更新、删除等操作
| AR模式三个核心(映射): | |
|---|---|
| 每个数据表 | 与数据表进行交互的 Model 模型映射(模型实例化) |
| 记录中的字段 | 与模型类的属性映射(给属性赋值) |
| 表中的每个记录 | 与一个完整的请求实例映射(具体的 CURD 操作) |
1、定义模型
(1) 定义位置
定义模型的位置,默认在 app 目录下面,但是为了管理方便,建议分目录进行创建:
(2) 命名规则
本身 laravel 对模型的命名没有严格要求,一般采用 表明(首字母大写).php
比如: Member.php User.php Goods.php
(3) 创建模型
可以使用 artisan 命令:
php artisan make:model Member
(4) 定义模型注意事项(重点)
- 定义一个$table 属性,值是不要前缀的表明,。
- 定义$primaryKey属性,值是主键的名称,如果需要使ar模式的find方法,则需要指定主键( Model::find(n) )。
- 定义$timestamps属性,值是false,如果不设置false,则默认会操作表中的 created_at 和 updated_at 字段,我们表中一般没有这两个字段,所以设置为false ,表示不要操作这两个字段
- 定义$fillable属性,表示使用模型插入数据时,允许插入到数据库的字段信息。
注意: ,使用¥guarded时设置排除入库的字段
<?php
namespace App\Home;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
//定义模型关联的数据表(一个模型之操作一个表)
protected $table = 'member';
//定义主键(可选)
protected $primaryKey = 'id';
//定义禁止时间
public $timestamps = false;
//设置允许写入的数据字段
protected $fillable = ['id','name','age','email'];
}2、模型在控制器中调用
引入 Member 模型类
use App\Home\Member;
模型的使用:模型在控制器的使用方式有2种
① 直接像使用DB门面一样的操作方式:一调用静态方法为主的形式,该形式下模型不需要实例化,例如: Member::get() DB::table('member')->get();
② 实例化模型然后再去使用模型类(普通)
例如: $model = new Member();$model -> get();
3、定义测试路由
//模型的增删改查
Route::get('/home/test/test8','TestController@test8');
Route::get('/home/test/test9','TestController@test9');
Route::get('/home/test/test10','TestController@test10');
Route::get('/home/test/test11','TestController@test11');4、基本操作
(1)添加数据
在laravel里完成数据的添加可以使用两种方式:
方式一(AR)模式:
使用AR模式必须要实例化模型
注意:在laravel里面添加数据的时候,需要先实例化模型,然后为模型设置属性,最后调用 save 方法即可。
$member = new Member();
$member -> name = value;
$member -> save();这种方式可以完成数据的插入,但不建议使用。我们可以使用laravel提供的更高级的操作。
方式二(推荐):
建立一个简单的表单,表单中存着姓名,年龄,邮箱。
表单:
<form action="/home/test/test8" method="post">
<p>姓名:<input type="text" name="name"></p>
<p>年龄:<input type="text" name="age"></p>
<p>邮箱:<input type="email" name="email"></p>
{{ csrf_field() }}
<input type="submit" value="提交">
</form>控制器:
public function test8(Request $request){
$model = new Member();
$model -> create($request->all());
dd();
}模型:
<?php
namespace App\Home;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
//定义模型关联的数据表(一个模型之操作一个表)
protected $table = 'member';
//定义主键(可选)
protected $primaryKey = 'id';
//定义禁止时间
public $timestamps = false;
//设置允许写入的数据字段
protected $fillable = ['id','name','age','email'];
}(2)查询数据
获取指定主键的一条数据
$info = Member::find(19);静态方法调用获取主键为19的数据
其结果默认是一个对象。如果需要转化数组,则需要在最终方法添加一个方法:
toArray()
符合指定条件的第一条记录
$data = Member::where('id','>',4)->first()->toArray();
查询多行并且指定字段
Member::all();
Member::all([字段1,字段2]);//与get方法区别,all不支持链接其他的辅助查询方法相当于get方法
Member::get();
Member::get([字段1,字段2])按条件查询指定多个字段
Member::where('id','>',50)->get(['列1','列2']) //数组选列
Member::where('id','>',50)->select('列1','列2')->get(); //字符串选列(3)修改数据
AR模式修改数据
注意:在laravel里如果需要更新数据(ORM模型方式),需要先调用模型的find方法获取对应的记录,返回一个模型对象,然后为该模型对象设置需要更新的数据(对象的属性),最后调用save方法即可。
例如:
$user = User::find($id);
$user->title = $_POST['title'];
$user->content=$_POST['content'];
return $user->save()?'OK':'fail';案例:实现ORM形式模型修改操作
//AR模式的修改操作
$data = Member::find(19);
$data -> name = '改完后的';
$result = $data -> save();
dd($result);update方法更新数据
$result = Member::where('id',19)->update(['name' => 'update改的']);六、自动验证【重点】
判断请求类型(Input::method())
返回GET或者POST
方式一 (控制器方式验证 推荐)
验证信息
使用 $this -> validate($request,[]);
//自动验证
public function test13(Request $request){
//判断请求类型
if($request->method()=='POST'){
//自动验证
$this -> validate($request,[
'name'=>'required|min:2|max:20',
'age' => 'required|integer|min:1|max:100',
'email'=>'required|email',
]);
echo '验证成功';
}else{
return view('home.test.test13');
}
}显示错误信息
所有验证错误信息会自动一次性存放到session。因为Laravel总是从session数据中检查错误信息,而且如果有的话会自动将其绑定到视图。所以,值得注意的是每次请求的所有视图中总是存在一个$errors变量
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif将错误信息改成中文
- 进入https://packagist.org 搜索laravel-lang下载语言包
- 下载语言包
composer require laravel-lang/lang:~3.0 - 进入
.\vendor\laravel-lang\lang\src找到需要的语言复制进.\resources\lang\语言包目录内 - 进入
.\config\app.php将'locale' => 'en'改为'locale' => 'zh-CN'
*** 如果对自动验证的翻译不满意可以进入 .\resources\lang\zh-CN\validation.php 修改 ***
自定义错误信息
- 进入
.\resources\lang\zh-CN\validation.php修改 *
文件上传
a.具有 form 标签,method 必须为 post,必须具备 enctype属性
b.至少有一个input类型为file类型
c.得具备一个提交按钮
思路:
1. 先判断文件是否正常和存在
2. 获取相关的信息(可选)
3. 保存文件(移动文件到新的目录)
public function test14(Request $request){
if($request->method() == 'POST'){
//上传
//先判断文件是否正常
if($request -> hasFile('avatar') && $request -> file('avatar') -> isValid()){
//获取文件类型
//dd($request -> avatar -> extension());
//获取文件的原始名称
//dd($request -> avatar -> getClientOriginalName());
//获取文件的大小
//dd($request->avatar->getClientSize());
//移动文件
$path = md5(time().rand(100000,99999)).'.'.$request -> avatar -> extension();
$request -> file('avatar') -> move('./uploads' , $path);
//获取全部的数据
$data = $request -> all();
//将路劲添加的数组中
$data['avatar'] = $path;
Member::create($data);
}else{
}
}else{
return view('home.test.test14');
}
}如果上传出现错误,一定要使用获取错误信息的方法
getErrorMessage()
数据分页
思路:
a.查新符合分页条件的总的记录数
b.计算总的页数(总记录数 / 每页记录数,向上取整)
c.拼凑分页的链接
d.(核心操作)使用limit语法来限制分页的记录数
e.展示分页的页码和分页数据
如果可以,建议考虑分页显示样式
1.创建路由,并展示建议列表页
路由
Route::get('/home/test/test15','TestController@test15');H5页面
php<table> <thead> <tr> <th>id</th><th>昵称</th><th>邮箱</th><th>头像</th> </tr> </thead> <tbody> @foreach ($data as $val) <tr> <td>{{$val->id}}</td> <td>{{$val->name}}</td> <td>{{$val->age}}</td> <td>{{$val->email}}</td> <td><img style="width: 50px" src="/uploads/{{$val->avatar}}" alt="" srcset=""></td> </tr> @endforeach </tbody> </table> {{$data->links()}}控制器
//数据分页
public function test15(){
//查询数据
$data = Member::paginate(5);
//展示并传递数据
return view('home.test.test15',compact('data'));
}自定义分页文字
需要自己在模板中修改
.\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\default.blade.php
验证码
1.进入https://packagist.org 搜索
captcha下载composer require mews/captcha包2.修改配置文件
config\app.php在'providers'中添加Mews\Captcha\CaptchaServiceProvider::class,3.配置别名
aliases键 添加'Captcha' => Mews\Captcha\Facades\Captcha::class,
如果需要自己配置(如果需要)
- 运行
php artisan vendor:publish生成config\captcha.php
案例
在test13的基础上添加验证码显示
H5
<p>验证码:<input type="text" name="captcha"><img src="{{captcha_src()}}" alt=""></p>php
//自动验证
public function test13(Request $request){
//判断请求类型
if($request->method()=='POST'){
//自动验证
$this -> validate($request,[
'captcha'=>'required|captcha'
]);
echo '验证成功';
}else{
return view('home.test.test13');
}
}数据表的迁移与填充
迁移:数据表的操作+数据表的操作
填充:往数据表里填充写入测试的数据(数据的插入操作)
1、数据的迁移操作
在迁移过程中,操作可以分为两个部分:。
1.1、迁移文件的创建与编写
迁移文件的默认位置:
.\database\migrations目录内都是迁移文件
默认存在两个参考迁移文件,如果不打算使用系统自带的认证模块需要删除
①创建迁移文件
案例:需要创建试卷的数据表,假设数据表的名字叫 paper 。迁移文件名:
创建的时候可以通过自动代码生成工具 artisan 命令来执行迁移文件的生成。
php artisan make:migration 迁移文件名
迁移文件不需要分目录管理,直接书写名称即可。
初始代码
在创建数据表的列的时候遵循语法:
$table 表示整个表的实例
语法: $table -> 列表型方法(字段名,[长度/值范围]) -> 列修饰方法(修饰的值);
$table->string('email'); | 等同于数据库中的 VARCHAR 列 |
|---|---|
$table->string('name',100) | 等同于数据库中的VARCHAR,带一个长度 |
$table->increments('id') | 等同于数据库主键自增ID |
$table->tingInteger('numbers') | 等同于数据库中的 TINYINT 类型 |
$table->integer('votes') | 等同于数据库中的 INTEGER 类型 |
$table->enum('choices',['foo','bar']) | 等同于数据库中的 ENUM 类型 |
创建数据表代码
public function up()
{
//
Schema::create('paper',function(Blueprint $table){
$table -> increments('id');
$table -> string('paper_name','100') -> notNull() -> unique();
$table -> tinyInteger('total_score') -> default(100);
$table -> integer('start_time') -> nullable();
$table -> tinyInteger('duration');
$table -> tinyInteger('status')->default(1);
});
}删除数据表代码
public function down()
{
//
Schema::dropIfExists('paper');
}1.2、执行迁移文件
执行分为up执行和down执行。
up方法的执行:
如果在当前项目中第一次执行迁移文件,则需要先去执行: php artisan migrate:install
迁移: php artisan migrate
回滚: php artisan migrate:rollback
如果迁移文件已经执行,禁止修改
2、数据表填充器
2.1、填充器(种子文件)的创建与编写
填充器的默认位置:
.\database\seeds目录内都是填充器
创建填充器
php artisan make:seeder 填充器名称 约定俗成的写法: 大写表明+TableSeeder
例如:以paper表为例,则名称应该为 PaperTableSeeder
php artisan make:seeder PaperTableSeeder
填充器代码编写
建议使用DB形式写入
public function run()
{
//定义数组
$data = [
[
'paper_name' => '五年高考,三年模拟',
'start_time' => strtotime('+7 days'),
'duration' => '120',
],[
'paper_name' => '黄冈密卷',
'start_time' => strtotime('+7 days'),
'duration' => '120',
],[
'paper_name' => '衡水中学期中试卷',
'start_time' => strtotime('+7 days'),
'duration' => '120',
],
];
//写入数据
DB::table('paper') -> insert($data);
}2.2、执行填充文件
php artisan db:seed --class=需要执行的种子文件名
例如:
php artisan db:seed --class=PaperTableSeeder
项目初始化(使用laravel做项目)
1、使用laravel 项目
确定项目沾点位置
通过composer进行创建:
composer create-project laravel/laravel=5.4.* --prefer-dist ./
2、建立数据库
创建数据库:可通过pma、mysqlCLI方式、navicat等等
修改
.env文件,配置数据库的连接操作:phpDB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=testa DB_USERNAME=root DB_PASSWORD=
3、设置网站本地化为中文
修改语言包的配置:
下载语言包:#composer require laravel-lang/lang:~3.0
进入
.\vendor\laravel-lang\lang\src找到需要的语言复制进.\resources\lang\语言包目录内进入
.\config\app.php将'locale' => 'en'改为'locale' => 'zh-CN'
*** 如果对自动验证的翻译不满意可以进入 .\resources\lang\zh-CN\validation.php 修改 ***
4、设置项目使用时区
修改系统默认的时区,修改配置文件: config/app.php 配置项 :timezone
'timezone' => 'UTC',改为 Aisa/shanghai 、 Aisa/chongqing、 PRC
5、清理项目(删除不需要的文件)
- 删除app/Http/Controllers/Auth目录,因为需要自定义登录逻辑
- 删除database/migrations内两个文件,以为需要自定义用户表结构
- 删除database/seeds内文件
- 删除resources/views/welcome.blade.php欢迎页面
- public内的js、css也可以删除
6、关闭 Mysql 的严格模式
编辑 config/database.php 将 strict 由 true改为false
严格模式说明:
- 不支持对 not null字段插入null值
- 不支持对自增长字段插入''值
- 不支持text字段有默认值
7、安装 debugbar 工具条(可选)
条件:php版本>=7.0
下载地址:https://packagist.org 搜索laravel-debugbar 注意版本
相应处理
在laravel中,响应正常情况下有2个类型:常规直接响应,另一个是ajax响应。
其中展示试图以及直接响应都属于常规响应
例如:常规响应
展示视图:
return view('welcome');
直接返回某个字符串:
return 'Hello world';
1、ajax请求的响应
常见的 ajax响应数据类型:json 和 xml、text/html.
案例:在页面中输出一个按钮,按钮可以被点击,点击发送ajax请求,请求后台的数据,后台返回前端ajax一个json数据(不要使用 json_encode 函数)
①:创建路由
//相应方式
Route::get('/home/test/test16','TestController@test16');
Route::get('/home/test/test17','TestController@test17');②:创建需要的16和17方法,16视图页面 17ajax请求
//ajax页面展示
public function test16(){
return view('home.test.test16');
}
//ajax页面响应
public function test17(){
}③:创建视图,发送ajax请求
$.get :
$.get(地址,[参数对象,回调,期望返回类型])$.post :
$.post(地址,[参数对象,回调,期望返回类型])$.ajax :
$.ajax(obj)$.getJSON:
$.getJSON(地址,[参数对象,回调])该方法一般用于协议-端口-域名不一样皆算跨域
$.get('/home/test/test17',function(data){
console.log(data);
},'json');⑤:相应处理(重点)
在laravel中框架如果需要响应json数据,则写成语法:
补充:在laravel中布尔值是不能直接通过return响应输出;
2、跳转响应(重定向)
在有一些页面,例如同步添加操作,完成操作之后不能停留在当前页面,最好做一个跳转操作,也就是需要一个跳转的响应。
一之前的“上传操作代码”为例:后续比较理想的情况应该是在处理完成之后需要一个跳转的提示,告知用户是否成功,成功则应该返回上一页,失效则应该输出错误提示。
两个跳转方式任选一个:
return redirect(路由); 该参数的路由可以是一个完整的请求路由,也可以是通过route方法+别名获取的方法
会话控制
常见应用-
session默认存到文件中
session文件的目录: storage\framework\sessions
1、使用 Session 门面
控制器头部引用 use Illuminate\Support\Faceds\Session;
由于 session 门面在 app.php 中已经定义好别名,所以在控制器中引入的时候可以直接use Session;
use Session
常用的方法:
| Session::put('key','value'); | Session 中存储一个变量 |
|---|---|
| *** $value = Session::get('key'); *** | *** 获取一个变量 *** |
| $value = Session::get('key','default'); | 或去一个变量或默认值 |
| $value = Session::get('key',function(){ return 'default'; }); | 或去一个变量或默认值 |
| Session::all(); | 获取所有变量 |
| *** Session::has('users');*** | *** 检查变量是否存在*** |
| *** Session::forget('key');*** | *** 删除一个变量*** |
| *** Session::flush();*** | *** 删除所有变量*** |
案例
//会话控制
public function test18(){
// Session::put('name','yng');
// dd(Session::get('name'));
dd(Session::all());
}缓存操作
主要方法
Cache::put();
Cache::get();
Cache::add();
Cache::pull();
Cache::forever();
Cache::forget();
Cache::has();
系统默认是使用文件缓存,其缓存文件存储的位置位于( storage/framework/cache/data );
1、设置缓存
语法: Cache::put('key','value',$minutes);
注意:,有效期必须设置,单位是分钟。
语法: Cache::add('key','value',$minutes);
add,如果数据被成功添加到缓存返回true,否则返回false。
永久存储数据
forever 方法用于持久化存储数据到缓存,这些值必须通过 forget 方法手动从缓存中移除,
2、获取缓存数据
$value = Cache::get('key'[,'default']);
$value = Cache::get('key'[,function(){return DB::table('..')->get()}]);
判断缓存是否存在
if(Cache::has('key')){}
3、删除缓存数据
$value = Cache::pull('key'); 获取然后删除,不存在则返回null,一般设置一次性存储的数据
Cache::forget('key'); 使用 forget方法直接删除缓存数据
Cache::flush();清除所有缓存,并且删除对应目录
4、缓存数值增加\减少
increment 和 decrement 方法可用于调整缓存中的整型数值。这两个方法都可以接收第二个参数来指明缓存项数值的增加和减少的数目:一般会用作计数器。
Cache::increment('key');
Cache::increment('key',$amount);
Cache::decrement('key');
Cache::decrement('key',$amount);
5、获取并存储
有时候你可能想要获取缓存项,但如果请求的缓存项不存在时给他存储一个默认值。例如:你可能想要从缓存中获取所有用户,或者如果他们不存在的话,从数据空获取他们并且将其添加到缓存中,你可以通过使用Cache:remember 方法实现:
$value = Cache::remember('users',$minutes,function(){
return DB::table('users')->get();
})比较典型的操作就是在获取微信的accesstoken的时候可以使用
还可以联合remember 和forever方法:
$value = Cache::rememberForever('users',function(){
return DB::table('users')->get();
})经常使用的:
add/put、get、has、forget、flush、remember
联表查询(重点+难点)
联表要求至少得有2张表(除了自己连接自己),并且还是存在关系的两张表
例如:
可以建立2张表:文章表、作者表。
文章表:(article)
Id 主键
Article_name 文章名称
Author_id 作者(id)
作者表:(author)
Id 主键
Author_name 作者名称
①创建迁移文件
#php artisan make:migration create_article_table
#php artisan make:migration create_author_table
②编写2个迁移文件代码
class CreateArticleTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//建表
Schema::create('article',function(Blueprint $table){
$table -> increments('id');
$table -> string('article_name',100) -> notNull();
$table -> tinyInteger('author_id') -> notNull();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//删除表
Schema::dropIfExists('article');
}
}③执行生成数据表的迁移文件
#php artisan migrate
④模拟数据(通过填充器seeds)
a.创建填充器文件(可以多个数据表的写入操作写在一起)
#php artisan make:seeder ArticalAndAuthorTableSeeder
b.编写数据模拟代码
public function run()
{
//文章表
DB::table('article') -> insert([
[
'article_name' => '我有很多小花你要吗',
"author_id" => rand(1,3)
],
[
'article_name' => '丢了也不给你',
"author_id" => rand(1,3)
],
[
'article_name' => '想多了',
"author_id" => rand(1,3)
]
]);
//作者表
DB::table('author') -> insert([
[
'author_name' => '日你仙人',
"author_id" => rand(1,3)
],
[
'author_name' => '网易',
"author_id" => rand(1,3)
],
[
'author_name' => '执行暗杀',
"author_id" => rand(1,3)
]
]);
}c.执行填充器文件
#php artisan db:seed --class=ArticalAndAuthorTableSeeder
案例:要求查询数据表(文章表、作者表),
例如:查询id为1的文章,其结果为1 我有很多小花你要吗 人民网
分析:
数据来源:文章表、作者表
表1:文章表 t1 主表(跟在from关键词后面的表)
表2:作者表 t2 从表(跟在join关键词后面的表)
关联条件:t1.author_id = t2.id
联表方式:左外连接
原始的sql语句: select t1.id, t1.article_name, t2:author_name from article [as] t1 left join author as t2 on t1.author_id = t2.id;
*** 语法:DB门面/模型 -> join 联表方式名称(关联的表明,表1的字段,运算符,表2 的字段)***
//联表查询
public function test20(){
//select t1.id, t1.article_name, t2.author_name from article as t1 left join author as t2 on t1.author_id = t2.id;
//查询
$data = DB::table('article as t1') -> select('t1.id','t1.article_name','t2.author_name')->
leftJoin('author as t2','t1.author_id','=','t2.id') -> get();
dd($data);
}关联模型
关联模型就是绑定模型(表)的关系(关联表),后续需要使用联表的时候就可以直接使用关联模型。
注意:关联模型必须要创建模型
1、一对一关系
例如:一篇文章只有一个作者
①创建模型【前提】
#php artisan make:model Home/Article
#php artisan make:model Home/Author
②编写
class Author extends Model
{
//定义关联的数据表
protected $table = 'author';
//禁用时间戳
public $timestamps = false;
}③关联模型的关联方法(重点)
注意:在写关联模型的时候要分析是谁关联谁,谁做主动关联的模型?当前的案例是文章关连作者。
语法:
publick function 被关联的模型名小写(){
return $this -> hasOne('需要关联模型的命名空间','外键','本地键');
}2、一对多关系
例如:一篇文章有多个评论
由于文章和评论的关系是一对多关系,所以需要再创建一个评论表;
字段id 主键
字段comment 评论内容
字段article_id 和文章的关系字段,文章id
①迁移文件的创建
#php artisan make:migration create_comment_table
②编写迁移文件代码
public function up()
{
//
Schema::create('comment',function(Blueprint $table){
$table -> increments('id');
$table -> string('comment',255) -> notNull();
$table -> tinyInteger('article_id');
});
}
public function down()
{
//
Schema::dropIfExists('comment');
}
}③执行迁移文件生成数据表
#php artisan migrate
④添加测试的评论内容
a.创建填充器文件
#php artisan make:seeder commentTableSeeder
b.编写填充器代码
DB::table('comment') -> insert([
[
'comment'=> ' 依法依规”不是“不办不干”的借口',
'article_id'=>rand(1,3)
],[
'comment'=> '险企自身保险才能保障民众 ',
'article_id'=>rand(1,3)
],[
'comment'=> ' 野生动物保护需持之以恒',
'article_id'=>rand(1,3)
],[
'comment'=> '严控城市更新中大拆大建',
'article_id'=>rand(1,3)
],
]);c.执行填充器文件
#php artisan db:seed --class=commentTableSeeder
⑤创建评论模型
#php artisan make:model Home/Comment
定义基本属性
class Comment extends Model
{
//
protected $table = 'comment';
public $timestamps = false;
}案例
关联关系的编写:
文章(主) 下的 评论(从)
publick function 被关联的模型名小写(){
return $this -> hasMany('需要关联模型的命名空间','被关联模型的关系字段','本模型中的关系字段');
}$data = Article::get();
//循环输出
foreach ($data as $key => $value){
echo '当前文章名称:'. $value -> article_name . ',其下评论为:<br>';
foreach ($value->comment as $k => $val){
echo $k.':'.$val->comment.'<br>';
}
}3、多对多关系
例如:一个文章分类有很多文章,一篇文章可能对应多个分类。
三表:文章表、分类表、文章-分类的关系表
当前已存在文章表,因此还需要关键词表合关系表。
关键词表:
id 主键
keyword 关键词
文章与关键词的关系表:
id 主键
article_id 文章id
key_id 关键词id
① 创建需要迁移文件
#php artisan make:migration create_keyword_table
#php artisan make:migration create_relation_table
②编写
③执行迁移文件
#php artisan migrate
④生成测试数据
#php artisan make:seeder KeywordAndRelationTableSeeder
执行填充器文件
#php artisan db:seed --class=KeywordAndRelationTableSeeder
⑤创建模型
注意:根据手册记录的语法要求,不需要给关系表单独创建模型。
只需要单独给keyword创建模型即可
#php artisan make:model Home/Keyword
定义模型基本内部结构
语法:
Return $this -> belongsToMant(被关联模型的元素空间路径 , 多对多模型关系表明, 当前模型中的关系表名,被关联模型的关系键)
根据要求,此处写在文章表中