//框架自动安装方法 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()) @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; }