框架基础
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"