laravel 笔记
LARAVEL NOTES
{{toc}}
laravel简介
- laravel对php版本要求
- laravel5* 要求php>5.59
- laravel 配置nginx后无法访问
- 给laravel下所有文件给读写权限
- laravel配置文件
server {
listen 80;
server_name local.laravel.com;
set $root_path '/www/laravel/public/';
root $root_path;
index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index /index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
root $root_path;
}
location ~ /\.ht {
deny all;
}
}
- 文件目录
- app:包含了站点的controllers(控制器),models(模型),views(视图)和assets(资源)。这些是网站运行的主要代码,你会将你大部分的时间花在这些上面。
- bootstrap:用来存放系统启动时需要的文件,这些文件会被如index.php这样的文件调用。
- public:这个文件夹是唯一外界可以看到的,是必须指向你web服务器的目录。它含有laravel框架核心的引导文件index.php,这个目录也可用来存放任何可以公开的静态资源,
如css,Javascript,images等。 - vendor:用来存放所有的第三方代码,在一个典型的Laravel应用程序,这包括Laravel源代码及其相关,并含有额外的预包装功能的插件。
- resource:包含视图和原始的资源文件
- storage: 编译后的模板文件 以及基于文件的 session 日志等
配置文件
数据库配置文件在.env中,通过config/database.php来调用,如下,通过env方法来获取变量名,如果变量没有值则赋值 localhost之类,.env文件可以不放在版本控制中
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
数据库版本控制 migration 同步数据库
数据库 表、字段各种操作均可在控制器中执行,见 http://laravelacademy.org/post/130.html
只要访问该方法,则会直接影响数据库结构
- 如果database/migrations中已有文件,我们可以执行以下命令来创建表和删除表,新增字段
$ php artisan migrate
- 撤销上一步动作(应用场景,创建表后发现字段错了,执行此命令进行撤销动作)
$ php artisan migrate:rollback 这个命令 和 refresh命令会清掉所有的数据
- 通过命令手动创建,然后在database/migrations中就可以看到这个文件了 :
$ php artisan make:migration create_articles_table --create=articals
- 产品上线后如果想要添加一个字段可以这样操作:
$ php artisan make:migration add_intro_column_to_articles --table=articals
- 删除某个字段 $table->dropColumn('intro')
php artisan make:model Artical
laravel修改字段可通过控制器来执行, 用的是Schema门面
Schema::table('users', function ($table) {
$table->string('name');
});
通过命令行CURD
php artisan tinker
>>> $artical = new App\Artical;
=> App\Artical {#674}
>>> $article->title='my first title';
=> "my first title"
>>> $article->content='content';
=> "content"
>>> $article->published_at=Carbon\Carbon::now();
=> Carbon\Carbon {#679
+"date": "2016-10-11 11:37:54.000000",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $artical;
=> App\Artical {#674}
>>> $article;
=> {#677
+"title": "my first title",
+"content": "content",
+"published_at": Carbon\Carbon {#679
+"date": "2016-10-11 11:37:54.000000",
+"timezone_type": 3,
+"timezone": "UTC",
},
}
>>> $a->save();
=> true
>>> $a->toArray();
=> [
"title" => "my first title",
"content" => "content",
"published_at" => Carbon\Carbon {#671
+"date": "2016-10-11 12:01:35.000000",
+"timezone_type": 3,
+"timezone": "UTC",
},
"updated_at" => "2016-10-11 12:01:46",
"created_at" => "2016-10-11 12:01:46",
"id" => 1,
]
查找
>>> $first=App\Article::find(1);
=> App\Article {#685
id: 1,
title: "my first title",
content: "content",
published_at: "2016-10-11 12:01:35",
created_at: "2016-10-11 12:01:46",
updated_at: "2016-10-11 12:01:46",
}
更新
>>> $first->title='update';
=> "update"
>>> $first->save();
=> true
条件查找 获得数据集
>>> $second=App\Article::where('content','=','content')->get(); 或者 >>> $second=App\Article::where('content','=','content')->first();
=> Illuminate\Database\Eloquent\Collection {#692
all: [
App\Article {#693
id: 1,
title: "update",
content: "content",
published_at: "2016-10-11 20:07:12",
created_at: "2016-10-11 12:01:46",
updated_at: "2016-10-11 12:07:12",
},
],
}
总结创建表的过程:
- 表文件命令文件创建:php artisan make:migration create_articles_table --create=articles
- 在该文件中添加字段并执行 php artisan migrate 将表结构生成数据库真正的表
- 创建模型文件 php artisan make:model Article,该文件会自动对应数据库 articles这个表
- 通过 php artisan tinker 可进行数据操作
路由
Route::get('/', function () {
return view('welcome');
});
// 基础路由
Route::get('basic1', function () {
return 'hello world basic1';
});
// 基础路由
Route::post('basic2', function () {
return 'hello world basic2';
});
// 多请求路由 响应指定请求类型
Route::match(['get','post' ], 'multy1', function () {
return 'multy1';
});
//多请求路由 响应所有的请求类型
Route::any('multy1', function () {
return 'multy2';
});
//路由参数
Route::get('user/{id}', function ($id) {
return 'userid-'.$id;
});
//路由参数 非必须
Route::get('user/{name?}', function ($name=null) {
return 'username-'.$name;
});
//参数 正则
Route::get( 'user1/{name?}', function ($name=null) {
return 'username-'.$name;
})->where('name','[A-Za-z]+');
//多参数 正则
Route::get( 'user2/{id}/{name?}', function ( $id, $name=null) {
return 'userid-'.$id . 'username-'.$name;
})->where( [ 'id'=> '[0-9]+' , 'name'=>'[A-Za-z]+'] );
//路由别名 别名的作用并非是通过center就可以直接访问,而是利用控制器或view根据别名生成url
Route::get('user3',['as'=>'center',function () {
return route('center');
}]);
//群组路由 前缀
Route::group(
['prefix'=>'member'],function(){
Route::get('basic1', function () {
return 'hello world basic1';
});
Route::post('basic2', function () {
return 'hello world basic2';
});
}
);
控制器
使用artisan创建控制器
php artisan make:controller TestController
控制器目录:app/Http/Controllers
控制器命名规则:MemberController
//路由关联控制器 方法一: MemberController控制器的info方法
Route::get('member/info','MemberController@info');
//路由关联控制器 方法二: 以数组的形式指定控制器和别名
Route::get('member/info1', [
'uses' =>'MemberController@info' ,
'as' => 'memberinfo1'
]);
//路由关联控制器 参数绑定 在控制器中传入id 即可
Route::get('member/info3/{id}','MemberController@info')->where('id', '[0-9]+');
Request
参考:http://www.ynpxrz.com/n802045c2025.aspx
默认使用symfony的http请求方法
public function request1(Request $request){
//1.取值 如果没有可以加一个默认值 '未知'
$request->input('name','未知');
if( $request->has('name') ){
echo $request->input('name');
}else{
echo '无该参数';
}
//2.取所有的参数
$res = $request->all();
//dd($res);
//3.判断请求类型
echo $request->method();
if( $request->isMethod('GET') ){
echo 'is get';
}else{
echo 'is not get';
}
// 4.判断 ajax请求
$request->ajax();
//5.判断路由符合特定规则
$res = $request->is('student/*');
echo $res;
//6.获取当前url
echo $request->url();
}
Response
$arr = [
'name' => 'alice',
'age' => '12'
];
//return response()->json($arr);
// 重定向 并带session flash,还可以带别的 cookie input等
return redirect('student/session2')->->with('message1', '我是快闪数据');
//重定向2
return redirect()->action('StudentController@session2')->with('message1', '我是快闪数据');
//重定向3 route 别名
return redirect()->route('student-url');
//回退
return redirect()->back();
Session
// 1. http request session()
$request->session()->put('k1','v1');
echo $request->session()->get('k1');
//2.session()
session()->put('k2','v2');
echo session()->get('k2');
//3.Session类
Session::put('k3','v3');
echo Session::get('k3','default');//如果k3不存在就default
//4.以数组形式存储
Session::put(['k4'=>'v4']);
echo Session::get('k4');
//5.把数据放数组中
Session::push('student','alice');
Session::push('student','alice1');
//dd( Session::get('student') );//arr
//6.ds sxb 删除session
$res = Session::pull('student');
$res = Session::get('student');
dd( $res );//null
//7.取出所有的值
$res = Session::all();
//8.判断 session是某个key否存在
Session::has('k1');
//9.删除某个key的值
Session::forget('k1');
//10. 删除所有
Session::flush();
//11.暂存
Session::flash('flash-k1','flash-v1');
echo Session::get('flash-k1');//只能第一次取的时候有
Middleware
- 应用场景:
有几个活动页面,在活动日来临前 访问的话 跳宣传页
route:
//宣传页
Route::get('student/activity0','StudentController@activity0');
//活动页
Route::group(['middleware'=>['activity'] ],function(){
Route::get('student/activity1','StudentController@activity1');
Route::get('student/activity2','StudentController@activity2');
});
controller
public function activity0(){
return '活动即将开始,敬请期待';
}
public function activity1(){
return '活动1进行中,谢谢您的参与';
}
public function activity2(){
return '活动2进行中,谢谢您的参与';
}
middleware
app/Http/Middleware/Activity.php
namespace App\Http\Middleware;
use Closure;
//use Illuminate\Support\Facades\Auth;
class Activity
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
echo '我是前置';
if( time() < strtotime('2016-10-06') ){
return redirect( 'student/activity0' );
}
//正常执行 把请求扔给$next
return $next($request);
echo '我是后置';
}
}
注册middleware
app/Http/Kernel.php
protected $routeMiddleware = [
'activity' => \App\Http\Middleware\Activity::class,
];
视图
//对应view目录 resources/view/member/info.blade.php
return view('member/info',[
'name'=>'alice',
'age' => 18
]);
在info.blade.php中 通过 {{ $name }} {{ $age }} 来获取参数
模型
在app下新建一个Member.php 模型
namespace App;
use Illuminate\Database\Eloquent\Model;
class Member extends Model {
public static function getMember(){
return 'member name is alice';
}
}
在控制器中调用Member模型:
return Member::getMember();
数据库操作之 - DB façade
使用原生的sql语句操作数据库
//数据库 插入 retun bool
$bool = DB::insert('insert into student(name,age) VALUES (?,?)',['alice',18]);
var_dump($bool);
//数据库 更新 retun num 行数
$num = DB::update('update student set age = ? where name = ?',[20,'alice']);
var_dump($num);
//数据库 查询 return arr
$students = DB::select( 'select * from student where id > ?', [1] );
var_dump($students);
//数据库 删除 return num 行数
$numDelete = DB::delete('delete from student where id>?',[1]);
var_dump($numDelete);
数据库操作之 - 查询构造器
使用查询构造器操作数据库
新增数据
//新增 return bool
$bool = DB::table('student')->insert(
['name'=>'imooc','age'=>18]
);
var_dump($bool);
//新增 一条数据 并得到它的自增id return id
$id = DB::table('student')->insertGetId(
['name'=>'imooc1','age'=>18]
);
var_dump($bool);
//新增多条数据 return bool
$bool = DB::table('student')->insert([
['name'=>'imooc2','age'=>18],
['name'=>'imooc3','age'=>18],
['name'=>'imooc4','age'=>18],
['name'=>'imooc5','age'=>18],
['name'=>'imooc6','age'=>18],
]);
var_dump($bool);
更新数据
//更新指定内容
$num = DB::table('student')->where('id',8)->update(['age'=>30]);
//指定字段自增 属于批量操作 自减 同理 decrement
$num = DB::table('student')->increment('age');
$num = DB::table('student')->where('id',8)->increment('age',3);
//自增的时候修改其他字段
$num = DB::table('student')->where('id',8)->increment('age',3,['name'=>'joe']);
删除数据
$num = DB::table('student')->where('id',13)->delete();
//可以用表达式 where('id', '>=' , 13)
//清空表 不返回任何东西
DB::table('student')->truncate();
查询数据
get()
//get() 获取表的所有数据
$students = DB::table('student')->get();
first()
$students = DB::table('student')->orderBy('id','asc')->first();
where()
$students = DB::table('student')->where('id','>=',2)->get();
//where()多个条件
$students = DB::table('student')->whereRaw('id>=? and age>?',[1,24])->get();
pluck()
//pluck()返回结果集中指定的字段
$names = DB::table('student')->pluck('name');
lists()
//lists() 也可以实现pluck的效果,同时 lists可以指定某个字段为key
$names = DB::table('student')->lists('name','id');
select()
//select 指定字段查询
$names = DB::table('student')->select('id', 'name','age')->get();
chunk()
//chunk 分段获取数据 每次查2条
echo '<pre>';
DB::table('student')->chunk(2,function($students){
var_dump($students);
return false;//指定条件下 停止查询
});
echo '</pre>';
dd($names);
聚合函数
$num = DB::table('student')->count();
$v = DB::table('student')->max('age');
$v1 = DB::table('student')->min('age');
$avg = DB::table('student')->avg('age'); //平均数
$sumage = DB::table('student')->sum('age');
数据库操作之 - Eloquent ORM
创建Studeng模型
app/Student.php
use Illuminate\Database\Eloquent\Model;
class Student extends Model {
//指定表名
protected $table = 'student';
//指定id
protected $primaryKey = 'id';
//指定允许批量赋值的字段 多个字段赋值
protected $fillable = ['name','age'];
//指定不允许批量赋值的字段
//protected $gaurded = [];
//自动维护时间戳
public $timestamps = true;
//设置时间戳为nginx时间
protected function getDateFormat(){
return time();
}
//控制器里的 $student = Student::find(15);echo $student->created_at;返回时间戳 而不是格式化后的时间
protected function asDateTime($val){
return $val;
}
}
使用orm查询
//all
$students = Student::all();
//find
$student = Student::find(8); //atrributes里查看
//findOrFail
$student = Student::findOrFail(18);//没找到就报错
//使用查询构造器 查询
//get
$students = Student::get();
//first
$students = Student::where('id','>=', 8)->orderBy('age','asc')->first();
//查询数据库判断结果是否为空
$users = DB::table('users')->where('id',$id)->get();
Eloquent已经给我们封装几个判断方法如下
if ($users->first()) {
//
}
if (!$users->isEmpty()) {
//
}
if ($users->count()) {
//
}
//chunk 分批
Student::chunk(2,function($students){
var_dump($students);
});
// 查询构造器的聚合函数
$num = Student::count();
$max = Student::where('id','>=', 8)->max('age');
使用模型 创建数据
创建数据有几个方法:
- 实例化创建
//实例化
$student = new Student();
$student->name = 'melody1';
$student->age = 23;
//保存数据到数据库 并自动维护 created_at 和 updated_at字段 ,如果不想维护 需要在 模型中 关闭 $timestamps = false
$student->save();
$student = Student::find(15);
echo $student->created_at;//格式化 后的时间 2016-09-09 17:23:14
//如果不想格式化 需要在模型中 写个函数 asDateTime
- create方法创建
//使用create方法新增数据 批量 多个字段
$student = Student::create(['name'=> 'frank','age'=>32 ]);
- firstOrCreate()
//firstOrCreate() 以属性查找,如果没有则新增
$student = Student::firstOrCreate(['name'=> 'frank']);
- firstOrNew()
//firstOrNew 以属性查找,如果没有则实例化一个 可以通过 save保存到数据库
$student = Student::firstOrNew(
['name'=> 'frank1']
);
$student->save();
使用模型 修改数据
- 通过模型更新
$student = Student::find('27');
$student->name = 'kitty';
$bool = $student->save();
- 通过查询语句 批量更新
$num = Student::where('id','>=',9)->update(['age'=>36]);
使用模型 删除数据
- 通过模型删除
Student::find('27')->delete();
- 通过主键删除
Student::destroy('23','28');//批量删除也可以用数组 [1,2,3]
- 指定条件删除
Student::where('id','>=',10)->delete();
Blade模板引擎
blade简介
- blade 不限制在view中使用php语法
- 所有blade视图页面都将被编译成原生php代码 并被缓存起来
blade继承
- section
- yield
- extends
- parent
新建模板文件
view/layout.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Laravel-@yield('title')</title>
<style>
</style>
</head>
<body>
<div class="container">
<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>
</div>
</body>
</html>
模板继承 与 复写 view/student/section1.blade.php
@extends('layout');
@section('title')
@parent
模板
@stop
@section('header')
@parent
header
@stop
@section('content')
@parent
content
@stop
控制器调用
$students = Student::get();
return view('student.section1',[
'name'=>'alice',
'students'=>$students
]);
blade基础语法及include
{{--模板中输出变量--}}
{{$name}}
{{-- 模板中使用php源码 --}}
<p>{{ time() }}</p>
<p>{{ date('Y-m-d H:i:s',time()) }}</p>
<p>{{ isset( $age ) ? $age : 'default age 30' }}</p>
<p>{{ $name1 or 'default name1' }}</p>
{{--原样输出--}}
<p>{{ @name }}</p>
{{--引入子势图--}}
@include('student.comment',['message'=>'错误信息'])
流程控制
if unless for foreach forelse
{{--流程控制--}}
@if( $name == 'alice1' )
I'm alice1
@elseif( $name== 'alice' )
I'm alice
@else
who am I?
@endif
{{-- unless 是 if的取反 --}}
@unless( $name=='alice1' )
<p>this is alice</p>
@endunless
{{--for--}}
@for( $i= 0; $i<10;$i++ )
{{$i}} ,
@endfor
{{--foreach--}}
@foreach( $students as $student )
{{ $student->name }}
@endforeach
{{--forelse 如果有数组则输出 如果没有则提示我是空--}}
@forelse( $students as $student)
{{ $student->name }}
@empty
我是空数组
@endforelse
blade中的url
- url()
{{--url('路由的名称')--}}
<a href="{{ url('url') }}"> url() </a>
- action()
{{--action(控制器名@方法名)--}}
<a href="{{action('StudentController@url')}}">action()</a>
- route()
{{--router('别名')--}}
<a href="{{route('student-url')}}">route()</a>
分页
- controller
$students = Student::paginate(5);
- view
数据填充
php artisan make:seeder AdminsTableSeeder
执行完命令后将会在 database/seeds 目录下生成 AdminsTableSeeder.php 文件。接下来我们定义一个数据模型工厂,在 database/factories/ModelFactory.php 中添加如下代码:
<?php
/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| Here you may define all of your model factories. Model factories give
| you a convenient way to create models for testing and seeding your
| database. Just tell the factory how a default model should look.
|
*/
$factory->define(App\User::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->name,
'email' => $faker->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
];
});
$factory->define(App\Models\Admin::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->name,
'email' => $faker->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
];
});
模型工厂定义完成后,在 AdminsTableSeeder.php 中填充数据:
<?php
use Illuminate\Database\Seeder;
class AdminsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory('App\Models\Admin',3)->create([
'password' => bcrypt('123456')
]);
}
}
填充数据弄好后,在 DatabaseSeeder.php 中加入 AdminsTableSeeder 类
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// $this->call(UsersTableSeeder::class);
$this->call(AdminsTableSeeder::class);
}
}
最后执行迁移命令:
php artisan migrate --seed