• laravel基础知识


    composer dump 

    1、Csrft 

    指定路由不用通过CSRFT验证,文件路径

    App/Http/Middleware/VerifyCsrftToken.php

    2、4种基础路由的定义

    Route::请求方式('uri', 匿名函数);

    Route::请求方式('uri','控制器名称@操作方法');

    #从服务器取出资源(一项或多项) select

    Route::get($uri, $callback);

    #在服务器新建一个资源insert

    Route::post($uri, $callback);

    #在服务器更新资源update

    Route::put/patch($uri, $callback);

    #从服务器删除资源delete

    Route::delete($uri, $callback);

    4种基础路由中,只有GET请求方法不进行CSRF验证,其他请求方式则需要CSRF验证

    在routes/web.php增加路由

    // get请求 它没有csrf验证
    Route::get('/req', function () {
        return 'get请求';
    });
    
    // post请求
    Route::post('/req', function () {
        return 'post请求';
    });
    
    // put请求
    Route::put('/req', function () {
        return 'put请求';
    });
    
    // patch请求
    Route::patch('/req', function () {
        return 'patch请求';
    });
    
    // delete请求
    Route::delete('/req', function () {
        return 'delete请求';
    });

    同时多种请求的方式

    Route::match(['get','post'], '/req', function () {
        // 打印方法 dump
        dump($_SERVER);
    });

    ·支持所有请求方式

    // 支持所有请求方式 实际开放中不推荐这种方式
    Route::any('/req', function(){
        dump($_SERVER);
    });

    2.1 csrf 

    模板中的csrf验证
    {{csrf_token()}}    # 这个没标签,纯token
    @csrf               # 这个有标签 新版用这个
    {{ csrf_field() }}  # 这个有标签 旧版用这个

    3、路由参数

    # 必填
    Route::get('URL/{参数名称}','闭包函数或控制器响应方法标识');
    # 可选
    Route::get('URL/{参数名称?}','闭包函数或控制器响应方法标识');
    # 参数限制
    Route::get('URL/{参数名称}','闭包函数或控制器响应方法标识')->where(['参数名称'=>'正则']);

     例子:ID只能是数字

    Route::get('article/{id}', function($id){
        echo $id;
    })->where(['id'=>'d+']);

    路由别名

    // 路由别名
    Route::get('/user/{id}', function($id){
        return "当前用户id是:".$id;
    })->name('名字');
    # 生成路由对应的URL地址
    $url = route('路由名称');

     例子:

    // larval我一般用.来连接
    Route::get('/req', function(){
        return "当前用户";
    })->name('index.req');
    
    Route::get('/req1', function(){
        // 用路由别名获取url地址
        return route('index.req');
    });

    4、路由前缀

    # 路由前缀
    Route::group(['prefix'=>'admin'], function(){
        Route::get('users', function(){
            // 匹配 "/admin/users" URL
        });
    });
    # 普通写法
    /*Route::get('sys/log', function(){
        return 1;
    });
    
    Route::get('sys/logout', function(){
        return 2;
    });
    
    Route::get('sys/index/index', function(){
        return 3;
    });
    
    Route::get('sys/index/welcome', function(){
        return 4;
    });*/
    
    # 使用路由前缀写法
    Route::group(['prefix'=>'sys'], function(){
        Route::get('log', function(){
            // 匹配 "/sys/log" URL
            return 1;
        });
        Route::get('index', function(){
            // 匹配 "/sys/index" URL
            return 2;
        });
        Route::group(['prefix'=>'index'], function(){
            Route::get('index', function(){
                // 匹配 "/sys/index/index" URL
                return 3;
            });
            Route::get('welcome', function(){
                // 匹配 "/sys/index/welcome" URL
                return 4;
            });
        });
    });

    利用PHP 查看定义好的路由

    php artisan route:list

    5、 控制器文件命名和创建

    注意:使用大驼峰命名,同时注意命名空间和基类控制器的引入

    # 一般控制器
    php artisan make:controller 控制器名Controller
    # 资源控制器
    php artisan make:controller 控制器名Controller -r [--resource]

    例子:创建登陆控制器

    # 一般控制器
    php artisan make:controller LoginController
    # 资源控制器
    php artisan make:controller LoginController -r
    # 包含目录的
    php artisan make:controller Admin/LoginController

    6、定义路由访问控制器中的方法

    Route::请求方法(RUI,'[命名空间]控制器类名@方法名');

    例子:

    // 路由控制器
    // 前台登陆 如果类和在我们Controller根目录下,就不用加命名空间
    Route::get('login', 'LoginController@index')->name('login');
    
    // 在Controllers下面如果有目录中的控制器,则定义路由时一定要加命名空间
    //Route::get('admin/article/{id}', 'AdminArticleController@index')->name('admin.index');
    
    // 分组简化命名空间
    Route::group(['namespace'=>'Admin'], function(){
        Route::get('admin/article/{id}', 'ArticleController@index')->name('admin.index');
    });

    7、请求

    Input类获取数据,通过接收用户输入的类:IlluminateSupportFacadesInput来进行获取数据

    Input::get('参数的名字','如果参数没有被传递,使用该默认值');
    Input::all();// 获取所有的用户输入
    Input::only([]); // 获取指定几个用户的输入
    Input::except([]); // 获取指定几个用户的输入一位的所有参数 黑名单
    Input::has('名称'); // 判断某个输入的参数是否存在
    上述方法可获取get中的信息,也可获取Post中的信息

     例子:

    // GET来获取请求的数据
    // 参数1 请求名称 , 参数2 默认值
    $username = Input::get('username', '张三');
    $password = Input::get('password', '123');
    
    // 获取全部
    dump(Input::all());
    
    // 获取指定的字段 白名单
    dump(Input::only(['username', 'age']));
    
    // 排除掉不要的字段 黑名单
    dump(Input::except(['username']));
    
    // 判断一个字段是否存在
    dump(Input::has('sex'));

    Request获取数据

    // 登陆处理2 依赖注入方式来获取
        public function login2(Request $request)
        {
            // 获取指定字段
            $username = $request->get('username', 'null');
            $password = $request->get('password', 'null');
    
            // 获取全部
            dump($request->all());
    
            // 指定获取的字段 白名单
            dump($request->only(['username', 'password']));
    
            // 排除掉不要的字段 黑名单
            dump($request->except(['username']));
    
            // 判断一个字段是否存在
            dump($request->has('sex'));
    
            // 判断请求的类型 get post put delete http请求类型
            dump($request->isMethod('get'));
    
            // $request类还可以获取cookie和文件上传
        }
    // 用到它,我们就一定会用到$request中的isMethod方法
    Route::match(['get','post'], 'login2', 'LoginController@login2');

    8、辅助函数获取Request

    // 打印出所有request可用方法
    dump(get_class_methods(request()));

    9、设置cookie

    laravel框架为了安全,它的cookie是加密的

    # 设置cookie
    return response('')->cookie('id', '11','10','/');
    # cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly);
    # 读取cookie
    echo request()->cookie('id');

    10、重定向

    # 路由别名
    return redirect()->route('路由别名',['id'=>1]);
    return redirect(route('getck'));

    11、返回json数据

    // 参数1 数组
    // 参数2 返回的http状态码
    return
    response()->json([ 'name' => 'xiaohong', 'age' => 22, ],201);

    12、分配数据到模板

    view('模板文件名称', 关联数组);
    view('模板文件名称', compact('变量名1', '变量名2'));
    view('模板文件名称')->with(关联数组);

    例子:

    // 一定要写模板的名称 /resources/views/index.blade.php
    //return view('index');
    // 视图分模块 官方不推荐
    //return view('html/index');
    // 视图分模块 推荐这种
    return view('html.index');
    
    $data = ['id'=>1, 'name'=>'哈哈'];
    # 推荐compact来解决
    return view('html.index', compact('data'));
    # with来传
    return view('html.index')->with(['data'=>$data]);
    
    // 视图分模块 推荐这种 
    return view('html.index', ['data'=>$data]); 
    
    <p>{{$data['id']}}</p> <p>{{$data['name']}}</p>

    12、三元运算符

    {{$name or 'Default'}} 等价于 <?php echo isset($name)?$name:'default'?>

    例子

    {{ $data['age'] or 'Default' }}
    {{ isset($data['age']) ? $data['age'] : 'Default' }}

    13、未转义输出

    如果变量信息里边如果有Html标记信息,在输出的时候html标记被转化为符号实体了,而没有被浏览器解析掉,如果希望看到被浏览器解析后的内容,就需要设置两个感叹号

    例如:

    $title = "<a href='http://www.baidu.com'>百度</a>";
    
    {!!$变量!!}

    14、原始形态输出(原样输出)

    由于很多JavaScript框架都是用花括号来表明所提供的表达式,所以你可以使用@符号来告知Blade渲染引擎你需要保留这个表达式原始形态

    @{{$变量名}}

    15、使用函数

    可以在blade模板中直接使用php函数

    {{php 函数名()}}

    16、if语句

    return view('html.index')->with(['data'=>$data]);
            
            @if (count($records) === 1)
                我有一条记录!
            @elseif (count($records) > 1)
                我有多条记录
            @else
                我没有任何记录!
            @endif

    17、循环

    @foreach ($users as $user)
        <p>此用户为{{$user->id}}</p>
        # 如果传过来的就是数组那么我们就用
         <p>{{$user['id']}}</p>
    @endforeach
    ------------------------
    @forelse ($users as $user)
        <li>{{$user->name}}</li>
        # 如果传过来的就是数组那么我们就用
        <p>{{ $user['id'] }}</p>
    @empty

    18、模板包含

    @include('public.header')
    
    # public 表示 views 下面的public目录
    
    # header 表示在views/public/header.blade.php文件

    19、模板继承

    直接上案例

    文件在views/public/main.blade.php

    <head>
        <title>@yield('title')</title>
        <script></script>
        @yield('css')
    </head>
    <body>
        <h3>头部</h3>
    
        @yield('content')
    
        <h3>底部</h3>
        @yield('js')
    </body>

    html1.blade.php

    @extends('public.main')
    
    {{--用法1--}}
    @section('title','我就是html1')
    
    {{--用法2 双标签--}}
    @section('content')
        <h3>我就是html1</h3>
    @endsection

    20、表单验证

    view

    <form action="{{ route('user.adduser') }}" method="post" class="form-horizontal">
                {{--{{csrf_token()}}--}}
                @csrf
                {{--{{ csrf_field() }}--}}
    
                <div class="form-group">
                    <label class="col-sm-2 control-label">帐号:</label>
                    <div class="col-sm-6">
                        <input type="text" name="username" class="form-control" value="{{old('username')}}">
                    </div>
                    <div class="col-sm-4">
                        我就是一个提示
                    </div>
                </div>
    
                <div class="form-group">
                    <label class="col-sm-2 control-label">密码:</label>
                    <div class="col-sm-6">
                        <input type="text" name="password" value="" class="form-control">
                    </div>
                    <div class="col-sm-4">
                        我就是一个提示
                    </div>
                </div>
    
                <div class="form-group">
                    <label class="col-sm-2 control-label">确认密码:</label>
                    <div class="col-sm-6">
                        <input type="text" name="password_confirmation" value="" class="form-control">
                    </div>
                    <div class="col-sm-4">
                        我就是一个提示
                    </div>
                </div>
    
                <div class="form-group">
                    <label class="col-sm-2 control-label">邮箱:</label>
                    <div class="col-sm-6">
                        <input type="text" name="email" value="{{old('email')}}" class="form-control">
                    </div>
                    <div class="col-sm-4">
                        我就是一个提示
                    </div>
                </div>
        </form>
    </div>

    控制器

    // 添加用户的处理
        public function addSave(Request $request)
        {
    
            $input = $this->validate($request, [
                // 表单的字段名 => 规则名 多个规则用 | 隔开
                'username' => 'required|between:2,6',
                // 确认密码confirmed一定要写在原始密码上
                'password' => 'required|confirmed',
                'password_confirmation' => 'required',
                'email' => 'required|email',
            ],[
                // 表单字段名.规则名 => 你想输出的话
                'username.required' => '用户名不能为空',
                'username.between' => '用户名要在2-6位之间',
                'password.required' => '密码必须填写',
                'password.confirmed' => '确认密码不一致',
                'password_confirmation.required' => '确认密码必须不能为空',
                'email.required' => '邮箱不能为空',
                'email.email' => '邮箱格式不正确',
            ]);
    
            dump($input);
        }

    控制器第二种方案

    class上面加

    use Validator;
    // 方案2
            $validator = Validator::make($request->all(), [
                // 表单的字段名 => 规则名 多个规则用 | 隔开
                'username' => 'required|between:2,6',
                // 确认密码confirmed一定要写在原始密码上
                'password' => 'required|confirmed',
                'password_confirmation' => 'required',
                'email' => 'required|email',
            ],[
                // 表单字段名.规则名 => 你想输出的话
                'username.required' => '用户名不能为空',
                'username.between' => '用户名要在2-6位之间',
                'password.required' => '密码必须填写',
                'password.confirmed' => '确认密码不一致',
                'password_confirmation.required' => '确认密码必须不能为空',
                'email.required' => '邮箱不能为空',
                'email.email' => '邮箱格式不正确',
            ]);
    
            # 打印出对象的所有方法
    //        dump(get_class_methods($validator));
    
            // 如果有错返回true
            if ($validator->fails()) {
                return redirect()->back()->withErrors($validator);
            }

    第三种方式

    cmd中执行

    php artisan make:request UserRequest

    /http/Requests/UserRequest.php代码

    public function rules()
        {
            return [
                // 表单的字段名 => 规则名 多个规则用 | 隔开
                'username' => 'required|between:2,6',
                // 确认密码confirmed一定要写在原始密码上
                'password' => 'required|confirmed',
                'password_confirmation' => 'required',
                'email' => 'required|email',
            ];
        }
    
        public function messages()
        {
            return [
                // 表单字段名.规则名 => 你想输出的话
                'username.required' => '用户名不能为空',
                'username.between' => '用户名要在2-6位之间',
                'password.required' => '密码必须填写',
                'password.confirmed' => '确认密码不一致',
                'password_confirmation.required' => '确认密码必须不能为空',
                'email.required' => '邮箱不能为空',
                'email.email' => '邮箱格式不正确',
            ];
        }

    控制器代码

    // 引入自己的Request类
    use AppHttpRequestsUserRequest;
    
    class UserController extends Controller
    {
        // 添加用户的处理
        public function addSave(UserRequest $request)
        {
             dump($request);
        }

    21、切换默认语言为中文

      1、下载中文语言包 https://github.com/caouecs/Laravel-lang
    
      2、压缩包中src文件夹中找出cn的语言
    
      3、文件拷贝到项目,路径为resourceslang
    
      4、修改配置文件config/app.php 'localt' => 'en' 改为 cn

    22、 配置连接数据库信息

    在laravel中修改连接数据库的文件有两处

    修改 .env文件
    
    修改 config/database.php文件

    laravel5.4之后对我们数据库的编码进行了默认改变,默认使用utf8mb4 -- UTF-8 Unicode, 排序规则 utf8mb4_unicode_ci

    方案一【推荐】 修改.env文件来连接数据库

    通过配置后,发现如果我们的数据表有前缀,在.env中不能去设置。

    给.env文件增加配置表前缀
    
    在configdatabase.php文件中
    'mysql'数组里增加
        // 给.env文件中添加表前缀
        'prefix' => env('DB_PREFIX', ''),
    
    在.env文件中增加  la_可修改其他的
    DB_PREFIX=la_    

    23、DB类执行原生SQL语句

    要先引入类 use DB;
    
    // 添加操作
    $ret = DB::insert('insert into test_member (name, age, email) values (:name, :age, :email)', [':name'=>'张三', ‘:age’=>20, ':email'=>'admin@admin.com']);
    
    //  修改操作
    $ret = DB::update('update test_member set age=:age where id=:id', [':age'=>12, ':id'=>1]);
    
    // 查询select
    # 查询单条
    $ret = DB:: selectOne('select * from web64_user where id=:id', ['id'=>$id]);
    
    # 查询多条
    $ret = DB::select("select * from web64_user");
    
    // 删除操作
    $ret = DB::delete("delete from test_member where id=:id",[':id=>1']);

     例子

    /*
            // 添加
            $sql = 'insert into la_users(username, password) values (:username,:password)';
            // 返回true/false
            $ret = DB::insert($sql, [':username'=>'admin', ':password'=>'admin888']);*/
    
            // 修改
            /*$sql = "UPDATE la_users set username=:username where id=:id";
            // 返回影响的行数
            $ret = DB::update($sql, ['username'=>'张三','id'=>1]);*/
    
            // 查询
            // 查询单条
            /*$sql = "SELECT * FROM la_users WHERE id=:id";
            // 返回一个集合对象
            $ret = DB::selectOne($sql, ['id'=>1]);*/
    
            // 查询多条
            /*$sql = 'select * from la_users';
            $ret = DB::select($sql);*/
    
            // 删除
            $sql = 'delete from la_users where id=:id';
            // 返回影响的行数
            $ret = DB::delete($sql, ['id'=>1]);
    
            dump($ret);

    24、DB构建器操作数据库

    24.1 查询(get/first)

    table(表名),这里的表名,如查有前缀不用写

    # 查询多条get all

    # all不可接 where

    // 查询所有无条件
    $data = DB::table('user')->get();
    
    // 查询所有,并指定字段 推荐使用第一种方式
    $data = DB::table('user')->get(['name', 'age']);
    
    // 获取ID大于5的数据
    $ret = DB::table('member')->where('id','>=',5)->get();
    
    // when 来进行条件的搜索
    // 根据关键词来搜索
    $kw = $request->get('kw');
    /*$ret = DB::table('users')->when($kw, function(Builder $query)use($kw){
        $query->where('username', 'like', "%{$kw}%");
    })->get();*/
    $ret = DB::table('users')->where(function(Builder $query)use($kw){
        $query->where('username', 'like', "%{$kw}%");
    })->get();
    
    // 查询单条记录
    $ret = DB::table('member')->where('id', 5)->first();
    
    // 获取某个具体的值
    $ret = DB::table('member')->where('id', 5)->value('name');
    
    // 获取一列数据
    $ret = DB::table('member')->pluk('name');
    
    // 获取以id为下标name为值的一列数据 
    $ret = DB::table('member')->pluk('name','id');
    
    // 排序操作 
    $ret = DB::table('member')->orderBy('id', 'desc')->get(); 
    
    //  in查询
    $ret = DB::table('users')->whereIn('id',[2,3,5])->get();
    
    // between
    $ret = DB::table('users')->whereBetween('id', [2,3,5])->get();
    
    // like
    $ret = DB::table('users')->where('id','like','2%')->get();
    
    // 分页获取数据 
    $ret = DB::table('users')->orderBy('id', 'desc')->offset(0)->limit(2)->get();  
    
    limit:表示限制输出的条数 
    offset:从什么地方开始,起始从0开始

    24.2 添加

    insert() 可以同时添加一条或多条,返回值是布尔类型
    
    insertGetId() 只能添加一条数据,返回自增的id
    
    // 添加数据
    $ret = DB::table('member')->insert([
      'name' => '张三丰',
      'age' => 50,
      'email' => 'ee@ee.com',
    ]);
    
    // 添加数据并得到插入时的ID值
    $id = DB::table('member')->insertGetId([
      'name' => '张三丰',
      'age' => 50,
      'email' => 'ee@ee.com',
    ]);
    
    // 添加多条记录
    $ret = DB::table('member')->insert([
    [
      'name' => '张三丰',
      'age' => 50,
      'email' => 'ee@ee.com',
    ],
    [
      'name' => '张三丰',
      'age' => 50,
      'email' => 'ee@ee.com',
    ]
    ]);

    24.3 修改数据

    $ret = DB::table('member')->where('id', 2)->update([
    
      'name' => '修改一下',
    
      ‘age’ => 50
    
    ]);

    24.4 删除数据

    $ret = DB::table('member')->where('id', 2)->delete();

    25、工具

    # cmd执行
    
    composer require barryvdh/laravel-debugbar
    
    # config/app.php增加 暂不用
    
    # BarryvdhDebugbarServiceProvider::class,

    # 执行命令添加配置文件
    php artisan vendor:publish --provider="BarryvdhDebugbarServiceProvider"

    26、创建模型

    php artisan make:model [目录名/]模型文件名
    
    # 分目录的
    php artisan make:model Models/Member
    
    # 创建模板并生成迁移文件 实际工作中,就是创建模型同时就创建好迁移文件
    php artisan make:model Models/Article -m
    -m 生成迁移文件

    27、模型限制

    27.1 定义表名

    模型所对应的默认表名是模型类型的复数形式,如果表名不统一则需要指定一下。

    // 指定表名
    
    protected $table = 'member';

    27.2 指定主键名

    laravel中默认的主键ID名为id,如果你创建的表字段中主键ID的名称不为id,则需要通过$primaryKey来指定一下

    // 指定主键名称
    protected $primaryKey = 'mid';

    27.3 指定时间戳($timestamps)

    默认情况下,模型操作会认为在你的数据库表有created_at和updated_at字段。如果你不希望让模型来自动维护这两个字段,可在模型内将$timestamps属性设置未false

    // 时间戳 这里一定要注意它是用 public
    public $timestamps false

    27.4 批量赋值($fillable 与 $guarded)

    当通过create方法来保存数据的时候,你需要先在你的模型上定义$fillable或$guarded属性

    // 批量赋值
    # 白名单
    protected $fillable = ['允许添加的字段名'];
    
    #黑名单
    protected $guarded = ['拒绝添加的字段名'];

    28 DURD操作

    28.1 添加数据
    
    # 方法1
    save() #对象属性方式 返回模型对象
    
    # 方法2
    insert() #数组方式 可以添加一条或多条 返回true/false
    
    # 方法3
    create() # 数组方式 需要在模型中设置号fillable 或guarded属性 返回模型对象

    例子:

            // 添加
            // 方案1
            /*$model = new Article();
            $model->uid = 1;
            $model->title = '我就是一条记录';
            $model->cnt = '你好';
            $model->save();
            var_dump($model->id);*/
    
            // 方案2
            $data = [
                'uid' => 2,
                'title' => 'php',
                'cnt' => 'php是世界上最好的语言',
            ];
            $data2 = [
                [
                    'uid' => 2,
                    'title' => 'php',
                    'cnt' => 'php是世界上最好的语言',
                ],[
                    'uid' => 3,
                    'title' => 'php3',
                    'cnt' => 'php是世界上最好的语言3',
                ]
            ];
            // 返回布尔类型 true/false
            dump(Article::insert($data));
            dump(Article::insert($data2));
            // 推荐写法
            dump(Article::create($data));

    29 查询

    # 查询单条
    first()
    
    # 查询多条
    get()
    
    # 条件
    where()
    # 排序 orderBy() # 取指定的值 value() # 取指定的列 pluck() # 查询总记录数 count()

    30 修改数据

    # 方法一
    save() # 对象属性方式  返回的是模型对象
    
    # 方法2
    update() # 数组  返回受影响行数

    31 删除

    # 删除 一定要指定条件删除
    delete() #对象删除
    destroy($id) # 静态方法删除 默认表字段主键名为ID,如果不是则需要模型中定义一下

    例子

    // 删除 1
    $id = 1;
    $model = Article::find($id);
    dump($model->delete());*/
    
    // 删除 2
    dump(Article::destroy($id));
    软删除
    引入命名空间
    use IlluminateDatabaseEloquentSoftDeletes;
    1、在表字段中要有deleted_at字段 可以在迁移文件中直接添加一个方法 $table->softDeletes cmd 中执行 php artisan migrate:refresh --seed
    2// 在模型中引入trait use SoftDelete; // 指定删除的标识 protected $dates = [删除标识字段名deleted_at] // 只读取软删除的数据 $ret = Article::onlyTrashed()->get(); // 恢复软删除 $model = Article::withTrashed()->find(1); $model->restore();

    32、faker来进行数据填充

    32.1

    laravel从5以后,默认已安装该扩展包

    通过运行Artisan 命令make:seeder 来生成 Seeder。由框架生成的 seeders 都将被放置在 database/seeds 目录下:

    php artisan make:seeder ArticleSeeder

    代码:

    <?php
    
    use IlluminateDatabaseSeeder;
    
    // 引入文章模型
    use AppModelsArticle;
    
    class ArticleSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            // 清空数据表
            //Article::truncate();
    
            // 实例化
            $faker = FakerFactory::create();
            for($i=1;$i<10;$i++){
                $data = [
                    'uid' => $i,
                    'title' => $faker->word,
                    //'desn' => $faker->sentence,
                    'cnt' => $faker->text,
                ];
                Article::create($data);
            }
    
        }
    }

    cmd执行:

    php artisan db:seed --class=ArticleSeeder

    32.2

    // 在database/factories里创建的

    composer dumpautoload

    php artisan make:factory ArticleFactory -m Models/Article

    在修改创建的文件,代码如下:

    <?php
    
    /** @var IlluminateDatabaseEloquentFactory $factory */
    
    use AppModelsArticle;
    use FakerGenerator as Faker;
    
    $factory->define(Article::class, function (Faker $faker) {
        return [
            'uid' => rand(1,10),
            'title' => $faker->word,
            'desn' => $faker->sentence,
            'cnt' => $faker->text,
        ];
    });

    修改database/seeds/ArticleSeeder.php

    // 引入文章模型
    use AppModelsArticle;
    ...
    ...
    ...
    public function run()
        {
            // 调用数据工厂
            factory(Article::class, 20)->create();
        }

    cmd执行:

    php artisan db:seed --class=ArticleSeeder

    33、增加监听类 模型事件 参考文章:https://blog.csdn.net/qq_33229176/article/details/80425311

    php artisan make:observer ArticleObserver

    34、数据分页

    # 标准分页
    Model::paginate(每页显示的记录数)
    
    # 简单分页
    Model::simpleaPaginate(每页显示的记录数)
    
    # 模板
    {{ $model->links() }}
    # 升级版: 这个分页后带参数
    {{ $data->appends(request()->except('page'))->links() }}

    控制器

     public function index(Request $request)
        {
            // 关键词
            $title = $request->get('title');
            // 搜索条件
            $data = Article::when($title, function(Builder $query) use ($title){
                $query->where('title','like',"%{$title}%");
            })->paginate(env('PAGESIZE'));
            
            return view('article.index', compact('data'));
        }

    35、session处理

    laravel中的session默认存到文件中

    session文件的目录:storageframeworksessions

    session配置文件在config/session.php和.env也有,推荐修改.env

    操作session的方法在laravel中有两种方案,有类来操作也有利用辅助函数来操作

    35.1 session设置

    // 写入session
    // 方法1
    Session::put('键名','值');
    // 方法2 辅助函数 session('键名'=》'值'); 注:辅助函数存储session的时候一定要以数组的形式来定义

    35.2 读取操作

    // 读取session
    
    // 方式1 Session类
    dump(Session::get('键名',[默认值]));
    
    // 方式2 辅助函数
    dump(session('session名称'));
    
    // 读取全部的session
    dump(Session::all());
    dump(session()->all());

    35.3 判断某个Session是否存在

    // 方法一
    dump(Session::has('session名称'));
    
    // 方法二
    dump(session()->has('session名称'));

    35.4

    // 删除Session

    // 方法一

    Session::forget('session名称');

    if (!Session::has('session名称')) {
      echo 'name1:已被删除';
    }
    
    // 方法二
    
    session()->forget('session名称');
    if (!session()->has('session名称')) {
        echo 'name2:已被删除';
    }

    // 删除全部的session

    // 方法一
    Session::flush();
    
    // 方法二
    session()->flush();

    36 闪存

    使用这个方法保存sessoin,只能将数据保留到下个HTTP请求,然后就会被自动删除
    
    // 方法一
    Session::flash('msg', '你好世界');
    
    // 方法二
    session()->flash('msg', '你好世界');
    
    dump(session('msg'));
    
    // with来设置闪存
    return redirect()->route('session.index')->with('msg', '我是成功的');
    
    // 模板中使用 {{ session(key) }} 来读取闪存

    37 中间件

     中间件作为请求和相应之间的中间人。它是一种过滤机制类型。

    在laravel中通过中间件来进行后台用户是否登录的验证操作,防止后台用户FQ操作。

    中间件可以通过执行以下命令来创建,所有的中间件都位于app/Http/Middleware目录。

    php artisan make:middleware 中间件

    37.1 注册中间件

    在laravel有两种类型的中间件。即:【全局中间件】和【路由中间件】

    全局中间件将在应用程序的每个HTTP请求运行,而路由中间件将被分配到一个指定的路由。

    中间件可在app/Http/Kernel.php注册

    该文件包含两个属性:$middleware和$routeMiddleware。$middleware属性用于注册全局中间件,$routeMiddleware属性用于注册路由指定中间件。

    web.php 单个或者分组都可以 checkUser是中间件的别名

    Route::group(['middleware'=>['checkUser']], function(){
        Route::get('sess', 'SessController@index')->name('sess');//->middleware('checkUser');
    });

    Kernel.php

    // 全局中间件
    protected $middleware = [
            AppHttpMiddlewareTrustProxies::class,
            AppHttpMiddlewareCheckForMaintenanceMode::class,
            IlluminateFoundationHttpMiddlewareValidatePostSize::class,
            AppHttpMiddlewareTrimStrings::class,
            IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
            #AppHttpMiddlewareCheckUser::class,
        ];
    
    // 路由中间件
    protected $routeMiddleware = [
            'auth' => AppHttpMiddlewareAuthenticate::class,
            'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
            'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,
            'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class,
            'can' => IlluminateAuthMiddlewareAuthorize::class,
            'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
            'signed' => IlluminateRoutingMiddlewareValidateSignature::class,
            'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
            'verified' => IlluminateAuthMiddlewareEnsureEmailIsVerified::class,
            # 注册一个自己定义的路由中间件
            'checkUser' => AppHttpMiddlewareCheckUser::class,
        ];

    appHttpMiddlewareCheckUser.php

    # 中间件
    class CheckUser
    {
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // 在此我们编写业务代码
            echo '111';
    
            // 返回的是response对象
            return $next($request);
        }
    }

    可以在控制器增加中间件

    appHttpControllerSessController.php

    public function __construct()
    {
        return $this->middleware('checkUser')// 黑名单,过滤指定的控制器->except(['index']);
    }

    38 验证码

    我们通过 Composer 安装 Captcha 扩展包

    composer require mews/captcha

    配置

    使用Captcha服务提供者之前还需要在config/app.php中注册服务提供者:

    'providers' => [
        // ...
        MewsCaptchaCaptchaServiceProvider::class,
    ]

    同时注册下相应门面:

    'aliases' => [
        // ...
        'Captcha' => MewsCaptchaFacadesCaptcha::class,
    ]

    如果要使用自定义的配置,还可以发布配置文件到config目录:

    $ php artisan vendor:publish

    编辑新生成的captcha.php

    return [
        'default' => [
            'length' => 5,
            'width' => 120,
            'height' => 36,
            'quality' => 90,
        ],
        // ...
    ];

    点击更换验证码 

    <img id="vimg" src="{!! captcha_src('mini') !!}">
    <a id="kanbuq" href="javascript:;">看不清,换一张</a>
    
    <script>
        $('#kanbuq').click(function(){
            // 得到图片元素对象
            let vimg = $('#vimg');
            // 获取它的src属性值,并追加内容
            let src =  vimg.attr('src')+'&vt='+new Date().getTime();
            // 把内容写入src属性中
            vimg.attr('src',src);
        });
    </script>

    验证码规则的中文提示 方案一,了解

    apphttpRequestsLoginRequest.php
    public function rules()
        {
            return [
                'username' => 'required',
                'password' => 'required',
                'code' => 'required|captcha'
            ];
        }
    resourceslangcnvalidation.php
    
    约120行添加
    'captcha'              => ':attribute不正确。',
    
    约180行添加
    'code'                  => '验证码',

     方案二 推荐

    apphttpRequestsLoginRequest.php
    public function rules()
        {
            return [
                'username' => 'required',
                'password' => 'required',
                'code' => 'required|captcha'
            ];
    apphttpRequestsLoginRequest.php
    
    public function messages()
        {
            return [
                'username.required' => '用户名不能为空',
                'password.required' => '密码不能为空',
                'code.required' => '验证码不能为空',
                'code.captcha' => '验证码验证不通过',
            ];
        }

    37.2

    模板中调用

    常用方法

    # 返回
    {!! captcha_src() !!}
    
    # 返回img的html
    {!! captcha_img() !!}

    38 缓存

    缓存文件在config/cache.php
    
    config/database.php也可修改
    
    推荐在.env中 CACHE_DRIVER 修改 

    设置缓存

    use Cache; # 门面
    # 添加 如果key不存在则添加成功,如果key存在则返回false Cache::add(
    'key','value', $minutes); # 设置 不管key值是否存在,都可以设置成功 Cache::put('key', 'value', $minutes); # 设置永久缓存 Cache::forever('key', 'value');

    获取缓存数据

    $value = Cache::get('key');
    $value = Cache::get('key', 'default');
    $value = Cache::get('key', default);
    
    # 获取的同时并存储
    $value = Cache::remember('users', $minutes, function () {
      return 'key 不存的时候返回的数据';
    });

    检查缓存项是否存在

    # 检查缓存的key值是否存在,存在返回true,否则返回false

    Cache::has('key');

    删除缓存数据

    # 先获取再删除
    $value = Cache::pull('key');
    
    # 删除单个
    Cache::forget('key');
    
    # 清除所有的缓存
    Cache::flush();

    工具使用:

    文件- 设置 - 工具 - Command Line Tool Support - 右上角+号 - 选择Tool based on Symfony Console确定
    
    - 第一行名字随意、选择phar or php script、 Path to script选择laravel项目中的artisan文件,确定  这样就完成设置了
    
    打开方式: Tools(工具)- Run Command

    39  缓存设置到redis中

    第一步:安装laravel支持的redis扩展

    composer require predis/predis

    第二步:在.env文件中修改存储介质

    CACHE_DRIVER=redis
    REDIS_HOSE
    REDIS_PASSWORD
    REDIS_PORT

    第三部:开启redis启动

    40 文件上传
    
    在larave里面实现文件的上传很简单的,不用引入第三方的类库,直接通过Request对象就可以获取到上传文件资源后进行保存
    
    # 获取上传的文件 $_FILES[文件与表单名称]
    $file = $request->file('文件表单名称');
    
    # 验证文件是否存在
    $request->hasFile('文件表单名称');
    
    # 获取上传文件的后缀
    $request->file('文件表单名称')->getClientOriginalExtension();
    
    # 将文件移动到服务器指定的位置 上传方式 1
    $request->file('文件表单名称')->move(路径,文件名)

    代码:

    controller

    class FileController extends Controller
    {
        // 上传的显示
        public function index()
        {
            return view('file.index');
        }
    
        // 上传的处理
        public function up(Request $request)
        {
            // 判断文件是否有上传
            //dump($request->hasFile('pic'));
            $pic = '';
            if ($request->hasFile('pic')) {
                // 有文件上传了
                $file = $request->file('pic');
    
                // 得到文件的扩展名 clientExtension也是可以获取扩展名
                $ext = $file->getClientOriginalExtension();
    
                // 生成文件名
                // public_path laravel帮我们得到了一个public指向的路径
                $filename = time().'.'.$ext;
    
                $info = $file->move(public_path('uploads'), $filename);
    
                $pic = $info->getFilename();
    
                $html = <<<html
    <script>
        parent.window.document.querySelector('#img').src="/uploads/{$pic}";
    </script>
    html;
                return $html;
            }
            
            dump($pic);
        }
    }

    html

    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>文件上传</title>
        <style>
            body{
                margin:0px;
                padding:0px;
                font-size: 14px;
            }
            .box{
                800px;
                margin:10px auto;
    
            }
        </style>
    </head>
    <body>
    
    <div class="box">
        <form target="uppic" method="post" action="{{ route('up') }}" enctype="multipart/form-data">
            @csrf
            <p>
                <input type="file" name="pic">
            </p>
            <p>
                <input type="submit" value="文件上传">
            </p>
    
        </form>
    
        <img src="##" id="img" style="200px">
        
        <iframe src="" frameborder="0" name="uppic"></iframe>
    </div>
    </body>
    </html>

    修改配置文件,让上传支持大文件,修改php.ini文件

    upload_max_filesize
    post_max_size 

    40、 使用Auth类来进行登录验证

    配置文件:config/auth.php

    'users' => [
                'driver' => 'eloquent',
                'model' => AppModelsUser::class,
            ],

    Model:

    // 使用user模型来继承
    use IlluminateFoundationAuthUser as Authorization;
    class User extends Authorization
    {
    
    }

    controller

    // 类外面写引入Auth用户登陆验证门面
    use Auth;
    
    // 方法里写
    # 如果guard不写,则表示默认,web
    $user = auth()->guard('web')->attempt($request->only(['username', 'password'])); 
    dump($user);
    $user && dump(Auth::user());

     41、关联模型

    $this->hasOne(关联model,[关联model的外健], [本model的外健]);
    return $this->hasOne(Extuser::class, 'uid', 'id');
    
    # 关联表中的外键名 user_id, 本表中的主键ID为id
    return $this->hasOne(Extuser:;class);

    代码: user表和users_info表

    controller

    // 方法一
    #$user = User::find(1);
    // 一对一模型
    #$userinfo = $user->userinfo()->first();
    // 简写,同上
    #$userinfo = $user->userinfo;
    
    // 方法二
    // 预加载 效率更高
    $user = User::with('userinfo')->where('id',1)->first();
    
    // 调用扩展表中的信息
    dump($user->userinfo->body);
    dump($user);

    userModel

        /**
         * 用户基础表和扩展表是一对一关系 hasOne
         *
         */
        public function userinfo()
        {
            // 关联关系             关联模型           外键       主键
            return $this->hasOne(UsersInfo::class,'users_id', 'id');
            // 简写  外键必须是 表名称_id  主键名必须是id
            return $this->hasOne(UsersInfo::class);
        }        

    42、一对多关系

    models

    // 一个用户对应文章 一对多关系 hasMany
        public function articles()
        {
            //return $this->hasMany('appModelsArticles', 'user_id','id');
            return $this->hasMany(Articles::class, 'user_id','id');
        }

    controller

    $user = User::find(1);
            # $arts = $user->articles();
            // 写条件
            # $arts = $user->articles('id','>',1)->get();
            $arts = User::with(['articles'=>function($query){
                $query->where('id','>=',1);
            }])->where('id', 1)->first();
    
            // 取文章列表
            dump($arts->articles);

     多对多

    controller

    // 多对多
            $user = User::find(1);
            /*
            // 查询它的权限
            $auths = $user->auths->toArray();
            // 获取当前的路由别名
            dump($request->route()->getName());
            // 得到二维数组的指定字段
            dump(array_column($auths, 'name'));*/
    
            // 同步权限
            $user->auths()->sync([1,2]);

    userModel

    // 多对多关系,beLongsToMany
        public function auths()
        {
            //                          关联模型    中间表表名 没有前缀  本模型对应中间表中字段   关联模型对应中间表中的字段
            return $this->belongsToMany(Auth::class, 'user_auth', 'user_id','auth_id');
        }

    authModel

    <?php
    
    namespace AppModels;
    
    use IlluminateDatabaseEloquentModel;
    
    class Auth extends Model
    {
        protected $table = 'auth';
    
        public $timestamps = false;
    
        protected $guarded = [];
    }

    43、创建函数文件库

    编辑composer.json文件

    # 比如增加functions.php文件, 在autoload增加files项
    "autoload": {
        "files": ["functions.php"]
    }

    # 介绍一下
    psr-4是类的加载

     修改后执行命令

    composer dumpautoload

    44、datatables

    中文官网:http://www.datatables.club/

    45 创建资源路由器加 -r

    php artisan make:controller Admin/RoleController -r -m Models/Role
    php artisan make:controller Admin/PermissionController -r -m Models/Permission
    php artisan route:list
  • 相关阅读:
    Running as a packaged application--- -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n
    Druid 专题
    java8中的localdate和localtime用法举例
    Spring处理跨域请求
    数据库版本管理工具Flyway——基础篇
    QQ邮箱开启SMTP服务的步骤
    QQ邮箱如何设置SMTP代理收发邮件
    SMTP协议简介
    Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessException
    Android客户端与服务器交互中的token
  • 原文地址:https://www.cnblogs.com/longqin/p/11765354.html
Copyright © 2020-2023  润新知