如果需要在本地架设服务器,需要先设置好 .env
文件,这样docker的MySQL的密码会按.env里的设置好。
如果是把代码提交到远程服务器的,不需要在本地跑docker/sail,请跳过此章节。
# 安装依赖,如果本地没有php和composer的话可以使用已经准备好的docker包
chmod u+x ./php-composer.sh
./php-composer.sh install --prefer-dist -vvv
启动 docker 的 mini-sail 环境
# 添加可执行权限
chmod u+x ./sail.sh
# 启动docker
./vendor/bin/sail up -d
# 或使用
./sail.sh up -d
首次运行前需要生成加密串
./sail.sh artisan key:generate
之后就可以顺利使用sail
命令了,本地同步数据库结构:sail artisan migrate
使用PHP运行本地服务器:php artisan serve
- Models 解决持久化问题
- Services 解决跨Model并且需要返回结果的
- Actions 解决不需要返回结果的动作,如进队列之后要做的事情,不需要返回值的
可在原本的 routes/api.php
下添加需要的API路由。
- 创建路由注册商
app/Routing/Api/UserRegistrar.php
, 实现\App\Routing\Contracts\RouteRegistrar
接口,并在map
函数里实现子路由 - 将刚刚的注册商挂到
app/Routing/ApiRegistrar.php
的protected array $registrars
中,此时UserRegistrar
成为ApiRegistrar
的子路由。
路由注册商将覆盖传统路由中的同路径路由。
// 推荐使用这个类,会有提示
use Illuminate\Http\Response;
// 返回正确, code = 0, data为返回值
return Response::ok([
'token'=>$token
]);
// 返回出错,code=500, message = 出错信息
return Response::fail('出错信息', 500);
// 出错时也可以直接抛ApiException出来
throw new \App\Exceptions\ApiException('出错信息')
可直接通过DI获得,或自己在后面new起来。
use App\Http\Controllers\Controller;use App\Http\Requests\Api\User\CreateMiniUserRequest;use App\Services\MiniUserService;use Illuminate\Http\Response;
class UserController extends Controller
{
//第一个参数始终是Request对象(如果是FormRequest对象会自动验证表单)
//第二个参数即是通过DI自动实例化的
public function login(CreateMiniUserRequest $request, MiniUserService $miniUserService) {
//到这里时,已经经过了表单验证,直接写主要的业务逻辑即可
// service 可以传入 request 参数处理
// 或传入数组处理
// 有错误直接对外抛ApiException即可
$wxUser = $miniUserService->createUser($request);
$token = $wxUser->createToken("API", ['*'], 120); //表示token在120天后过期
return Response::ok([
'token' => $token->plainTextToken,
'expires' => $token->accessToken->expired_at
]);
}
}
如果需要表单验证,可写至单独的表单类里。如 app/Http/Requests/User/CreateMiniUserRequest.php
然后在Controller里首个参数的类型换成新的表单类,此时表单会自动验证。表单未验证通过会自动报错。
表单类重要方法:
public function rules():array
定义一个验证规则数组,参见https://learnku.com/docs/laravel/9.x/validation/12219#quick-writing-the-validation-logic
,可用的验证包参见https://learnku.com/docs/laravel/9.x/validation/12219#available-validation-rules
public function attributes():array
定义属性名,验证不通过时会用到此项数据public function messages():array
定义出错的信息。public function authorize():bool
可在这个方法内定义$this->user()
是否有权限访问此表单操作
自定义出错信息
public function messages()
{
return [
'code.required' => '登录码未提供', // code 未通过 required 规则时报错
];
}
或
public function messages()
{
return [
'code' => '登录码字段不正确', // code任一规则未通过时报错
];
}
使用 laravel-lang 官方语言包,主要有以下指令
composer require laravel-lang/common --dev
php artisan lang:add zh_CN
php artisan lang:update
项目下载后直接修改lang
目录下的内容即可。不需要再添加和更新了。
主要的权限策略在 app\Policies
目录下。
在 controller 中使用 $this->authorize('destroy', $permission);
来判断当前用户是否有权限 destroy $permission
, 将会通过$permission
的类型交由对应的Policy
判断。
users表中id为1的即为超管,其余为普通管理员。
php artisan app:create.admin
将创建一个新管理员。
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils
yum install php82-php-cli php82-php-fpm php82-php-gd php82-php-sodium php82-php-pecl-memcached php82-php-mbstring php82-php-mysqlnd php82-php-xml php82-php-pecl-zip php82-php-pecl-redis5 php82-php-bcmath
groupadd www-data
useradd -d /www -g www-data www-data
修改 nginx 和 php-fpm 的运行用户
确认 /var/lib/nginx/tmp/
之下的目录都是 www-data:root 归属
可使用 https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN
提供的配置工具执行
反代配置
# index.html fallback
location / {
try_files $uri $uri/ /index.html;
}
location ^~ /admin/ {
alias /www/admin-front/www/;
}
location ^~ /storage/ {
alias /www/php-server/current/public/storage/;
}
# index.php fallback
location ~ ^/api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
include proxy.conf;
#try_files $uri $uri/ /index.php?$query_string;
}
PHP配置
server {
listen 127.0.0.1:8000;
server_name www.domain.com;
root /www/php-server/current/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
access_log /var/log/nginx/php-access.log combined buffer=512k flush=1m;
error_log /var/log/nginx/php-error.log warn;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
#fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}