Laravel老王整理(更新中...)

533 阅读4分钟

框架基础

composer使用阿里云的源

// 首先把默认的源给禁用掉
composer config -g secure-http false

// 再修改镜像源 这里我使用阿里的源
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

// 修改成功后可以先查看一下配置
composer config -g -l

// 第二行repositories.packagist.org.url 如果是阿里的就代表成功

新建项目

composer create-project --prefer-dist laravel/laravel 项目名称

指定laravel版本

composer create-project --prefer-dist laravel/laravel=7.* 项目名称

控制器

创建控制器

app/Http/Controllers/DemoController.php
<?php
namespace App\Http\Controllers;

class DemoController extends Controller {
	public function index()
	{
		return 'index';
	}

	public function hello($name) {
		return "name=" . $name;
	}
}

路由

// 添加路由语法
Route::请求方式("/index", "控制器@方法");
Route::get("/index", "DemoController@index");
Route::get("/hello/{name}", "DemoController@hello");

路由参数限制正则

// 单个参数限制只能使用数字参数
Route::get('/hello/{id}',"DemoController@hello")->where("id", "[0-9]+");

// 多个参数限制只能使用数字参数
Route::get('/hello/{id}/{name}',"DemoController@hello")
    ->where(["id"=>"[0-9]+", "name"=>"[0-9]+"]);

// 指定限制条件
Route::get('/hello/{id}',"DemoController@hello")->where("id", ".*");

全局限制

app/Providers/RouteServiceProvider.php
public function boot()
{
    // 全局的路由参数限制
    Route::pattern("id", "[0-9]+");
    parent::boot();
}

路由重定向

// 路由
Route::redirect("/baidu", "http://www.baidu.com");
Route::redirect("/toindex", "index");

// 在控制器中使用
return redirect()->action("控制器名@方法名");
return redirect()->action("控制器名@方法名", ["参数"]);

视图

// 试图文件在文件夹中
resources/views/

resources/views/demo.blade.php

<!DOCTYPE html>
<html>
<head>
	<title>demo</title>
	<meta charset="utf-8">
</head>
<body>
	<h1>Welcome Demo {{$id}}</h1>
</body>
</html>

对应三种方式返回试图模板

Route::view("/demo", "demo", ["id"=>"老张"]);
Route::get("/demo", function(){
	return view("demo", ["id"=>"老李"]);
});
Route::get("/demo", "DemoController@demo");
public function demo(){
    return view("demo", ["id"=>"老王"]);
}

路由命名

// 路由命名
Route::get("/demo", "TestController@index")->name("lisi");

// 控制器里面
route("lisi");
// http://localhost/public/p1/demo

// 重定向
return redirect("http://www.baidu.com");
return redirect()->route("name");

传参数

// 路由
Route::get("/goubuli/{name}","AaaController@goubuli")->name("lisi");

// 控制器里面
route("lisi", ["name"=>"zhangsan"])

路由分组

// 无前缀分组
Route::group([], function(){
	Route::get("/demo","AaaController@index")->name("hello");
});


// 加前缀分组
Route::prefix("/api")->group(function(){
	Route::get("/demo","AaaController@index")->name("hello");

	Route::get("/goubuli/{name}","AaaController@goubuli")->name("lisi");
});

响应

// Content-Type: text/html; charset=UTF-8
return "abc";

// Content-Type: application/json
return [12341, "abc", "dd"];

return response("abc");
return response([12341, "abc", "dd"]);

// Content-Type: application/json
return response()->json("abc");

// Content-Type: application/json
return response("abc")->header("Content-Type", "application/json");

return response(["name"=>"wang", "age"=>24]);

// 返回视图的时候修改header
return response()->view("login")->header("Content-Type", "text/plain");

多层级控制器

// 定义控制器
app/Http/Controllers/Admin/LoginController.php
    
// 控制器里
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;

class LoginController extends Controller{
	public function index(){
		return "index";
	}
}

数据库

config/database.php // 数据库配置内容如下

'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

env对应的是项目根目录下的.env文件

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydb
DB_USERNAME=root
DB_PASSWORD=111111

原生查询

 public function index()
 {
     $result = DB::select("select * from userinfo");
     return response()->json($result);
 }
public function demo5()
{
    return DB::insert("insert into userinfo(name, age) values('迪丽热巴', 22)");
}

构造器查询

public function demo1()
{
    // 返回指定的id数据
    $result = DB::table("userinfo")->find(2);
    return response()->json($result);
}
public function demo6()
{
    return response()->json([
        "code"=>200,
        "data"=>[
            "count"=>DB::table("userinfo")->get()->count(),
            "users"=>DB::table("userinfo")->get(),
        ],
        "msg"=>"success",
    ]);
}

返回指定列的数据(也可以指定key, 没大用)

public function demo8()
{
    // return DB::table("userinfo")->pluck("name");
    return DB::table("userinfo")->pluck("name", "id");
}

查询数据是否存在

// 查询是否数据存在
public function demo11()
{
    // 在返回true, 不存在返回false
    // return response()->json(DB::table("userinfo")->where("id", "1")->exists());

    // 不存在显示true, 存在显示false
    return response()->json(DB::table("userinfo")->where("id", 2)->doesntExist());
}

返回指定的列

// select 
public function demo12()
{
    return response()->json(
        DB::table("userinfo")
        ->select("age", "name")
        ->get());
}

where条件查询

// where
public function demo13()
{
    // 普通查询
    $result = DB::table("userinfo")
        ->where("age", "23")
        ->get();
    return response()->json($result);
}
// where
public function demo13()
{
    // 等于
    $result = DB::table("userinfo")
        ->where("age", "=", "23")
        ->get();
    return response()->json($result);
}
// where
public function demo13()
{
    // 大于等于
    $result = DB::table("userinfo")
        ->where("age", ">=", "23")
        ->get();
    return response()->json($result);
}
// where
public function demo13()
{
    // 模糊查询
    $result = DB::table("userinfo")
        ->where("name", "like", "%w%")
        ->get();
    return response()->json($result);
}
// where
public function demo13()
{
    // 多条件查询
    $result = DB::table("userinfo")
        ->where([
            "name"=>"zhangsan",
            "age"=>23,
        ])
        ->get();
    return response()->json($result);
}

显示原生SQL语句

// toSql 显示原生SQL语句
public function demo13()
{
    // 多条件查询
    $result = DB::table("userinfo")
        ->where([
            "name"=>"zhangsan",
            "age"=>23,
        ])
        ->toSql();
    return response()->json($result);
}

模型

// 创建模型
php artisan make:model Http/Models/模型名称(一般与表名相同)

会出现表明复数问题,解决办法可以手动指定表名

app/Http/Models/UserInfo.php模型中

class UserInfo extends Model
{
    // 指定表名
    protected $table = "userinfo";
}

聚合查询

// 聚合函数
public function demo10()
{
    // 最大值
    // return DB::table("userinfo")->max("age");

    // 最小值
    // return DB::table("userinfo")->min("age");

    // 平均值
    // return DB::table("userinfo")->avg("age");

    // 总数
    // return DB::table("userinfo")->count();

}

请求

接收POST请求

需要关闭CSRF

public function getPostParams(Request $request)
{
    // 获取post请求
    $name = $request->input("name");
    $age = $request->input("age");

    return response()->json([
        "name"   =>  $name,
        "age"   =>  $age,
    ]);
}

CSRF关闭

app/Http/Kernel.php

注释以下内容

 \App\Http\Middleware\VerifyCsrfToken::class

跨域(CORS)

1.新建一个中间件

// 在当前项目根目录执行
php artisan make:middleware EnableCrossRequestMiddleware

2.复制一下内容替换 app/Http/Middleware/EnableCrossRequestMiddleware.php

<?php
namespace App\Http\Middleware;
use Closure;
class EnableCrossRequestMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $origin = $request->server('HTTP_ORIGIN') ? $request->server('HTTP_ORIGIN') : '';
        $allow_origin = [
            'http://localhost:8000',
        ];
        if (in_array($origin, $allow_origin)) {
            $response->header('Access-Control-Allow-Origin', $origin);
            $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN');
            $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
            $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
            $response->header('Access-Control-Allow-Credentials', 'true');
        }
        return $response;
    }
}

3.在app/Http/Kernel.php中添加

protected $middleware = [
    // more
    \App\Http\Middleware\EnableCrossRequestMiddleware::class,
];

跨域解决2(允许所有地址访问)

CORS.php

<?php

namespace App\Http\Middleware;

use Closure;

class CORS
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        header('Access-Control-Allow-Origin: *');
        header("Access-Control-Allow-Credentials: true");
        header("Access-Control-Allow-Methods: *");
        header("Access-Control-Allow-Headers: Content-Type,Access-Token");
        header("Access-Control-Expose-Headers: *");

        return $next($request);
    }
}

CURD

<?php
namespace App\Http\Controllers\Article;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class ArticleController extends Controller
{
    // 查询所有文章
    public function get_all_article()
    {
        $current_page = request()->get("current_page", 1);
        $page_size = request()->get("page_size", 10);

        // 分页
        $articles = DB::table("article")->offset(($current_page-1)*10)->limit($page_size)->get();
        $total = DB::table("article")->count();

        return response()->json([
            "code"  =>  200,
            "msg"   =>  "success",
            'current_page'  => $current_page,
            'page_size' => $page_size,
            "data"  =>  [
                "articles"  =>  $articles,
                "total"     =>  $total
            ],
        ]);
    }

    // 添加文章
    public function add_article(Request $request)
    {
        $title = $request->input("title");
        $content = $request->input("content");

        // 参数验证
        $validator = Validator::make($request->all(), [
           "title"      =>  "required",
           "content"    =>  "required"
        ], [
            "title.required"    =>  "文章标题不能为空",
            "content.required"  =>  "文章内容不能为空"
        ]);

        if($validator->fails()){
            return response()->json([
                "code"  =>  601,
                "msg"   =>  $validator->errors()->first(),
            ]);
        }

        $result = DB::table("article")->insert([
            "title"     =>  $title,
            "content"   =>  $content,
        ]);

        if($result){
            return response()->json([
                "code"  =>  200,
                "msg"   =>  "添加文章成功",
            ]);
        } else {
            return response()->json([
                "code"  =>  500,
                "msg"   =>  "添加文章失败"
            ]);
        }
    }

    // 修改文章
    public function modify_article(Request $request)
    {
        $id = $request->input("id");
        $title = $request->input("title");
        $content = $request->input("content");

        // 参数验证
        $validator = Validator::make($request->all(), [
            "id"         =>  "required|min:1",
            "title"      =>  "required",
            "content"    =>  "required"
        ], [
            "id.min"          =>  "请传入正确的文章id",
            "title.required"    =>  "文章标题不能为空",
            "content.required"  =>  "文章内容不能为空"
        ]);

        if($validator->fails()){
            return response()->json([
                "code"  =>  601,
                "msg"   =>  $validator->errors()->first(),
            ]);
        }

        $result = DB::table("article")->where([
            "id"    =>  $id,
        ])->update([
            "title"     =>  $title,
            "content"   =>  $content
        ]);

        if($result){
            return response()->json([
                "code"  =>  200,
                "msg"   =>  "修改文章成功"
            ]);
        } else {
            return response()->json([
                "code"  =>  500,
                "msg"   =>  "修改文章失败"
            ]);
        }
    }

    // 删除文章
    public function delete_article(Request $request)
    {
        $id = $request->input("id");

        // 参数验证
        $validator = Validator::make($request->all(), [
            "id"         =>  "required|min:1",
        ], [
            "id.min"          =>  "请传入正确的文章id",
        ]);

        if($validator->fails()){
            return response()->json([
                "code"  =>  601,
                "msg"   =>  $validator->errors()->first(),
            ]);
        }

        $result = DB::table("article")->where([
            "id"    =>  $id
        ])->delete();

        if($result){
            return response()->json([
                "code"  =>  200,
                "msg"   =>  "删除文章成功",
            ]);
        } else {
            return response()->json([
                "code"  =>  500,
                "msg"   =>  "删除文章失败"
            ]);
        }
    }
}


验证

<?php


namespace App\Http\Controllers\Test;


use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class DemoValidatorController extends Controller
{
    public function test(Request $request)
    {
        $validator = Validator::make($request->all(), [
            "name"  =>  "required|min:2|max:4",
            "age"   =>  "required|min:1|max:200|numeric"
        ], [
            "name.required"     =>  "name不能为空",
            "name.min"          =>  "name最小是两个字符",
            "name.max"          =>  "你这是什么名字这么长",
            "age.required"      =>  "年龄不能为空",
            "age.numeric"       =>  "年龄必须是数字",
            "age.min"           =>  "年龄最小是1岁",
            "age.max"           =>  "年龄最大是200岁"
        ]);

        if($validator->fails()){
            return response()->json([
                "code"  =>  301,
                "msg"   =>  $validator->errors()->first()
            ]);
        }

        $result = DB::table("user")->insert([
            "name"  =>  $request->input("name"),
            "age"   =>  $request->input("age"),
        ]);

        if($result){
            return response()->json([
                "code"  =>  200,
                "msg"   =>  "success"
            ]);
        }

        return response()->json([
            "code"  =>  500,
            "msg"   =>  "error"
        ]);
    }
}


上传文件

上传文件保存方式/保存位置在 config/filesystems.php 中配置

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class TestController extends Controller
{
    public function upload(Request $request)
    {
        if(!($request->hasFile("file") && $request->file("file")->isValid()))
        {
            return response()->json([
                "code"  =>  500,
                "msg"   =>  "上传文件失败"
            ]);
        }

        // 接收上传的文件
        $file = $request->file("file");

        // 获取图片文件名
        $filename = $file->getClientOriginalName();

        // 获取文件后缀
        $original = $file->getClientOriginalExtension();

        // 获取文件mime类型
        $mime_type =$file->getClientMimeType();

        // 获取上传的文件缓存在tmp文件夹下的绝对路径
        $real_path = $file->getRealPath();

        // 获取缓存在tmp目录下的文件名
        $tmp_filename = $file->getFilename();

        // 设置时区
        date_default_timezone_set("Asia/Shanghai");
        // 生成随机文件名
        $new_filename = md5(time() . rand(1, 9999999)). '.' . $file->getClientOriginalExtension();

        // 文件保存
        $result = Storage::disk("public")->put($new_filename, file_get_contents($real_path));
        // 获取保存目录下的文件
        $files = Storage::disk('public')->allFiles();

        return response()->json([
            "filename"      =>  $filename,
            "original"      =>  $original,
            "mime_type"     =>  $mime_type,
            "real_path"     =>  $real_path,
            "tmp_filename"  =>  $tmp_filename,
            "datetime"      =>  $new_filename,
            "result"        =>  $result,
            "files"         =>  $files
        ]);
    }
}


UUID

# 安装
composer require ramsey/uuid
# 获取UUID4字符串
$uuid4_tmp = \Ramsey\Uuid\Uuid::uuid4()->toString();

# 替换掉 "-"
$uuid4 = strtoupper(str_replace("-", "", $uuid4_tmp));

值如下

B707236F96C248C690FE3C6AB42B819D

Nginx配置URL重写

server {
    listen       8080;
    server_name  localhost;

    location / {
        root   /Users/fanhao/myproject/php/p3/public;
        index  index.html index.htm;

        # 配置url重写
        if (!-e $request_filename) {
            rewrite . /index.php last;
        }
    }

    location ~ \.php$ {
        root   /Users/fanhao/myproject/php/p3/public;
        index index.php index.html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

Blade模版

新建模版 resource\views\xxx.blade.php

返回模板

public function home()
{
    return view("home", [
      "name"  =>  "老柳"
    ]);
}

使用变量

{{$name}}

模版流程控制 if...elseif...else...endif

if...elseif...else...endif

@if($age >= 18)
    <h3>你成年了</h3>
@elseif($num < 18)
    <h3>你没成年</h3>
@else
    👌 <h3>你是个啥</h3>
@endif

@isset(变量) : 判断变量是否存在 @empty(变量) : 判断变量是否为空


switch

@switch($age)
    @case(18)
        <h1>成年了</h1>
        @break
    @case(20)
        <h1>你20岁了</h1>
        @break
    @default
        <h1>默认年龄</h1>
        @break
@endswitch  

for循环

@for($i=0;$i<10;$i++)
    <p>{{$i}}</p>
@endfor

foreach

@foreach($users as $item)
    <p>{{$item}}</p>
@endforeach

countinue

@for($i=0;$i<10;$i++)
    @if($i==3)
        @continue
    @endif
    <p>{{$i}}</p>
@endfor

while

@while($age>10)
    {{$age--}}
    <p>{{$age}}</p>
@endwhile


模板继承

base.blade.php

<!doctype html>
<html lang="en">
<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>@yield("title", "默认值")</title>
</head>
<body>
    <h1>我是爹</h1>
    <!--头部内容-->
    @yield("header")

    <!--主要内容-->
    @yield("content")

    <!--尾部内容-->
    @yield("footer")
</body>
</html>

home.blade.php

@extends("base")

<!--对应父模版的@yield("title", "默认值")-->
@section("title", "首页")

<!--对应父模版的@yield("header")-->
@section("header")
    <h1>头部xxxxxx</h1>
@endsection

<!--对应父模版的@yield("content")-->
@section("content")
    <h1>内容xxxx</h1>
@endsection

<!--对应父模版的@yield("footer")-->
@section("footer")
    <h1>尾部内容.....</h1>
@endsection

Http客户端

curl 错误处理

cURL error 77: error setting certificate verify locations: CAfile: D:\phpstudy\Extensions\php\php7.3.4nts\cacert.pem CApath: none (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)

下载 cacert.pem 文件 修改 php.ini 配置文件

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = "D:\phpstudy\Extensions\php\php7.3.4nts\cacert.pem"