Skip to main content

Laravel

了解有哪些 PHP 依赖项

无论什么版本的 Laravel 都要去官方文档确认,保证服务器的依赖项已妥当。充分必要:已安装依赖;已改 php.ini 配置使其生效。

https://laravel.com/docs/8.x/deployment#server-requirements

在开发环境快速运行项目

运行前注意 php 对 storage 目录要有写权限。

php artisan serve --port 8080

看过 artisan 源码,多了监听文件更改,输入友好 std log 等等功能。 但核心功能其实也是用 PHP 内置的 Web Server,所以可以用以下代码代替:

php -S 0.0.0.0:8080 -t public

自定义 4xx/5xx 错误页面

基本每个新建项目都必须自定义错误页面。 例如 Laravel 在 DEBUG=false 的情况下 400 不会打印 message 永远只有一个 Bad Request 提示,显然不够用。 我们后端遇到业务逻辑错误,一般都会返回 400 并带上错误提示给前端。

执行导出以后,在 views/errors 目录可见相应 blade 模板:

php artisan vendor:publish --tag=laravel-errors

新建 400 的错误页面 views/errors/400.blade.php,当有 400 的 response 时会调用该模板输出错误页面:

@extends('errors::minimal')

@section('title', __('Bad Request'))
@section('code', '400')
@section('message', __($exception->getMessage() ?: 'Bad Request'))

深入使用 Laravel 会发现它的业务错误都是 403,必然有其合理性。

403 Forbidden 状态码 403 Forbidden 代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。 该访问是长期禁止的,并且与应用逻辑密切相关。 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/403

建议新写的代码,遇到可预期的逻辑否的情况,都改用 403。 例如:后端调第三方 Resfull 接口,对方服务器返回 404,资源不存在,这是可预期的其中一种情况,应返回 403 给我们的前端。

代码被意外中断无法完成业务就用 400。 例如:后端用 Http 调第三方接口,对方服务器返回 500,那么我们返回给前端的应是 400。

发 Http 请求

use Illuminate\Support\Facades\Http;

https://laravel.com/docs/9.x/http-client

错误处理 Laravel 的 Http 客户端封装了原生 Guzzle,遇到错误不抛出 Exception,而是自行在发请求后调用 $response->failed() 把它当做一种正常的程序逻辑情况进行处理,这是非常正确做法,减少不必要的 try...catch 降低复杂度让代码更简洁。 https://laravel.com/docs/9.x/http-client#error-handling

使用 envsubst 将环境变量的值写入 .env 文件

envsubst 是 Ubuntu 软件包 gettext-base 里面内置的工具,部分最小化的 Ubuntu 发行版(例如官方的 Docker Image)没有内置,需自行 apt-get install -y gettext-base 再使用。 https://manpages.ubuntu.com/manpages/trusty/man1/envsubst.1.html

此工具在 CI 中非常有用,必然用到。生产环境数据库密码等敏感信息,预定义成加密的 CI 变量,在流水线中自动化生成指定 .env 文件。

原始 .env.example 文件内容:

DB_PASSWORD="${DB_PASSWORD}"

执行:

  • export DB_PASSWORD="38sojf33"
  • envsubst < .env.example > .env

生成的 .env 文件内容:

DB_PASSWORD="38sojf33"