分类: 后端

  • Laravel 学习笔记

    一、前期准备:项目初始化与基础配置

    1.1 项目创建与依赖安装

    Laravel 内置API开发支持,无需额外引入前端脚手架,推荐使用纯净API项目初始化方式:

    # 创建Laravel项目
    composer create-project laravel/laravel laravel-api
    
    # 进入项目目录
    cd laravel-api
    
    # 禁用前端相关依赖(可选,纯API无需前端)
    rm -rf resources/js resources/css package.json vite.config.js

    1.2 环境配置与数据库连接

    修改根目录 .env 文件,配置核心环境变量,确保数据库、时区、接口响应格式适配后端API:

    # 应用基础配置
    APP_NAME=LaravelAPI
    APP_ENV=local
    APP_KEY=生成的密钥
    APP_DEBUG=true
    APP_URL=http://localhost:8000
    APP_TIMEZONE=Asia/Shanghai
    APP_LOCALE=zh-CN
    
    # 数据库配置(MySQL为例)
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=laravel_api
    DB_USERNAME=root
    DB_PASSWORD=
    
    # 接口跨域配置(后续详解)
    ALLOWED_ORIGINS=*

    生成应用密钥(必填,保障加密安全):

    php artisan key:generate

    二、路由:API路由定义与规范

    2.1 API专属路由文件

    Laravel 提供 routes/api.php 路由文件,专门用于定义后端接口,默认前缀 /api,无需手动添加,且不包含Session中间件,适配无状态API。

    2.2 基础路由定义

    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\Api\UserController;
    use App\Http\Controllers\Api\PostController;
    
    // 单接口路由
    Route::get('/test', function () {
        return response()->json([
            'code' => 200,
            'msg' => 'API接口正常',
            'data' => []
        ]);
    });
    
    // 控制器路由(推荐)
    Route::get('/users', [UserController::class, 'index']); // 用户列表
    Route::get('/users/{id}', [UserController::class, 'show']); // 单个用户
    Route::post('/users', [UserController::class, 'store']); // 创建用户
    Route::put('/users/{id}', [UserController::class, 'update']); // 更新用户
    Route::delete('/users/{id}', [UserController::class, 'destroy']); // 删除用户
    

    2.3 资源路由(RESTful规范)

    针对标准CRUD接口,使用资源路由简化定义,自动映射RESTful风格接口:

    // 完整资源路由
    Route::apiResource('posts', PostController::class);
    
    // 仅指定部分接口
    Route::apiResource('posts', PostController::class)->only(['index', 'show']);
    
    // 排除部分接口
    Route::apiResource('posts', PostController::class)->except(['destroy']);

    2.4 路由分组与中间件

    对接口进行分组管理,统一添加前缀、中间件(如鉴权、跨域):

    Route::prefix('v1')->group(function () {
        // 公开接口
        Route::post('/login', [AuthController::class, 'login']);
        Route::post('/register', [AuthController::class, 'register']);
    
        // 需鉴权接口
        Route::middleware('auth:sanctum')->group(function () {
            Route::get('/user/info', [AuthController::class, 'userInfo']);
            Route::apiResource('posts', PostController::class);
        });
    });

    三、控制器:API业务逻辑处理

    3.1 创建API专用控制器

    推荐在 app/Http/Controllers/Api 目录下创建控制器,区分前后端,命令行创建:

    # 创建基础控制器
    php artisan make:controller Api/UserController
    
    # 创建资源控制器(自带CRUD方法)
    php artisan make:controller Api/PostController --api

    3.2 控制器标准写法(API响应规范)

    后端API统一返回JSON格式数据,遵循 code+msg+data 响应规范,避免直接返回原生数据:

    <?php
    
    namespace App\Http\Controllers\Api;
    
    use App\Http\Controllers\Controller;
    use App\Models\User;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Hash;
    
    class UserController extends Controller
    {
        /**
         * 用户列表
         */
        public function index(Request $request)
        {
            // 分页查询
            $users = User::query()->paginate(10);
            return $this->success('用户列表获取成功', $users);
        }
    
        /**
         * 单个用户详情
         */
        public function show($id)
        {
            $user = User::find($id);
            if (!$user) {
                return $this->fail('用户不存在', 404);
            }
            return $this->success('用户详情获取成功', $user);
        }
    
        /**
         * 统一成功响应
         */
        protected function success($msg = '操作成功', $data = [], $code = 200)
        {
            return response()->json([
                'code' => $code,
                'msg' => $msg,
                'data' => $data
            ]);
        }
    
        /**
         * 统一失败响应
         */
        protected function fail($msg = '操作失败', $code = 400)
        {
            return response()->json([
                'code' => $code,
                'msg' => $msg,
                'data' => []
            ]);
        }
    }
    

    四、请求验证:参数校验与异常处理

    4.1 表单请求验证(推荐)

    创建独立验证类,分离校验逻辑与业务逻辑,命令行创建:

    php artisan make:request Api/UserStoreRequest

    编写验证规则(app/Http/Requests/Api/UserStoreRequest.php):

    <?php
    
    namespace App\Http\Requests\Api;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class UserStoreRequest extends FormRequest
    {
        /**
         * 权限判断
         */
        public function authorize()
        {
            return true; // 开放接口直接返回true
        }
    
        /**
         * 验证规则
         */
        public function rules()
        {
            return [
                'username' => 'required|string|unique:users|max:20',
                'email' => 'required|email|unique:users',
                'password' => 'required|string|min:6|confirmed',
            ];
        }
    
        /**
         * 自定义错误提示
         */
        public function messages()
        {
            return [
                'username.required' => '用户名不能为空',
                'email.unique' => '邮箱已被注册',
                'password.confirmed' => '两次密码不一致',
            ];
        }
    }
    

    4.2 控制器调用验证

    public function store(UserStoreRequest $request)
    {
        // 验证通过后获取安全参数
        $data = $request->validated();
        $data['password'] = Hash::make($data['password']);
        $user = User::create($data);
        return $this->success('用户创建成功', $user);
    }

    4.3 全局异常处理(API适配)

    修改 app/Exceptions/Handler.php,将异常转为JSON响应,避免页面报错:

    use Illuminate\Validation\ValidationException;
    
    public function register()
    {
        $this->renderable(function (ValidationException $e, $request) {
            if ($request->is('api/*')) {
                return response()->json([
                    'code' => 422,
                    'msg' => '参数校验失败',
                    'data' => $e->errors()
                ], 422);
            }
        });
    }

    五、数据库:迁移、模型与数据操作

    5.1 数据迁移(表结构管理)

    通过迁移文件管理数据库表,无需手动建表:

    # 创建迁移文件
    php artisan make:migration create_posts_table
    
    # 执行迁移(建表)
    php artisan migrate
    
    # 回滚迁移
    php artisan migrate:rollback

    迁移文件示例(创建文章表):

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->integer('user_id');
            $table->timestamps();
        });
    }

    5.2 模型定义与关联

    # 创建模型
    php artisan make:model Post

    模型配置(app/Models/Post.php):

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        use HasFactory;
    
        // 允许批量赋值字段
        protected $fillable = ['title', 'content', 'user_id'];
    
        /**
         * 关联用户(一对多)
         */
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }

    5.3 API常用数据操作

    • 分页查询Post::paginate(10),自动返回分页元数据

    • 条件筛选Post::where('user_id', $userId)->get()

    • 关联查询Post::with('user')->paginate(10)(预加载避免N+1问题)

    • 新增数据Post::create($validatedData)

    • 更新数据Post::findOrFail($id)->update($validatedData)

    • 删除数据Post::findOrFail($id)->delete()

    六、接口鉴权:Sanctum无状态认证

    6.1 Sanctum安装与配置

    Laravel官方推荐的轻量级API鉴权方案,无状态、适配纯后端接口:

    # 安装Sanctum
    composer require laravel/sanctum
    
    # 发布配置文件
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
    
    # 执行迁移(生成令牌表)
    php artisan migrate

    app/Models/User.php 引入令牌 trait:

    use Laravel\Sanctum\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
    }

    6.2 登录签发令牌

    public function login(Request $request)
    {
        $credentials = $request->validate([
            'email' => 'required|email',
            'password' => 'required|string',
        ]);
    
        if (!Auth::attempt($credentials)) {
            return $this->fail('账号或密码错误', 401);
        }
    
        $user = Auth::user();
        // 签发令牌
        $token = $user->createToken('api_token')->plainTextToken;
    
        return $this->success('登录成功', [
            'token' => $token,
            'user' => $user
        ]);
    }

    6.3 鉴权中间件使用

    在路由中添加 auth:sanctum 中间件,保护接口:

    Route::middleware('auth:sanctum')->group(function () {
        Route::get('/user/profile', [AuthController::class, 'profile']);
        Route::apiResource('posts', PostController::class);
    });

    前端请求时,在请求头携带令牌:Authorization: Bearer 令牌值

    6.4 退出登录(销毁令牌)

    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();
        return $this->success('退出登录成功');
    }

    七、跨域处理:API接口跨域解决方案

    纯后端API需解决跨域问题,Laravel 自带跨域中间件,修改配置文件 config/cors.php

    return [
        'paths' => ['api/*'],
        'allowed_methods' => ['*'],
        'allowed_origins' => ['*'], // 生产环境替换为具体域名
        'allowed_origins_patterns' => [],
        'allowed_headers' => ['*'],
        'exposed_headers' => [],
        'max_age' => 0,
        'supports_credentials' => false,
    ];

    修改后重启服务,跨域中间件自动生效。

    八、API优化与进阶技巧

    8.1 资源响应(格式化输出)

    使用API资源类统一数据返回格式,避免字段冗余:

    # 创建资源类
    php artisan make:resource PostResource

    资源类编写(app/Http/Resources/PostResource.php):

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'content' => $this->content,
            'author' => $this->user->username ?? '',
            'create_time' => $this->created_at->toDateTimeString(),
        ];
    }

    控制器调用:return $this->success('获取成功', PostResource::collection($posts));

    8.2 接口限流(防恶意请求)

    使用Laravel内置限流中间件,限制接口请求频率:

    // 限制1分钟内最多60次请求
    Route::middleware('throttle:60,1')->group(function () {
        Route::post('/login', [AuthController::class, 'login']);
    });

    8.3 软删除与数据恢复

    迁移文件添加软删除字段,模型引入软删除trait,避免物理删除数据:

    // 迁移文件
    $table->softDeletes();
    
    // 模型
    use Illuminate\Database\Eloquent\SoftDeletes;
    class Post extends Model
    {
        use SoftDeletes;
    }

    九、接口调试与启动

    • 启动服务php artisan serve,默认地址 http://127.0.0.1:8000
    • 路由查看php artisan route:list,查看所有API路由详情
    • 调试工具:使用Postman、ApiFox等接口工具调试,无需前端页面
    • 日志查看:日志文件位于 storage/logs/laravel.log,排查后端异常
  • Linux 常用命令完整大全

    目录

    1. 文件与目录操作
    2. 文件查看/编辑
    3. 权限与用户组
    4. 进程与系统监控
    5. 磁盘/挂载/文件系统
    6. 网络操作
    7. 软件包管理(CentOS/RHEL & Ubuntu/Debian)
    8. 压缩解压
    9. 文本处理三剑客:grep / sed / awk
    10. 系统信息、时间、环境变量
    11. 远程连接与文件传输
    12. 服务管理(systemd)
    13. 快捷辅助命令

    一、文件与目录操作

    命令 作用 常用示例
    pwd 打印当前工作目录 pwd
    cd 切换目录 cd /etccd ~ 回家目录、cd - 返回上一级目录
    ls 列出目录内容 ls -l 详细列表、ls -a 显示隐藏文件、ls -lh 人性化大小
    mkdir 创建目录 mkdir testmkdir -p a/b/c 递归创建多级目录
    rmdir 删除空目录 rmdir test
    rm 删除文件/目录 rm file.txtrm -rf dir 强制递归删除(慎用)
    cp 复制文件/目录 cp a.txt /tmp/cp -r dir1 dir2 复制文件夹
    mv 移动/重命名 mv old.txt new.txtmv file /home/
    touch 创建空文件/更新时间戳 touch log.txt
    ln 创建软硬链接 ln -s /etc/hosts link_hosts 软链接
    find 查找文件 find / -name "*.log"find . -size +100M 查找大于100M文件

    二、文件查看/编辑

    命令 作用 常用示例
    cat 一次性读取全部文件 cat info.txtcat > new.txt 写入内容
    more 分页浏览(只能下翻) more access.log
    less 分页浏览(上下翻、搜索) less nginx.log
    head 查看文件前N行 head -20 test.log 前20行
    tail 查看末尾N行、实时跟踪日志 tail -f nginx.log 实时刷新、tail -n 50 log
    wc 统计行数、单词、字符 wc -l file.txt 统计行数
    du 查看目录占用磁盘 du -sh * 当前目录各文件夹大小
    vim / vi 终端文本编辑器 vim nginx.conf
    nano 简易轻量编辑器 nano test.txt

    三、权限、用户、用户组

    命令 作用 常用示例
    chmod 修改文件权限 chmod 755 run.shchmod +x run.sh 添加执行权限
    chown 修改文件属主/属组 chown root:root test.txt
    useradd 创建用户 useradd admin
    userdel 删除用户 userdel -r admin 连带家目录删除
    passwd 修改密码 passwd root
    groupadd 创建用户组 groupadd dev
    usermod 修改用户附属组 usermod -aG docker root
    id 查看当前用户UID/GID id
    who / w 查看登录用户 w 显示登录用户及操作
    su 切换用户 su root
    sudo 临时以管理员执行 sudo systemctl restart nginx

    四、进程与系统监控

    命令 作用 常用示例
    ps 查看进程快照 ps -efps aux
    top 实时进程资源监控 top
    htop 增强版top(需安装) htop
    kill 终止进程 kill 1234kill -9 1234 强制杀死
    pkill 按进程名杀死 pkill nginx
    nice / renice 调整进程优先级 nice -n -10 ./app
    free 查看内存使用 free -h 人性化单位
    vmstat 虚拟内存、IO状态 vmstat 2 每2秒刷新
    uptime 系统运行时长、负载 uptime

    五、磁盘、挂载、文件系统

    命令 作用 常用示例
    df 磁盘分区使用率 df -h
    mount 挂载磁盘/镜像 mount /dev/sdb1 /data
    umount 卸载挂载点 umount /data
    fdisk 磁盘分区工具 fdisk -l 列出所有磁盘
    blkid 查看磁盘UUID blkid
    fsck 文件系统修复(卸载后执行) fsck /dev/sdb1

    六、网络操作

    命令 作用 常用示例
    ip 新版网络工具(替代ifconfig) ip a 查看网卡、ip route 路由表
    ifconfig 旧网卡信息工具 ifconfig eth0
    ping 连通性测试 ping baidu.com
    netstat 查看端口、连接 netstat -tulnp 监听端口
    ss 替代netstat,更快 ss -tulnp
    curl 网络请求工具 curl https://www.baidu.com
    wget 文件下载 wget https://xxx/file.zip
    telnet 端口连通测试 telnet 127.0.0.1 80
    traceroute 路由追踪 traceroute baidu.com
    host / nslookup DNS解析 nslookup www.qq.com

    七、软件包管理

    1)CentOS / RHEL / Rocky Linux(yum/dnf)

    命令 作用
    yum list installed 列出已装软件
    yum install nginx 安装软件
    yum remove nginx 卸载
    yum update 全系统升级
    yum search mysql 搜索软件包
    rpm -ivh xxx.rpm 本地rpm包安装
    rpm -qa | grep nginx 查询是否安装

    2)Ubuntu / Debian(apt)

    命令 作用
    apt update 更新软件源缓存
    apt install nginx 安装
    apt remove nginx 卸载
    apt full-upgrade 系统升级
    apt search nginx 搜索包
    dpkg -i xxx.deb 本地deb安装

    八、压缩解压

    命令 格式 示例
    tar -zcvf tar.gz 打包压缩 tar -zcvf file.tar.gz dir/
    tar -zxvf 解压tar.gz tar -zxvf file.tar.gz
    tar -jcvf tar.bz2 tar -jcvf file.tar.bz2 dir
    unzip zip解压 unzip file.zip
    zip -r zip压缩文件夹 zip -r out.zip dir
    gzip 单文件压缩 gzip test.txt

    九、文本三剑客:grep / sed / awk

    命令 作用 示例
    grep 文本匹配搜索 grep "error" nginx.loggrep -v "info" 排除匹配行
    sed 流编辑器,替换/删除 sed 's/old/new/g' file.txt 全局替换
    awk 结构化文本统计、切割 awk '{print $1}' log.txt 打印第一列

    十、系统信息、时间、环境变量

    命令 作用
    uname -a 内核、系统版本
    hostname 主机名
    hostnamectl 修改主机名(systemd)
    date 当前系统时间
    timedatectl 时区时间管理
    env / printenv 查看环境变量
    echo $PATH 打印PATH变量
    history 查看历史执行命令
    clear 清屏

    十一、远程连接 & 文件传输

    命令 作用 示例
    ssh 远程登录服务器 ssh root@192.168.1.100
    scp 服务器之间传文件 scp local.zip root@ip:/tmp/
    sftp 交互式远程文件传输 sftp root@ip
    rsync 增量同步文件(备份首选) rsync -avz dir/ root@ip:/data/

    十二、Systemd 服务管理(主流 Linux)

    命令 作用
    systemctl start nginx 启动服务
    systemctl stop nginx 停止
    systemctl restart nginx 重启
    systemctl enable nginx 开机自启
    systemctl disable nginx 关闭自启
    systemctl status nginx 查看运行状态
    systemctl list-units --type=service 列出所有服务
    journalctl -u nginx 查看服务日志

    十三、开关机、权限辅助、管道重定向

    命令 说明
    reboot 重启服务器
    shutdown -h now 立即关机
    shutdown -r 10 10分钟后重启
    > 输出覆盖文件:echo 123 > a.txt
    >> 追加写入文件:echo abc >> a.txt
    \| 管道,传递输出:ps aux \| grep nginx
    & 后台运行进程:./app &
    nohup 脱离终端后台运行:nohup ./app &
    alias ll='ls -lh' 设置命令别名

    十四、高危命令警示(务必谨慎)

    1. rm -rf / 清空整个系统,绝对禁止
    2. dd if=/dev/zero of=/dev/sda 清空整块硬盘
    3. chmod 777 所有用户完全读写执行,存在安全漏洞
    4. kill -9 1 强制杀死systemd/init,服务器直接宕机