//框架自动安装方法
composer create-project laravel/laravel=5.1.* -prefer-dist
//路由
laravel目录/app/Http/routes.php
##get##
Route::get('/funcname1',function(){
//view模板文件目录 laravel目录/app/resources/views/
//view模板文件名 gaozhan.blade.php
return view('gaozhan');
});
##post##
Route::post('/funcname2',function(){
return 'post访问方法';
});
##多种请求方式##
Route::match(['get','post'],'/funcname3',function(){
reutrn '多种请求方式';
});
##所有请求方式##
Route::any('/funcname4',function(){
return '所有请求方式';
});
##必选参数##
Route::any('/funcname5/{name}/{year}',function($name,$year){
return "必选参数:{$name}{$year}";
});
##可选参数##
Route::any('/funcname6/{name?}/{year?}',function($name='默认值',$year='默认值'){
return "可选参数:{$name}---{$year}";
});
##正则参数约束##
Route::any('/funcname7/{name?}/{year?}',function($name='默认值',$year='0'){
return "正则约束:{$name}{$year}";
})->where('name','[a-zA-Z]+');
//访问链接 http://localhost/laravel/public/funcname7/name/1
##路由名称##
##路由命名可以让我们在使用route函数生成指向该路由的URL或者生成跳转到该路由的重定向链接时更加方便##
Route::any('/xxxxssssssssyyyyyyyyyyy/{id}',['as'=>'bieming',function($id){
return "路由别名:{$id}";
}]);
Route::any('/funcname8',function(){
//return route('bieming',['id'=>1]); //输出指定名称的路由链接 这里名称使用的是别名
return redirect()->route('bieming',['id'=>1]); //跳转到指定路由
});
##路由分组##
##分组的约束是对route方法生效的,分组对前台直接访问是无用的 例子中客户直接访问http://localhost/a是可以访问成功的##
Route::group(['as' => 'admin::','prefix'=>'admin'], function () { //admin分组
Route::get('a', ['as' => 'a', function () {
echo '路由分组a';
}]);
Route::get('b', ['as' => 'b', function () {
echo '路由分组b';
}]);
});
Route::get('/funcname9',function(){
return redirect()->route('admin::b'); //跳转到admin分组的b路由
});
//访问链接 http://localhost/laravel/public/funcname9
##命名空间##
//默认情况下routes.php定义的控制器位于app\Http\Controllers命名空间下,要修改指定此路径之后的部分即可
Route::group(['namespace'=>'LaravelAcademy'],function(){
//控制器在 "App\Http\Controllers\LaravelAcademy"命名空间下
Route::group(['namespace'=>'docs'],function(){
//控制器在"App\Http\Controllers\LaravelAcademy\docs"命名空间下
});
});
##路由前缀##
Route::group(['prefix'=>'qz/{version}'],function(){
Route::get('a',function($version){
return "前缀的参数为: {$version}";
});
Route::get('b',function($version){
return "前缀的参数为: {$version}";
});
});
//访问链接 http://localhost/laravel/public/qz/1.1/a
##路由缓存##
(shell) php artisan route:cache
//在不再生成新的路由缓存的情况下删除路由缓存
(shell) php artisan route:clear
##中间件##
//中间件文件存放目录 laravel目录/app/Http/Middleware/
//生成文件命令 (shell) php artisan make:middleware TestMiddleware Test中间件
public function handle($request, Closure $next,$type) //$type为额外参数
{
if($type !='news'){ //如果传入的额外参数不是news就抛弃
return redirect()->route('refuse',['age'=>$request->input('age')]);
}
//传入的age参数如果小于18 就跳转到名称为refuse的路由
if($request->input('age')>18)
{
return redirect()->route('refuse',['age'=>$request->input('age')]);
}
return $next($request); //否则正常跳转
}
//注册中间件
//打开/app/Http/Kernal.php文件,新增TestMiddleware到Kernel的$routeMiddleware属性:
protected $routeMiddleware = [
...
'test' => \App\Http\Middleware\TestMiddleware::class, //增加test中间件 名称为test
];
//使用中间件 把中间件绑定到分组上
Route::group(['middleware'=>'test:news'],function(){ //test中间件后面的news就是中间件的额外参数
Route::get('/funcname10',['as'=>'funcname10',function(){
return "经过test中间件过滤的才能访问到本页面";
}]);
});
Route::get('/refuse/{age}',['as'=>'refuse',function($age){
return "未通过中间件过滤 age为:{$age}";
}]);
//访问链接 http://localhost/laravel/public/funcname10?age=100
//这里有个问题 url中/public/funcname10/xx 和?name=xx 不是一个概念的东西
//定义好中间件后,需要在app/Http/Kernel.php文件中注册该中间件,如果我们定义的中间件想要在全局有效,
即每次请求都会调用,则将该中间件追加到$middleware属性数组;否则如果中间件只是在某些特定的路由中使用,
则将其追加到$routeMiddleware属性数组,并在路由定义时使用middleware选项指定。
//CSRF攻击处理
##Laravel提供了一个全局帮助函数csrf_token来获取该Token值,因此只需在视提交图表单中添加如下HTML代码即可在请求中带上Token:
该段代码等同于全局帮助函数csrf_field的输出:
##取消CSRF验证##
可以通过在VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中间件中将要排除的请求URL添加到$except属性数组中:
class VerifyCsrfToken extends BaseVerifier
{
/**
* 指定从 CSRF 验证中排除的URL
*
* @var array
*/
protected $except = [
'funcname11',
];
}
//访问链接 http://localhost/laravel/public/funcname11
##Ajax提交POST表单##
如果使用Ajax提交POST表单,又该如何处理呢?我们可以将Token设置在meta中:
然后在全局Ajax中使用这种方式设置X-CSRF-Token请求头并提交:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
//控制器
//控制器文件存放目录 laravel目录/app/Http/Controllers
//生成文件命令 php artisan make:controller PostController
##注册RESTFul风格控制器路由##
Route::resource('request','PostController');
##普通注册##
Route::get('users/index','UsersController@index')->name('名称 ->name可选');
Route::get('users/index',['middleware' => '中间件','uses'=>'UsersController@index']);
##在控制器构造方法中指定中间件更方便##
class UserController extends Controller
{
/**
* Instantiate a new UserController instance.
* 实例化一个新的UserController实例
*
* @return void
*/
public function __construct()
{
$this->middleware('auth'); //使用auth中间件过滤
$this->middleware('log', ['only' => ['func1', 'func2']]); //绑定中间件到指定方法1,2
$this->middleware('subscribed', ['except' => ['func1', 'func2']]); //绑定中间件到除指定方法之外的所有方法
}
}
##分页##
//控制器中
$res = Student::paginate(10(每页数量));
//模板中
{{$res->render()}}
##获取参数##
public function index(Request $request)
{
$request->method(); //请求类型
if( $request->isMethod('POST')){ //判断是否为post
//1.控制器验证([验证规则],[自定义错误提示],[字段别名])
$this->validate($request,[
'字段' => '验证规则',
'tel' => 'required|min:6|max:12'
],[
'验证规则'=>'自定义错误提示',
'required' => ':attribute 为必填项',
'min'=>':attribute 最小长度不符合要求',
'max'=>':attribute 最大长度不符合要求'
],[
'字段'=>'自定义字段名称',
'tel' =>'电话'
]);
//2.validator类验证
$validator = \Validator::make($request->input(), [
'字段' => '验证规则',
'tel' => 'required|min:6|max:12'
],[
'规则'=>'自定义错误提示',
'required' => ':attribute 为必填项',
'min'=>':attribute 最小长度不符合要求',
'max'=>':attribute 最大长度不符合要求'
],[
'字段'=>'自定义字段名称',
'tel' =>'电话'
]);
if($validator->fails()){
//验证失败 返回错误信息
return $validator->errors(); //这个返回所有错误信息 下面的是back返回errors
//withinput()会把此前提交传入的request输入的信息再返回去,使用方法是{{old('表单名')}}
return redirect()->back()->withErrors($validator)->withInput();
}
//错误展示
//模板中错误信息的展示 返回的错误信息是$errors对象
@if($errors->any())
@foreach($errors->all() as $error)
- {{ $error }}
@endforeach
@endif
$name = $request->input('name','默认值');
//判断参数名是否存在
if($request->has('name'))
echo $request->input('name');
//获取所有参数
$allData = $request->all();
//获取指定参数
$onlyData = $request->only('name','title');
//获取所有参数 排除指定参数
$exceptData = $request->except('name');
//调用Input类来接收传入的参数
$input = Input::all();
$name = $input['name'];
//获取请求类型
if($request->method() == 'POST'){}
//判断请求类型
$request->isMethod('POST');
//获取url
$request->url();
}
}
##加解密##
use Illuminate\Support\Facades\Crypt;
//解密
$user = User::where('id','=','1')->first()
if(Crypt::decrypt('密码') == $user['passwd']){
密码正确
}
//加密
Crypt::encrypt('密码');
##上一次请求的输入##
//在本次访问时,将传入的参数存入session
public function a(Request $request){
$request->flash();
}
//下次访问时,将session存的参数取出
public function b(Request $request){
$request->old();
}
//将当前请求的参数重定向到指定URL
public function a(Request $request){
//$request->flash();
return redirect('/b')->withInput();
}
##url获取##
if($request->is('index'))
{
echo 'url为index';
}
else
{
echo 'url不为index';
}
//获取不带域名的url
$uri = $request->path();
//获取带域名的url
$url = $request->url();
##请求方法##
if($request->isMethod('get'))
{
echo '请求访问为get';
}
##cookie##
//获取cookie
$cookieDat = $request->cookie();
//新增cookie
public function index()
{
$response = new Response();
//第一个参数是cookie名,第二个参数是cookie值,第三个参数是有效期(分钟)
$response->withCookie(cookie('website','LaravelAcademy.org',1));
//如果想要cookie长期有效使用如下方法
$response->withCookie(cookie()->forever('name', 'value'));
return $response;
}
//模型
目标文件存放目录 laravel目录\app\
直接调用方法就行
//数据库
##facade##
use Illuminate\Support\Facades\DB;
//查
$res = DB::select('select * from xx');
//增
DB::insert('insert into xx('name','year') values(?,?)',['gaozhan','25']);
//删
DB::delete('delete from xx where name=?',['gaozhan']);
//改
DB::update('update xx set year = ? where name= ?',[26,'gaozhan']);
##查询构造器##
//增
$bool = DB::table('xx')->insert(['name'=>'gaozhan','year'=>25]);
//返回自增id的增
$id = DB::table('xx')->insertGetId(['name'=>'gaozhan','year'=>25]);
//改
$num = DB::table('xx')->where('name','gaozhan')->update(['year'=>24]);
//自增1
$num = DB::table('xx')->where('name','gaozhan')->increment('age',1,['name'=>'自增时修改其他字段 可选']);
//自减1
$num = DB::table('xx')->where('name','gaozhan')->decrement('age',1);
//删
$num = DB::table('xx')->where('name','gaozhan')->delete();
//范围条件删除
$num = DB::table('xx')->where('year','>=',25)->delete();
//清空表
DB::table('xx')->truncate();
//查
//多条记录
$res = DB::table('xx')->where('name','gaozhan')->get();
//多条件查询多条记录
$res = DB::table('xx')->whereRaw('id >= ? and name = ?',[10,'gaozhan'])->get();
//单条记录
$res = DB::table('xx')->where('name','gaozhan')->orderBy('id','desc')->first();
//指定1个字段查询
$res = DB::table('xx')->where('name','gaozhan')->pluck('name')->get();
//指定多个字段查询
$res = DB::table('xx')->where('name','gaozhan')->select('id','name')->get();
//分段查询数据(一次查10条,结果传递进匿名函数中调用)
DB::table('xx')->chunk(10,function($res){
var_dump($res);
//return false; 使用这个可以中断查询
});
//聚合函数
$num = DB::table('xx')->count(); //条数
$num = DB::table('xx')->max('year'); //最大值
$num = DB::table('xx')->min('year'); //最小值
$num = DB::table('xx')->avg('year'); //平均值
$num = DB::table('xx')->sum('year'); //和
##ORM##
namespace App\Http\Model;
class Student extends model
{
//指定表名
protected $table = 'student';
//指定主键
protected $primanyKey = 's_id';
//允许批量赋值字段(允许批量操作的字段)
protected $fillable = ['name','age'];
//不允许批量赋值字段
protected $guarded = ['title'];
//时间戳
public $timestamps=true; //false关闭
//对应create_at和update_at字段
//时间戳自动调用方法 操作数据时如果打开了时间戳会自动调用本方法
protected function getDateFormat()
{
return time();
}
}
//查询所有
$res = Student::all();
//查询单个(id为指定主键值)
$res = Student::find(1001);
//查询所有
$res = Student::get();
//条件查询
$res = Student::where('id','=','1001')
->orderBy('id','desc')->first();
//匿名函数处理
Student::chunk(10,function($res){
dd($res);
});
//聚合函数
$count = Student::count();
$max = Student::where('id','>',1001)->max('age');
//增
$student = new Student();
$student->name = '高展';
$student->age = 25;
$bool = $student->save(); //会自动更新时间戳
//create增 (需要配置fillable属性为true,允许批量赋值)
$bool = Student::create(
['name'=>'高展','age'=>25]
);
//不重复的增 重复值不会增加
$bool = Student::firstOrCreate(
['name'=>'高展','age'=>25]
);
//通过模型修改
$student = Student::find(1001);
$student->name='高展2';
$student->save();
//update方法
$num = Student::where('id','>','1001')->update(
['name'=>'高展2']
);
//通告模型删除
$student = Student::find(1001);
$student->delete();
//通过主键删除
$num = Student::destroy(1001,1002);
//delete方法
$num = Student::where('id','>','1001')->delete();
//视图
视图文件存放目录 : laravel目录\resources\views
##路由传递参数##
Route::get('/show',function () {
return view('template',['name'=>'gaozhan']);
});
##view传递参数##
view('template',['name'=>'gaozhan']);
##with传递参数##
view('template')->with('name','gaozhan');
##传参数给所有视图模板##
view()->share('key','value');
##判断视图文件是否存在##
if(view()->exists('template')){echo '视图模板文件不存在';};
##模板变量使用##
{{$name}} {{date('Y-m-d',time())}}
//若要原样输出{{xx}} 这样就可 @{{xx}}
##存在就输出##
{{ isset($name) ? $name : 'Default' }}
{{ $name or 'Default' }}
##不转义输出##
//默认会用htmlentities转义过滤xss攻击
Hello, {!! $name !!}.
##if##
@if($key ==1)
值为1
@elseif ($key ==2)
值为2
@else
其他值
@endif
##循环##
@for($i=0;$i<10;$i++)
{{$i}}
@endfor
@foreach ($users as $user)
{{ $user->id }}
@endforeach
##引入子视图##
@include('error',['name'=>'向子视图单独传入数据'])
##注释##
{{ --注释内容不会出现在最后生成的页面中--}}
##继承##
基础模板base.blade.php
...
@yield('contents')
...
继承模板
@extends('base')
@section('content')
模板内容,替换基础模板中 @yield('contents')位置
@endsection
//数据迁移
##创建表##
创建表语句 (shell) php artisan make:migration create_users_table
生成文件目录 laravel目录\database\migrations\*.xxxx.php
class CreateUsersTable extends Migration
{
...
public function up()
{
Schema::create('表名',function(Blueprint $table){
$table->increments('id'); //数据库主键自增 ID
$table->integer('votes'); //等同于数据库中的 INTEGER 类型
$table->float('amount'); //等同于数据库中的 FLOAT 类型
$table->char('name', 4); //等同于数据库中的 CHAR 类型
$table->string('name', 100); //等同于数据库中的 VARCHAR
$table->dateTime('created_at'); //等同于数据库中的 DATETIME 类型
$table->enum('choices', ['foo','bar']); //等同于数据库中的 ENUM 类型
$table->tinyInteger('numbers'); //等同于数据库中的 TINYINT 类型
$table->timestamps(); //添加 created_at 和 updated_at 列
});
}
...
}
//在laraval目录\app\User.php 中 修改字段信息 本例存疑
protected $fillable = ['name', 'email', 'is_admin', 'password', 'sex', 'phone', 'pro_class'];
在数据库中根据文件生成表
(shell) php artisan migration //生成命令
(shell) php artisan migrate:rollback //回滚命令
##创建数据##
创建填充器语句 (shell) php artisan make:seeder UserTableSeeder
生成文件目录 laravel目录\database\seeds\
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
public function run()
{
DB::table('表名')->insert([
'name' => '数据',
]);
}
}
//启用填充器
//在database\seeds\DatabaseSeeder.php下run()方法中 输入
$this->call(UsersTableSeeder::class);
在数据库中根据文件操作数据
(shell) php artisan db:seed
// session
public function session_setting(Request $request)
{
//三种方式
1.http request session();
$request->session()->put('key','value'); //存
echo $request->session()->get('key'); //取
2.session();
session()->put('key','value'); //存
session()->get('key'); //取
3.session类
Session::put('key','value'); //存
Session::get('key','default'); //取 有默认值
Session::has('key'); //判断是否有值
Session::forget('key'); 删除指定session值
Session::flush(); //删除全部session
}
//响应 response();
//返回json
return response()->json(['key'=>'value']);
//重定向 redirect();
return redirect('url');
return redirect('url')->with('name','快闪数据');
return redirect()->action('IndexController@index')->with('name','快闪数据');
http://laravelacademy.org/laravel-tutorial-5_1
https://laravel-china.org/topics/804 一个学生分数管理例子
图片处理
compser.json中require下添加
"intervention/image":"dev-master" 然后执行composer update
//
if($request->hasFile('表单名')){ //判断是否有指定表单名的文件
$file = $request->表单名
$name = str_random(10).'jpg'; //随机名字
$path =public_path().'/uploads/images/'.$name, //保存文件的路径
Image::make($file)->resize(高,宽)->save($path);
//带路径的文件名 为 $path;
}