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 AppArtical;
=> AppArtical {#674}
>>> $article->title='my first title';
=> "my first title"
>>> $article->content='content';
=> "content"
>>> $article->published_at=CarbonCarbon::now();
=> CarbonCarbon {#679
     +"date": "2016-10-11 11:37:54.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
   }


>>> $artical;
=> AppArtical {#674}
>>> $article;
=> {#677
     +"title": "my first title",
     +"content": "content",
     +"published_at": CarbonCarbon {#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" => CarbonCarbon {#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=AppArticle::find(1);
=> AppArticle {#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=AppArticle::where('content','=','content')->get(); 或者 >>> $second=AppArticle::where('content','=','content')->first();
=> IlluminateDatabaseEloquentCollection {#692
     all: [
       AppArticle {#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",
       },
     ],
   }


总结创建表的过程:

  1. 表文件命令文件创建:php artisan make:migration create_articles_table --create=articles
  2. 在该文件中添加字段并执行 php artisan migrate 将表结构生成数据库真正的表
  3. 创建模型文件 php artisan make:model Article,该文件会自动对应数据库 articles这个表
  4. 通过 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 AppHttpMiddleware;

use Closure;
//use IlluminateSupportFacadesAuth;

class Activity
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $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' => AppHttpMiddlewareActivity::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 IlluminateDatabaseEloquentModel;

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 IlluminateDatabaseEloquentModel;

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

{{ $students->render() }}

数据填充

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(AppUser::class, function (FakerGenerator $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

$factory->define(AppModelsAdmin::class, function (FakerGenerator $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

模型工厂定义完成后,在 AdminsTableSeeder.php 中填充数据:

<?php

use IlluminateDatabaseSeeder;

class AdminsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory('AppModelsAdmin',3)->create([
            'password' => bcrypt('123456')
            ]);
    }
}

填充数据弄好后,在 DatabaseSeeder.php 中加入 AdminsTableSeeder 类

<?php

use IlluminateDatabaseSeeder;

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

原文地址:https://www.cnblogs.com/webskill/p/7462560.html