zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    如何删除或更改已经释放的TR
    [问题解决]调用BAPI_ACC_DOCUMENT_POST时报错“被合并的公司 XXXX 和 XXXX 是不同的”
    如何判断暂存采购订单(EKKO-MEMORY)
    Django之HttpRequest和HttpReponse
    Django之模板继承
    Django之模板语法
    python库之selectors
    python库之threading
    JDBC学习笔记(9)——DBUtils的使用
    XML学习笔记(1)--XML概述
  • 原文地址:https://www.cnblogs.com/webskill/p/7462560.html
Copyright © 2011-2022 走看看