[TOC]
一、laravel下载安装
下载地址:http://www.golaravel.com/
下载版本:v5.2.15
安装环境:php5.5
1) 将解压目录放进根目录laravelstudy中
2) www.laravelstudy.com/laravel/public => 可以看见 laravel 5 (安装成功)
二、laravel目录介绍
app 核心目录
bootstrap 框架启动、自动加载配置
config 所有文件的配置
database 数据库相关
public 入口文件、项目静态资源文件
resources 视图文件
storage 编译后的模板文件、日志文件、缓存文件
tests 单元测试目录
vendor composer加载的依赖文件
三、laravel路由和MVC
传统的MVC中请求的一般是控制器,laravel中请求的是路由
laravel中的路由简单的说就是将用户的请求转发给相应的程序进行处理,作用就是建立url和程序之间的映射
路由请求类型get、post、put、patch、delete
基本路由:
路由文件 app/Http/routes.php
get方式:
Route::get('basic1', function () {
return 'basic1';
});
测试地址 http://www.laravelstudy.com/laravel/public/basic2
测试结果 basic1
post方式:
Route::post('basic2', function () {
return 'basic2';
});
测试地址 post不能通过url访问
match方式:
Route::match(['get', 'post'], 'multy1', function () {
return 'multy1';
});
测试地址 http://www.laravelstudy.com/laravel/public/multy1
测试结果 multy1
any方式:
Route::any('multy2', function () {
return 'multy2';
});
测试地址 http://www.laravelstudy.com/laravel/public/multy2
测试结果 multy2
路由参数:
Route::get('user/{id}', function ($id) {
return $id;
});
测试地址 http://www.laravelstudy.com/laravel/public/user/3
测试结果 3
Route::get('user/{name?}', function ($name = 'default') {
return $name;
});
测试地址 http://www.laravelstudy.com/laravel/public/user
测试结果 default
测试地址 http://www.laravelstudy.com/laravel/public/user/xiaodong
测试结果 xiaodong
还可以使用正则匹配
Route::get('user/{name?}', function ($name = 'default') {
return $name;
})->where('name', '[A-Za-z]+');
路由别名:
给当前的路由设置别名,不管url如何变化,route函数都能正确获取到url
Route::get('user/gerenzhongxin', ['as' => 'center', function () {
return route('center');
}]);
测试地址 http://www.laravelstudy.com/laravel/public/user/gerenzhongxin
测试结果 http://www.laravelstudy.com/laravel/public/user/gerenzhongxin
路由群组:
给当前的路由设置前缀
Route::group(['prefix' => 'member'], function () {
Route::get('name', function () {
return 'name';
});
Route::any('age', function () {
return 'age';
});
});
测试地址 http://www.laravelstudy.com/laravel/public/member/name
测试结果 name
测试地址 http://www.laravelstudy.com/laravel/public/member/age
测试结果 age
路由输出视图:
view方法用于输出视图文件
Route::get('index', function () {
return view('index');
});
通过a链接传递参数:
Route::any('/participle/aid/{id}', 'ParticipleController@select');
public function select($id){
echo $id;
}
四、laravel控制器
1、怎么新建一个控制器
例子(1)
新建一个控制器类:
app/Http/Controllers/MemberController.php
namespace App\Http\Controllers;
class MemberController extends Controller {
public function index() {
return route('member');
}
}
添加路由:
app/Http/routes.php
Route::get('member/index', [
'uses' => 'MemberController@index',
'as' => 'member'
]);
例子(2)传递参数、验证参数
namespace App\Http\Controllers;
class MemberController extends Controller {
public function index($id) {
return $id;
}
}
Route::get('member/{id}', [
'uses' => 'MemberController@index',
'as' => 'member'
])->where('id', '[0-9]+');
2、分配数据
return view('phpknowledge.index', [
'all_knowledge' => $all_knowledge
]);
五、laravel视图
1、怎样输出视图
namespace App\Http\Controllers;
class MemberController extends Controller {
public function index() {
return view('member');
}
}
Route::get('member/index', 'MemberController@index');
2、一个控制器对应一个view文件夹
app/Http/Controllers/MemberController.php
namespace App\Http\Controllers;
class MemberController extends Controller {
public function index() {
return view('member/member');
}
}
app/Http/routes.php
Route::get('member/index', 'MemberController@index');
resources/views/member/member.blade.php
my name is member
3、将控制器的数据输出到视图文件上
Route::get('member/index', 'MemberController@index');
namespace App\Http\Controllers;
class MemberController extends Controller {
public function index() {
return view('member/member', [
'name' => 'gengen',
'age' => 18
]);
}
}
my name is member
{{$name}}
{{$age}}
4、循环数据
@foreach($all_knowledge as $key => $value)
{{$value->title}}
@endforeach
5、页面跳转
return redirect('/uploadknowledge');
六、laravel模型
1、新建模型
Route::get('member/index', 'MemberController@index');
namespace App\Http\Controllers;
use App\Member;
class MemberController extends Controller {
public function index() {
return Member::getMember();
}
}
新建一个模型文件app\Member.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Member extends Model{
public static function getMember(){
return 'this is mebber model';
}
}
七、连接数据库、操作数据库的三种方式
laravel中提供DB facade(原始查找)、查询构造器、Eloquent ORM三种操作数据库方式
1、连接数据库
.env 数据库配置
DB_HOST=localhost dbhost
DB_DATABASE=laravel dbname
DB_USERNAME=root username
DB_PASSWORD=root password
2、使用DB facade实现CURD
(1) 新建路由
Route::get('city', 'cityController@index');
(2) 新建控制器,直接在控制器里面查询
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class CityController extends Controller {
public function index() {
$insert = DB::insert('insert into city set name="安徽",state="init"');
增:返回bool
$delete = DB::delete('delete from city where id > 5');
删:返回删除的行数
$update = DB::update('update city set name = "上海" where id = 8');
改:返回更新的行数
$city = DB::select('select * from city');
查:返回数组
}
}
3、使用查询构造器实现CURD
(1)增:
$insert_bool = DB::table('city')->insert(['name' => '湖南', 'state' => 'init']);
插入一条数据返回bool值
$insert_id = DB::table('city')->insertGetId(['name' => '湖北', 'state' => 'init']);
插入一条数据返回插入的记录id
$insert_bool = DB::table('city')->insert([['name' => '北京', 'state' => 'init'], ['name' => '上海', 'state' => 'init']]);
插入多条数据返回bool值
(2)删:
$delete_row = DB::table('city')->where('id', 14)->delete();
删除一条记录,返回受影响的行数,1行
$delete_table = DB::table('city')->truncate();
清空一张表,不返回任何标示
(3)改:
$update_row = DB::table('city')->where('id', 20)->update(['name' => '日本']);
更新一条数据返回受影响的行数,1行
$update_row = DB::table('carousel')->increment('order_number');
让所有记录的order_number都自增1,返回受影响的行数,6行
$update_row = DB::table('carousel')->decrement('order_number');
让所有记录的order_number都自减1,返回受影响的行数,6行
$update_row = DB::table('carousel')->increment('order_number', 100);
让所有记录的order_number都自增100,返回受影响的行数,6行
$update_row = DB::table('carousel')->decrement('order_number', 100);
让所有记录的order_number都自减100,返回受影响的行数,6行
$update_row = DB::table('carousel')->where('id', 1)->increment('order_number', 200);
修改一条记录id为1的order_number字段自增200,返回受影响的行数,1行
$update_row = DB::table('carousel')->where('id', 1)->increment('order_number', 200, ['name' => '自增同时修改字段']);
修改一条记录id为1的order_number字段自增200,同时去修改其他字段,返回受影响的行数,1行
(4)查:
$select_rows = DB::table('city')->get();
get方法查询所有记录
$first_row = DB::table('carousel')->orderBy('id', 'asc')->first();
first方法查询排序后的第一条
$select_rows = DB::table('carousel')->where('id', '>=', 2)->get();
where方法查询符合单个条件的所有记录
$select_rows = DB::table('carousel')->whereRaw('id >= ? and order_number > ?', [1, 5])->get();
whereRaw方法查询符合多个条件的所有记录
$select_field = DB::table('carousel')->pluck('name');
pluck方法查询符合条件的每条记录的name字段
$select_field = DB::table('carousel')->lists('name');
$select_field = DB::table('carousel')->lists('name', 'id_code');
lists方法查询符合条件的每条记录的name字段(或者查询符合条件的每条记录的name字段以id_code为键名)
$select_field = DB::table('carousel')->select('id','id_code','name')->get();
select方法查询符合条件的每条记录的指定字段
DB::table('user_log')->chunk(10, function($number){
var_dump($number);
if(???) return false;
});
chunk方法根据条件每次查询固定的记录,同时内部的回调函数可以控制流程,当满足某个条件的时候可以return false
dd($select_field);
(5)聚合函数:
$count = DB::table('city')->count();
统计总的记录数
$max = DB::table('user_log')->max('id');
求最大值
$min = DB::table('user_log')->min('id');
求最小值
$avg = DB::table('user_log')->avg('id');
求平均值
$sum = DB::table('user_log')->sum('user_id');
求和
dd($sum);
4、使用Eloquent ORM实现CURD
介绍:laravel所自带的Eloquent ORM是一个优美、简洁的ActiveRecord实现,用来实现数据库操作,每个数据表都有一个与之对应的模型model,用于和数据表交互
1) 简介、模型的建立及查询数据:
路由:
Route::any('orm1', ['uses' => 'CityController@orm1']);
控制器:
namespace App\Http\Controllers;
use App\City;
class CityController extends Controller
{
public function orm1()
{
(1)all方法查询所有的记录
$city = City::all();
(2)find方法根据主键id查询单条记录
$city = City::find(1);
(3)findOrFail方法根据主键id查询单条记录,如果查询失败则报异常
$city = City::findOrFail(1);
(4)get方法查询所有记录
$city = City::get();
(5)first方法查询第一条记录
$city = City::where('id', '>', 1)->orderBy('id', 'desc')->first();
(6)chunk方法每次查询固定条数记录出来
City::chunk(1, function ($number) {
var_dump($number);
});
(7)count()方法求记录总条数
$count = City::count();
(8)max()方法求最大值
$max = City::where('id', '>', 1)->max('parent_id');;
}
}
模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class City extends Model
{
protected $table = 'city'; // 指定表名 与 模型关联起来
protected $primaryKey = 'id'; // 指定主键,默认是id可以不写
}
2) 新增数据,自定义时间戳和批量赋值的使用:
路由:
Route::any('orm1', ['uses' => 'CityController@orm1']);
控制器:
namespace App\Http\Controllers;
use App\City;
class CityController extends Controller
{
public function orm1()
{
// 新增数据,保存数据
$city = new City();
$city->name = '123456';
$city->state = 'init';
$bool = $city->save();
dd($bool);
// 使用模型的create方法新增数据
$city = City::create(['name' => '南通', 'state' => 'init']);
dd($city);
// 以属性去查询数据,如果没有的话就去创建
$city = City::firstOrCreate(['name' => '南通']);
// 以属性去查询数据,如果没有的话就去创建,但是需要使用save保存下来
$city = City::firstOrNew(['name' => '南通ssss']);
$city->save();
dd($city);
}
}
模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class City extends Model
{
protected $table = 'city'; // 指定表名 与 模型关联起来
protected $primaryKey = 'id'; // 指定主键,默认是id可以不写
public $timestamps = false; // 关闭自动维护时间戳(如果改成true,那么需要手动事先添加created_at、updated_at两个字段,此时的时间是datetime格式)
protected function getDateFormat() // 此方法可以将created_at、updated_at两个字段的datetime类型改成时间戳的格式
{
return time();
}
protected function asDateTime($value) // 取出来的时间不要格式化
{
return $value;
}
}
3) 使用Eloquent ORM修改数据:
路由:
Route::any('orm1', ['uses' => 'CityController@orm1']);
控制器:
namespace App\Http\Controllers;
use App\City;
class CityController extends Controller
{
public function orm1()
{
//通过模型更新数据
$city = City::find(9);
$city->name = '苏州';
$bool = $city->save();
var_dump($bool);
//批量更新数据,返回更新后的条数
$update_rows = City::where('id', '>', 2)->update(['parent_id' => 10]);
var_dump($update_rows);
}
}
模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class City extends Model
{
protected $table = 'city'; // 指定表名 与 模型关联起来
protected $primaryKey = 'id'; // 指定主键,默认是id可以不写
public $timestamps = false; // 关闭自动维护时间戳(如果改成true,那么需要手动事先添加created_at、updated_at两个字段,此时的时间是datetime格式)
protected function getDateFormat() // 此方法可以将created_at、updated_at两个字段的datetime类型改成时间戳的格式
{
return time();
}
protected function asDateTime($value) // 取出来的时间不要格式化
{
return $value;
}
}
4) 使用Eloquent ORM删除数据:
路由:
Route::any('orm1', ['uses' => 'CityController@orm1']);
控制器:
namespace App\Http\Controllers;
use App\City;
class CityController extends Controller
{
public function orm1()
{
//通过模型删除
$city = City::find(9);
$bool = $city->delete();
var_dump($bool);
//通过主键删除,返回删除的条数
$delete_rows = City::destroy(8);
$delete_rows = City::destroy(6, 7);
$delete_rows = City::destroy([6, 7]);
var_dump($delete_rows);
//通过指定条件删除,返回删除的条数
$delete_rows = City::where('id', '>', 2)->delete();
var_dump($delete_rows);
}
}
模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class City extends Model
{
protected $table = 'city'; // 指定表名 与 模型关联起来
protected $primaryKey = 'id'; // 指定主键,默认是id可以不写
public $timestamps = false; // 关闭自动维护时间戳(如果改成true,那么需要手动事先添加created_at、updated_at两个字段,此时的时间是datetime格式)
protected function getDateFormat() // 此方法可以将created_at、updated_at两个字段的datetime类型改成时间戳的格式
{
return time();
}
protected function asDateTime($value) // 取出来的时间不要格式化
{
return $value;
}
}
5) 多数据库连接:
.env文件配置如下:
DB_HOST=127.0.0.1
DB_DATABASE=dearedu
DB_USERNAME=root
DB_PASSWORD=root
DB_HOST_DEAREDU_MY=127.0.0.1
DB_PORT_DEAREDU_MY=3306
DB_DATABASE_DEAREDU_MY=dearedu_my
DB_USERNAME_DEAREDU_MY=root
DB_PASSWORD_DEAREDU_MY=root
config\database.php文件配置如下:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'forge'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', 'forge'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
'mysql_dearedu_my' => [
'driver' => 'mysql',
'host' => env('DB_HOST_DEAREDU_MY', 'forge'),
'port' => env('DB_PORT_DEAREDU_MY', '3306'),
'database' => env('DB_DATABASE_DEAREDU_MY', 'forge'),
'username' => env('DB_USERNAME_DEAREDU_MY', 'forge'),
'password' => env('DB_PASSWORD_DEAREDU_MY', 'forge'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
app\Http\Controllers\MemberController.php文件配置如下:
namespace App\Http\Controllers;
use App\Member;
class MemberController extends Controller
{
public function index()
{
$members = Member::getMember();
}
}
app\Member.php文件配置如下:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class Member extends Model
{
public static function getMember()
{
return DB::select("select mid from cms_member");
}
}
app\Http\Controllers\IndexController.php文件配置如下:
namespace App\Http\Controllers;
use App\Unit;
class IndexController extends Controller
{
public function index()
{
$units = Unit::getUnit();
}
}
app\Unit.php文件配置如下:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class Unit extends Model
{
public static function getUnit()
{
return DB::connection('mysql_dearedu_my')->select("select id from my_config_unit limit 5");
}
}
八、Blade模板引擎
1、Blade模板引擎简介及模板继承的使用
简介:
1) Blade是laravel提供的一个既简单又强大的模板引擎
2) 和其他流行的PHP模板引擎不一样,Blade并不限制你在视图中使用原生PHP代码
3) 所有Blade视图页面都将被编译成原生PHP代码并缓存起来,除非你的模板文件被修改了,否则不会重新编译
模板继承:
1) section
2) yield
3) extends
4) parent
为什么使用模板继承
第一步:
添加一个路由
Route::any('about', ['uses' => 'AboutController@about']);
第二步:
添加一个控制器 AboutController.php
namespace App\Http\Controllers;
use App\City;
class AboutController extends Controller {
public function about() {
return view('about.about');
}
}
第三步:
添加一个视图文件 views/about/about.blade.php
这个页面是关于我们
@extends('layout')
@section('header')
@parent
又添加了内容
@stop
@section('content')
重写了中间部分
@stop
@section('footer')
重写了下底部信息
@stop
第四步:
添加一个全局共用模块 views/glob.blade.php
@section('header')
头部
@show
@yield('content', '主要区域')
2、基础语法及include的使用
@include('about.child', ['name' => '小明'])
@include('common.header') 加载公用的静态模板,views -> common -> header.blade.php
3、流程控制
1) if
2) unless
3) for
4) foreach
4、模板中的URL
1) url()
2) action()
3) route()
laravel之表单篇
一、Controller介绍
-
Controller之Request
laravel中的请求使用的是symfony/http-foundation组件 请求里面存放了$_GET $_POST $_COOKIE $_FILES $_SERVER等数据 eg1: use Illuminate\Http\Request; class ExampleController extends Controller { public function request1(Request $request) { #1: 取值 echo $request->input('name'); //获取参数 echo $request->input('sex', '未获取到数据,这是默认值'); //如果没有这个参数,将采用默认值 echo $request->has('sex') ? $request->input('sex') : '无参数' ; //判断是否存在这个参数,存在输出,否则默认值 $request->all(); //获取所有的参数 #2: 判断请求类型 var_dump($request->method()); //请求类型 var_dump($request->isMethod('GET')); //是否是get请求 var_dump($request->ajax()); //是否是ajax请求 var_dump($request->is('student/*')); //判断访问路劲是否是这个 var_dump($request->url()); //获取当前的url } } eg2: namespace App\Http\Controllers; use Illuminate\Http\Request; class UploadController extends Controller { public function save(Request $request) { echo $request->input('file'); } } Route::any('upload/save', 'UploadController@save'); eg3: namespace App\Http\Controllers; use Illuminate\Http\Request; class RbacController extends BaseController { public function roleset(Request $request) { echo json_encode($request->input('rolename')); } } $.ajax({ type: 'POST', url: '/roleset', data: { rolename : $('#rolename').val()}, dataType: 'json', headers: { 'X-CSRF-TOKEN': "{{ csrf_token() }}" }, success: function(data){ } }); Route::any('/roleset', 'RbacController@roleset');
-
Controller之Session
laravel中session三种使用方式: a: HTTP request类的session()方法 b: session()辅助函数 c: Session facade
Controller之Response
Controller之Middleware
零碎
lumen框架的时区问题:https://www.widlabs.com/article/lumen-set-timezone
laravel框架的时区问题:config/app.php 找到参数'timezone'='UTC',设置'timezone'='Asia/Shanghai'
多个试图共享一个BaseController的资源:view()->share('uname', $memberInfo['data'][0]->xueke);
加载第三方类库
1. 比如我要加载alipay
2. 在app目录下新建libs目录存放第三方的类库
3. 新建aplipay目录,里面有如下我修整的目录:
/alipay_submit.class.php
/alipay_notify.class.php
/...
4. 找到根目录下的composer.json文件
"autoload": {
"classmap": [
"database",
"app/libs/alipay" //加我**************
],
},
5. 运行终端,cd到项目路径,执行 composer dumpautoload
6. 然后就能在项目中愉快的使用
use AlipaySubmit;
use AlipayNotify;
解析业务层输出来的html标签
{!! $data['knowledges'] !!}
Laravel框架开发调试工具Laravel Debugbar使用
引入package包: composer require barryvdh/laravel-debugbar
在config/app.php的providers中添加一行注册: Barryvdh\Debugbar\ServiceProvider::class,
laravel5.1使用redis
.env
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=123456
REDIS_PORT=6378
config/database.php
redis -> host
-> password
-> port
控制器中需要指定:
use Illuminate\Support\Facades\Redis;
Redis::set('key', 1212);
laravel5.1使用页面返回
@if(session('errors'))
{{ session('errors') }}
@endif
return back()->with('errors', '请勾选需要购买的课程');
安装验证码
http://laravelacademy.org/post/3910.html
试图页面中显示验证码
src="/checkCode" onclick="this.src='/checkCode/'+new Date().getTime()"
控制器中加上方法,让图片上的src可以访问到
public function checkCode()
{
return captcha();
}
页面提交去验证
$rules = ['captcha' => 'required|captcha'];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) result(400, '验证码错误');