分类
编程

laravel笔记

1、安装laravel前开启php扩展

php_openssl.dll
php_pdo_mysql.dll
php_mbstring.dll
php_fileinfo.dll
php_curl.dll

apache的httpd.conf配置需打开

mod_deflate.so
mod_rewrite.so

2、框架启动

php artisan serve

或者运行public目录

3、路由请求方式

Route::get($url,$callback);
Route::post($url,$callback);
Route::put($url,$callback);
Route::patch($url,$callback);
Route::delete($url,$callback);
Route::options($url,$callback);
Route::match(['get','post'],'/',function(){
      //
});
Route::any('/',function(){
      //
});

match用法举例:

1.路由  web.php
Route::match(['get','post'],'/login',function(Request $request){
    if ($request->isMethod('get')){
        echo $request->input('user')."<br />";
        return view('login');
    }elseif($request->isMethod('post')){
        echo $request->input('user')."<br />";
        echo $request->input('pwd');
    }
})->name('login');
2.视图   login.blade.php:
<html5>
    <form action="{{Route('login')}}" method="post" name="form1">
        {{csrf_field()}}
        用户名<input type="text" name="user"><br />
        密码<input type="text" name="pwd"><br />
        <input type="submit"name="bt1" value="登录">
    </form>
</html5>

如果路由出现:Call to undefined method Illuminate\Support\Facades\Request::isMethod()

需要在路由中引入request

use Illuminate\Http\Request as request;

4.控制器

通过artisan命令新建控制器,比如新建一个test控制器

php artisan make:controller TestController

新建控制器后,如果需要控制路由,那么在路由的文件中需要引入这个控制器

use App\Http\Controllers\TestController;

5.接受用户输入

接收用户输入类,laravel9中的input已经被request替代,无法使用input

use Illuminate\Http\Request;

之前接收参数静态方法,现在已被request替代

Input::get('参数名','默认值')
Input::all() 获取所有用户的输入
Input::get('') 获取单个用户的输入
Input::only([]) 获取指定几个用户的输入
Input::except([]) 获取指定几个用户的输入以外的所有的参数
Input::has('name') 判断某个输入的参数是否存在

6.数据库

控制器先引入DB门面

use Illuminate\Support\Facades\DB;

路由配置

a、对数据库的表增加数据有两个函数,insert()和insertGetId()

  • insert() 可以同时添加一条或多条数据,返回布尔类型
  • insertGetId() 只能添加一条数据,返回自增的id

控制器

返回布尔值

使用inertGetId

返回的是自增id

b、修改数据,update

  • update 修改整个记录中的某个字段
  • increment 数字字段数值递增
  • decrement 数字字段数值递减
  • DB::table(‘member’)->increment(‘votes’); 数值+1
  • DB::table(‘member’)->increment(‘votes’,5); 数值+5
  • DB::table(‘member’)->decrement(‘votes’); 数值-1
  • DB::table(‘member’)->decrement(‘votes’,5); 数值-5

案例,将id=3的name改为张三丰

c、查询数据

DB:table('member')->get();//相当于 select * form member;

返回集合对象

循环输出数据

取出id<3的数据

$data = $db ->where('id','<','3') -> get();

where的用法

  • ->where()->where()->where 并且关系语法
  • ->where()->orWhere()->orWhere 或者关系语法

取出单行数据

DB::table('member')->where('id','<','3')->first(); //返回值是一个对象

取出指定字段值

DB::table('member')->where('id','3')-value('email'); 

取多个字段的数据

DB::table('member')->select('name','email')-get(); 
DB::table('member')->select('name as user_name','email')-get(); 

排序操作

DB::table('member')->derBy('age','desc')-get(); 

分页操作

DB::table('member')->limit(3)->offset(2)-get(); 
  • limit:表示限制输出的条数
  • offset:从什么地方开始

删除数据

  • Delete:删除记录
  • Trunata:清空整个数据表

删除id=1的数据

DB::table('member')->where('id','=','1')->delete(); 

返回受影响行数

删除整个表

DB::table('member')->truncate(); 

执行sql语句

DB::table('member')->select('select * from member'); 

7.模板继承

  • 父级文件:resources/views/home/test/parents.blade.php
  • 子级文件:resources/views/home/test/5.blade.php
  • 子级文件

parents.blade.php

<h1>我是头部</h1>
@yield('mainbody')
<h1>我是底部</h1>

子页面不需要再写头部和尾部

继承语法:

子模板中语法

@extends(‘需要继承的模板文件名’)

@section(‘mainbody’)//父级文件中绑定的mainbody

中间自己需要的代码

@endsection

test5.blade.php:

显示效果

也可直接引入其他文件:@include(‘文件名’)

此写法是将其他页面的内容显示在引入的位置

引入css:直接在头部写

<link rel="stylesheet" type="text/css" href="/css/app.css">
<link rel="stylesheet" type="text/css" href="{{asset('css')}}/app.css">

8.模型操作

laravel自带的Eloquen ORM提供了一个美观、简单的与数据库打交道的ActiveRecord实现,每张数据表都对应一个该表进行交互的“Model”模型,模型允许你在表中进行数据查询,以及插入、更新、删除等操作。

AR模式三个核心(映射):

  • 每个数据表 与数据表进行交互的Model模型映射(实例化模型)
  • 记录中的字段 与模型的属性映射(给属性赋值)
  • 表中的每个记录 与一个完整的请求实例映射(具体的CURD操作)

定义位置:laravel9默认在app/Models目录下,为了方便管理,可分目录创建

比如在app/Models目录下创建Home和Admin目录

命名规则:一般采用首字母大写,如Member.php User.php

创建命令:

php artisan make:model Home/Member

定义模型注意事项:

  • <必做>定义一个$table属性,值不要说前缀的表名,如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词:protected
  • <可选>定义$primarKey属性,值是主键名称,如果需要使AR模式的find方法,则可能需要指定主键(Model::find(n)),在主键不是id的时候则需要指定主键。修饰词:protected
  • 定义$timestamps属性,值是false,如果不设置为false,则默认会操作表中的created_at 和 updated_at 字段,我们表中一般没有这个两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public
  • 定义$filleble属性,表示使用模型插入数据时,允许插入到数据库的字段信息。修饰词:protected

控制器引入模型:

use App\Models\Home\Member;

模型在控制器中的使用方法有2两种:

  • 直接使用DB门面一样的操作方式:以静态调用为主的形式,该形式下模型不需要实例化,例如:Member::get(); 与之前的DB::table(‘member’)->get();不同
  • 实例化模型,然后再去使用模型类,例如:$model=new member();$model->get();

定义路由

使用模型添加数据:

方式一:AR模式

需要先实例化模型,然后模型设置属性,最后调用save方法

$member = new Member();
$member -> name = value;
$member -> age = value;
$member -> save();

方式二:

建立简易表单,表单中有姓名、年龄、邮箱

首先在控制器中引入Request这个类

use Illuminate\Http\Request;

在方法中引入request参数

request语法:

$request->all();
$request->input('name');
$request->only(['name1','name2']);
$request->has('name');
$request->get('name');

a、添加操作代码语法:

Member::create($request->all());//返回值是一个对象

b、查询操作:

  • 获取指定主键的一条数据
$data = Member::find(4);//静态方法调用,获取主键为4的数据
$data = Member::find(4)->toArray();//结果集转换为数组
  • 获取指定条件的第一条记录
Member::where('id','>','4')->first();
  • 查询多行并且指定字段
Member::all();
Member::all([字段1,字段2]);//与get方法的区别是,all不支持其他辅助查询方法
Member::get();
Member::get([字段1,字段2]);
  • 按条件查询多个字段
Member::where('id','>',2)->get(['列1','列2']);
Member::where('id','>',2)->select('列1','列2')->get();
Member::where('id','>',2)->select(['列1','列2'])->get();

c、修改数据

ORM模型方式,需要先find方法获取对应的记录,返回一个模型对象
然后对该模型对象设置需要更新的数据
最后调用save保存
$user =User::find($id);
$user->title = $_POST['title'];
$user->content=$_POST['content'];
return $user->save()?'OK':'fail';//save()返回布尔值
AR模式更新数据
Member::where('id','>','4')->update(['age']=>'10');
$model = new Member();
$model->where('id','>','4')->update(['age']=>'10');
返回受影响记录行数

d、删除操作

$user = User::find($id);
return $user->delete()?'OK':'fail';

9.CSRF保护

中文文档:https://learnku.com/docs/laravel/9.x/csrf/12211

<form method="POST" action="/profile">
    @csrf

    <!-- 等同于... -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>

CSRF默认开启,如果不添加,在提交数据会显示419错误

从CSRF验证中排除例外路由:/app/Http/Middleware/VerifyCsrfToken.php

10.自动验证

  • 验证规则
  • 输出错误信息
@if ($errors->any())
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
  • 回填表单
当 Laravel 由于验证错误而生成重定向响应时,框架将自动 将所有请求的输入闪存到 session 中。这样做是为了方便你在下一个请求期间访问输入,并重新填充用户尝试提交的表单。
要从先前的请求中检索闪存的输入,请在 Illuminate\Http\Request 的实例上调用 old 方法。 old 方法将从 session 中提取先前闪存的输入数据:
$title = $request->old('title');
Laravel 还提供了一个全局性的 old。如果要在 Blade 模板 中显示旧输入,则使用 old 来重新填充表单会更加方便。如果给定字段不存在旧输入,则将返回 null
<input type="text" name="name" value="{{ old('name') }}">
  • 错误信息中文化

php代码依赖网站:https://packagist.org/

搜索:laravel-lang

使用compose命令安装
复制你想要的语言文件夹,中文是zh_CN,在你的 Laravel 应用程序resources/langlang目录中。
最后在/config/app.php中修改locale值,改成你需要是有个的语言简称
  • 自定义错误信息中的字段翻译

在/lang/zh_CN/validation.php文件中,尾部添加以下代码

'attributes'           =>[
        'name'   => '姓名',
        'age'   => '年龄',
        'email'   => '邮箱',
    ]

11.文件上传

  • 文件上传必备信息

form标签

具备提交按钮

method=”POST”

enctype=”multipart/form-data”

  • 上传错误状态码error取值0-7,没有5,0表示成功

上传成功返回信息$_FILES:


控制器代码:

视图代码:

路由代码:

12.数据分页

使用laravel自带的paginate来自动分页

laravel自带的css样式不好看,可自定义

{{$data -> links(‘pagination::bootstrap-4’)}}

13.验证码依赖安装与配置

https://packagist.org/ 搜索captcha

14.迁移文件

迁移文件默认位置:/database/migrations/ 文件夹

创建迁移文件命令:create_paper_table

php artisan make::migration 迁移文件名

执行迁移文件,如果在当前项目中第一次纸吸管迁移文件的话,需要先去执行:

php artisan migrate:install

在/database/migrations/ 文件夹只保留需要创建的数据表文件,然后执行:

php artisan migrate

回滚操作,删除数据表

php artisan migrate:rollback

15.填充器

填充器文件目录:/database/seeds/

创建填充器命令

php artisan make:seeder 填充器名称

填充器名称:大写表名+TableSeeder

比如:PaperTableSeeder

填充器代码实例:

执行填充器命令:

php artisan db:seed--class=需要纸吸管的种子文件名

上述命令的文件名不需要带后缀