为什么要使用框架?
框架提供了很多功能,比如数据库(DB),缓存(Cache), 会话(Session), 文件上传等。
不但为前期开发提供了方便,更为后期项目性能优化(缓存技术由文件缓存换成Redis), 平台的改变
(数据库由 Oracle 换成 MySQL)提供了技术保障。
选择框架 标准? 选择流行框架的优点?
文档齐全 社区活跃 后期支持好
Laravel的版本选择?
LTS 非LTS
LTS (Long Time Support) 长期支持
Laravel 遵守“早发布,常发布” 的版本发布准则,这是开源届通常的做法。
5.1 5.5 都是LTS 版本。
下载Larvavel / 安装 Laravel
https://laravel-china.org/docs/laravel-specification/5.5
www.golaravel.com/download
安装方法其二:
- 通过 Composer Create-Project命令安装Laravel
composer create-project laravel/laravel —prefer-dis [别名]
composer create-project laravel/laravel laravel55_demo --prefer-dist "5.5.*"
composer search laravel
2. Laravel 安装器
composer global require “laravel/installer”
laravel new blog //实验失败了todo
MVC 概述?
Model 是应用程序中用于处理应用程序数据逻辑的部分
View 处理应用程序中显示的部分
Controller 是应用程序中处理用户交互的部分
1. 从Model中获取数据,并输入到View中
2. 接收View 中的用户操作,然后做出相应的响应
Laravel 核心目录文件
bootstrap //框架启动
路由:
将用户的请求转发给相应的程序进行处理
作用就是 建立url 和程序之间的映射
请求类型 get post put patch delete
基本路由:
//基础路由 get
Route::get('/basic',function (){
return "hello basic1";
});
//基础路由
Route::post('basic2',function (){
return 'Basic2';
});
多请求路由:
//多请求路由
Route::match(['get','post'],'mulity1',function (){
return 'mulity1';
});
Route::any('mulity2',function (){
return 'multy2';
});
路由参数:
Route::get('user/{name?}',function($name = null){
return 'User-name:'.$name;
});
Route::any('member/{id}', ['uses' => 'MemberController@info'])->where('id','[0-9]+');
//正则表达式; name必须符合正则表达式
Route::get('user/{name?}',function ($name = 'sean'){
return 'User-name-'.$name;
})->where('name', '[A-Za-z]+');
Route::get('user/{id}/{name?}',function ($id, $name= 'seandd'){
return 'User-id-'.$id.'-name-'.$name;
})->where(['id'=>'[0-9]+', 'name'=>'[A-Za-z]+']);
路由别名:
Route::get('user/member-center',['as'=>'center',function(){
//return 'member-center';
return route('center');
}]);
路由群组:
Route::group(['prefix'=>'member'],function (){
Route::get('user/center',['as'=> 'center', function(){
return route('center');
}]);
Route::any('mulity2',function (){
return 'member-multy2';
});
});
路由中输出视图:
Route::get('view', function (){
return view('welcome');
});
控制器:
怎么新建一个控制器?
控制器 和路由怎样进行关联?
Route::get('member/info', 'MemberController@info');
Route::get('member/info',['uses'=> 'MemberController@info']);
Route::any('member/info',['uses'=> 'MemberController@info']);
Route::any('member/info',[
'uses'=> 'MemberController@info',
'as' => 'memberinfo'
]);
//传参数 ,注意 不要加$
Route::any('member/{id}', ['uses' => 'MemberController@info'])
->where('id','[0-9]+');
Route::group(['middleware'=>['web']],function (){
Route::any('session1',['uses'=>'StudentController@session1']);
Route::any('session2',['as'=> 'session2','uses'=>'StudentController@session2']);
});
Route::group(['middleware'=> ['activity']],function (){
Route::any('activity1', ['uses' => 'StudentController@activity1']);
Route::any('activity2', ['uses' => 'StudentController@activity2']);
});
关联控制器后,路由的特性怎么用?
视图:
- 可以 不使用特殊模版 PHP 来作为视图;
- 使用blade 模版
public function info($id)
{
//return view('member-info'); //对应resources/views/member-info.php
return view('member/info',[ //也可以使用. 号 member.info ; 对应resources/views/member/info.blade.php
'name' => '天秤',
'age'=> 18
]);
}
模型:
怎样新建模型
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
。。。。。
}
怎样使用模型
操作数据库 有哪几种方式?
- DB facade(原始查找)
- 查询构造器
- Eloquent ORM
使用 DB facade 实现CURD?
练习使用的数据库表:
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名',
`age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
`sex` tinyint(3) unsigned NOT NULL DEFAULT '10' COMMENT '性别',
`created_at` int(11) NOT NULL DEFAULT '0' COMMENT '新增时间',
`updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1024 DEFAULT CHARSET=utf8 COMMENT='学生表';
use Illuminate\Support\Facades\DB;
public function test1()
{
//新增
$bool = DB::insert('insert into student(name, age) values(?,?)', ['imooc', 20]);
dump($bool);
//更新
DB::update('update student set age=? where name=?', [22, 'sean']);
//删除
DB::delete('delete from student where id> ?',[1002]);
//查询
$students = DB::select('select * from student');
dump($students);
}
使用查询构造器 实现CURD?
查询构造器(query builder)
使用PDO参数绑定,以保护应用程序免于SQL 注入,因此传入的参数不需要额外转译特殊字符
use Illuminate\Support\Facades\DB;
public function query1()
{
//新增
$bool = DB::table('student')->insert(['name'=>'imooc2', 'age'=> 18]);
dump($bool);
$id = DB::table('student')->insertGetId(['name'=> 'sean2', 'age'=> 19]);
dump($id);
DB::table('student')->insert([
['name'=> 'name1','age'=> 18],
['name'=> 'name2', 'age'=> 19],
]);
//更新
$row = DB::table('student')->where('id',1005)->update(['age'=> 30]);
dump($row);
DB::table('student')->increment('age',3);
$row = DB::table('student')->decrement('age');
$num = DB::table('student')->where('id', 1005)->decrement('age',3);
DB::table('student')->where('id', 1005)->decrement('age',3,["name"=>'imooc']);
//删除
$num = DB::table('student')->where('id', '>=', 1005)->delete();
//查询
//获取所有数据
$students = DB::table('student')->get();
$student = DB::table('student')->orderBy('id','desc')->first();
$student = DB::table('student')->where('id','>=', 1002)->get();
dump($student);
$student = DB::table('student')->whereRaw('id >? and age > ?', [1001, 20])->get();
$student = DB::table('student')->whereRaw('id > ? and age > ?',[1001, 19])->pluck('name');
$student = DB::table('student')->whereRaw('id > ? and age > ?',[1001, 19])->lists('name');
dump($student);
//lists 废弃了?
$student = DB::table('student')->lists('name', 'id');
$students = DB::table('student')->select('id','name','age')->get();
DB::table('student')->orderBy('id','desc')->chunk(2, function ($student){
dump($student);
});
//聚合函数
$num = DB::table('student')->count();
$max = DB::table('student')->max('age');
$min = DB::table('student')->min('age');
$avg = DB::table('student')->avg('age');
$sum = DB::table('student')->sum('age');
dump($max, $min, $avg, $sum);
}
Eloquent ORM 简介
是一个优美简洁的ActiveRecord 实现,用来实现数据库操作
每个数据表都有一个与之对应的“模型” 用于和数据表交互。
如何创建模型?
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
//指定表名
protected $table = 'student';
//指定主键
protected $primaryKey = 'id';
//允许 批量 赋值的字段
protected $fillable = ['name','age'];
//指定不允许批量赋值的字段
protected $guarded = [];
//自动维护时间戳
public $timestamps = true;
protected function getDateFormat()
{
return time();
}
// protected function asDateTime($val)
// {
// //没有 作用 todo;
// //return $val;
// return date('Y-m-d H:i:s',time());
// }
}
ORM CURD操作?
新增:
通过模型新增数据(涉及到自定义时间戳); 使用模型的Create方法新增数据(涉及到批量赋值)
修改:
通过模型更新; 结合查询语句批量更新
删除:
通过模型删除; 通过主键值删除; 根据指定条件删除;
public function orm1()
{
//查询操作
$students = Student::all();
var_dump($students);
$student = Student::find(1002);
$student = Student::findOrFail(1002);
$students = Student::get();
$students = Student::where('id','>','1001')->orderBy('age','desc')->first();
dump($students);
$students = Student::chunk(2,function ($students){
var_dump($students);
});
$num = Student::count();
$max = Student::where('id','>',1001)->max('age');
dump($max);
//新增操作
//使用模型新增数据
$student = new Student();
$student->name = 'sean3';
$student->age = 18;
$bool = $student->save();
dump($bool);
//新增方法二:
$student = Student::create(
['name'=>'imooc', 'age'=>33]
);
//不存在 再创建
$student = Student::firstOrCreate(
['name'=> 'imoocs']
);
//不存在 ,创建对象
$student = Student::firstOrNew(
['name'=> 'imoocsss']
);
$bool = $student->save();
dump($bool);
//更新操作
$bool = Student::where('id', '>', 1012)->update(
['age'=> 41]
);
dump($bool);
//删除操作
//通过模型删除
$student = Student::find(1014);
$bool = $student->delete();
//通过主键删除
$num = Student::destroy(1013);
var_dump($num);
//通过主键 删除 多个
$num = Student::destroy(1012, 1011);
$num = Student::destroy([1012, 1011]);
var_dump($num);
//通过条件删除
$num = Student::where('id','>',1009)->delete();
var_dump($num);
}
Blade 模版引擎简介
和其他流行的PHP模版引擎不一样,Blade并不限制你在视图(view)中使用原生PHP代码
所有Blade视图页面都将被编译成 原生PHP代码并缓存起来, 除非你的模版文件被修改了,否则不会重新编译。
模版继承?
涉及的内容: section yield extends parent
layouts.blade.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>laravel 模版继承- @yield('title')</title>
<style>
……….
</style>
</head>
<body>
<div class="header">
@section('header')
头部
@show
</div>
<div class="main">
<div class="sidebar">
@section('sidebar')
侧边栏
@show
</div>
<div class="content">
@yield('content', '主要内容区域')
</div>
</div>
<div class="footer">
@section('footer')
底部
@show
</div>
</body>
</html>
student/section1.blade.php
@extends("layouts")
@section('header')
@parent
section1-header
@stop
@section('sidebar')
@parent
section1-sidebar
@stop
@section('content')
section1-content
<!---1. 模版中输出PHP变量--->
<p>{{$name}}</p>
<!---2. 模版中调用PHP代码----->
<P>{{ time() }}</P>
<p>{{ date('Y-m-d H:i:s', time()) }}</p>
<p>{{ in_array($name, $arr) ? 'true': 'false' }}</p>
<p>{{ var_dump($arr) }}</p>
<p>{{ isset($name) ? $name : 'default' }}</p>
<p>{{ $name1 or 'default' }}</p>
<!----3. 原样输出------>
{{--<p>@{{ $name }}</p>--}}
{{-- 4。模版中的注释--}}
<!---5. 引入子视图---->
@include('student.common1',['message'=>'错误信息'])
@if($name == 'sean')
I'm sean
@elseif($name == 'imooc')
I'm imooc
@else
Who am I?
@endif
@if(in_array($name, $arr))
true
@else
false
@endif
<br/>
@unless($name != 'sean')
I'm sean
@endunless
@for($i=0; $i< 10; $i++)
<p>{{ $i }}</p>
@endfor
@foreach($students as $student)
<p>{{$student->name}}</p>
@endforeach
@forelse($students as $student)
<p>{{$student->name}}</p>
@empty
<p>null</p>
@endforelse
<a href="{{ url('url') }}">url()</a>
<a href="{{action('StudentController@urlTest')}}">action()</a>
<!--好像不行 用 route 方式-->
{{--<a href="{{ route('url') }}">route()</a>--}}
@stop
模版中语法:
模版中输出PHP变量; 模版中调用PHP代码;原样输出;模版中的注释;引入子视图; 模版中流出控制语句;模版中URL
模版中的URL
url() ; action();
Controller 之 Request, Session , Response, Middleware
Controller 之Request Laravel 中的请求使用的是 symfony/http-foundation组件。
请求里面存放了$_GET, $_POST, $_COOKIE, $_FILES, $_SERVER等数据。
public function request1(Request $request)
{
//1. 取值
echo $request->input('name');
echo $request->input('sex','未知');
if($request->has('name')){
echo $request->input('name');
} else {
echo '无该参数';
}
$res = $request->all();
dd($res);
//判断请求类型
echo $request->method();
if($request->isMethod('GET')){
echo 'Yes';
} else {
echo 'No'
}
$bool = $request->ajax();
dd($bool);
//$res = $request->is('student/*'); //路由
$res = $request->is('request1');
echo $url = $request->url();
}
controller 之 Session
Laravel 支持了多种session 后端驱动,并提供清楚统一的API.也内置如Memcached, Redis 和数据库的后端驱动。默认使用“file” 的Session 驱动。
配置文件在 config/session.php ;
Laravel 中使用session有三种方式
- HTTP request类的session()方法
- session() 辅助函数
- Session facade
Route::group(['middleware'=>['web']],function (){
Route::any('session1',['uses'=>'StudentController@session1']);
Route::any('session2',['as'=> 'session2','uses'=>'StudentController@session2']);
});
public function session1(Request $request)
{
//1.HTTP request session();
$request->session()->put('key1', 'value1');
//2. session函数
session()->put('key2','value2');
echo session()->get('key2');
//3. Session facades 类
//Session::put('key3','value3');
Session::put('key3','value3');
//以数组的形式 放到Session中
Session::put(['key4'=> 'value4']);
//把数据放到Session 的数组中
Session::push('student', 'sean');
Session::push('student','imooc');
$res = Session::get('student','default');
var_dump($res);
//判断session 中某个可以是否存在
if(Session::has('key1')){
$res = Session::all();
} else {
echo '你们老大不在';
}
//删除session 中指定key的值
//Session::forget('key2');
//清空所有session 信息
//Session::flush();
//没成功 ?? todo
$bool = Session::flash('key-flash','val-flash');
dump($bool);
$res = Session::pull('student','default');
$res = Session::all();
dump($res);
//第一次访问存在,第二次不存在 没做通??
echo $res = Session::get('key-flash');
dump($res);
}
Controller 之Response
常见的响应类型
字符串; 视图; Json; 重定向;
public function response()
{
$data = [
'errCode'=>0,
'errMsg'=> 'success',
'data'=> 'sean',
];
//3. 响应json
return response()->json($data);
//4. 重定向
return redirect('session2');
//4. 重定向,带数据(session flash类型
return redirect('session2')->with('message','我是数据');
//action
return redirect()->action('StudentController@session2')->with('message','我是数据2');
return redirect()->route('session2')->with('message','我是数据3');
//返回上一个页面
return redirect()->back();
}
Controller 之 Middleware
中间件的作用?
Laravel 中间件提供一个方便的机制来过滤进入应用程序的HTTP请求。
场景:
有一个活动,在指定日期后开始,如果活动没开始只能访问宣传页面;
涉及新建中间件; 注册中间件; 使用中间件;中间价的前置和后置操作
Route::any('activity0', ['uses' => 'StudentController@activity0']);
Route::group(['middleware'=> ['activity']],function (){
Route::any('activity1', ['uses' => 'StudentController@activity1']);
Route::any('activity2', ['uses' => 'StudentController@activity2']);
});
控制器:
//活动宣传页面
public function activity0(){
return "活动快要开始了,敬请期待";
}
//活动进行中
public function activity1(){
return "活动1进行中";
}
public function activity2(){
return "活动2进行中";
}
中间件:
namespace App\Http\Middleware;
use Closure;
class Activity
{
//前置操作
// public function handle($request, Closure $next)
// {
// if(time() < strtotime('2019-01-18')){
// return redirect('activity0');
// }
//
// return $next($request);
// }
//后置操作 没做通 todo;
public function handle($request, Closure $next)
{
// if(time() < strtotime('2019-01-15')){
// return redirect('activity0');
// }
$response = $next($request);
var_dump($response);
echo '我是后置操作';
}
}
表单案例 todo
Artisan 控制台
Artisan简介:
Artisan 是Laravel 中自带的命令行工具的名称
由 Symfony Console 组件驱动
提供了一些对应用开发有帮助的命令
查看所有可用的Artisan 命令
php artisan
php artisan list
查看命令的帮助信息(help)
php artisan help migrate
Artisan 基本使用
创建控制器
php artisan make:controller StudentController
创建模型
php artisan make:model Student
创建中间件
php artisan make:middleware Activity
Laravel中用户认证(Auth)
生成Auth所需文件:
php artisan make:auth
php artisan migrate
如果是mysql5.7下可能会报错解决方法如下:加上Schema:defaultStringLength(191)
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Schema::defaultStringLength(191);
}
………………
}
数据迁移
新建迁移文件,有两种
新建一个student表的迁移文件
php artisan make:migration create_students_table —table [数据表名称] —create [是否建立新的数据表]
php artisan make:migration create_students_table —create=students
生成模型的同时生成迁移文件
php artisan make:model Student -m
下一步在迁移文件中 增加字段
下一步 php artisan migrate
数据填充
如何 创建一个填充文件?
php artisan make:seeder StudentTableSeeder
use Illuminate\Database\Seeder;
class StudentTableSeeder extends Seeder
{
public function run()
{
//
DB::table('students')->insert([
['name' => 'sean', 'age'=>18],
['name' => 'mooc', 'age'=>20],
]);
}
}
如何执行单个填充文件?
php artisan db:seed —class=StudentTableSeeder
如何批量执行填充文件?
php artisan db:seed
Laravel中的文件上传?
Laravel 的文件系统是基于Frank de Jonge的Flysystem 扩展包
提供了简单的接口,可以操作本地端空间, Amazon S3 , Rackspace Cloud Storage
可以非常简单的切换不同保存方式,但仍使用相同的API 操作
配置文件config/filesystems.php
public function upload(Request $request)
{
if($request->isMethod('POST')){
var_dump($_FILES);
exit;
$file = $request->file('source');
if($file->isValid()){
$originalName = $file->getClientOriginalName();
$ext = $file->getClientOriginalExtension();
$type = $file->getClientMimeType();
$realPath = $file->getRealPath(); //临时绝对路径
$file = date('Y-m-d-H-i-s').'-'.uniqid().'.'.$ext;
$bool = Storage::disk('uploads')->put($file, file_get_contents($realPath));
var_dump($bool);
}
}
return view('student.upload');
}
邮件
Laravel 的邮件功能基于热门的SwiftMailer 函数库之上,提供了一个简洁的API
Laravel 为 SMTP, Mailgun, Mandrill, Amazon, SES, PHP的mail函数, 以及sendmail 提供了驱动从而允许你快速通过
本地或云服务发送邮件。
配置文件config/mail.php
发送邮件两种格式 一种纯文本,一种是(html)
MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=465
MAIL_USERNAME=zhaozhiliang03@163.com
MAIL_PASSWORD=163coxxdexxx
MAIL_ENCRYPTION=ssl
public function mail()
{
// // 这个成功了
// Mail::raw('邮件内容', function ($message){
// $message->from('zhaozhiliang03@163.com', '慕课网');
// $message->subject('邮件主题 测试');
// $message->to('390382430@qq.com');
// });
//from subject ,to 这些都要有
Mail::send('student.mail', ['name'=> 'sean'], function ($message){
$message->from('zhaozhiliang03@163.com', '慕课网2');
$message->subject('邮件主题 测试2');
$message->to('390382430@qq.com');
});
}
缓存
介绍:
Laravel 为各种不同的缓存系统提供一致的API
Laravel支持各种常见的后端缓存系统,如File, Memcached 和Redis
主要方法如:
put() ; add(); forever(); has(); get(); pull(); forget();
配置:
config/cache.php
public function cache1()
{
//put
//Cache::put('key1', 'val1', 10);
//add 如果已经存在 就返回false
// $bool = Cache::add('key2', 'val2', 10);
// dd($bool);
//forever()
$bool = Cache::forever('key3', 'val3');
dump($bool);
//has
if(Cache::has('key1')){
$val = Cache::get('key3');
var_dump($val);
}else{
echo 'No';
}
//pull
$bool = Cache::pull('key1');
dump($bool);
//forget 删除缓存
$bool = Cache::forget('key2');
}
错误 和 日志
debug 模式;配置文件config/app.php
Laravel日志工具基于monolog库,提供了 single, daily, syslog, 和 errorlog 日志模式
public function error(){
//$name = 'sean';
//var_dump($name);
//return view('student.error');
// $student = null;
// if($student == null){
// //abort('503');
// abort('404');
// }
//Log::info('这是一个info 级别的日志');
//Log::warning("这是warning 级别日志");
Log::error('这是一个数组',['name'=>'sean','age'=>19]);
}
队列:
Laravel队列服务为各种不同的后台提供了统一的API
允许推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度。
主要步骤:
- 迁移队列需要的数据表
- 编写任务类
- 推送任务到队列
- 运行队列监听器
- 处理失败任务
php artisan queue:table
php artisan migrate
php artisan make:job SendEmail
public function handle()
{
//
Mail::raw('队列测试',function ($message){
$message->from('zhaozhiliang03xxxx@163.com', '慕课网');
$message->subject('邮件主题 测试');
$message->to('390382xxx@qqxxxx.com');
});
//Log::info('已发送邮件-'.$this->email);
}
控制器中
public function queue()
{
dispatch(new SendEmail("390382430@qq.com"));
return 'queue';
}
php artisan queue:listen