laravel11+ 笔记
大约 4 分钟
配置文件
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:CyER66l1OOfO3UVuVIhbiMbFzoT5wNuFK82ntyBFjqU=
APP_DEBUG=true
APP_TIMEZONE=Asia/Shanghai
APP_URL=http://localhost
OCTANE_SERVER=swoole
OCTANE_HTTPS=false
APP_LOCALE=zh-CN
APP_FALLBACK_LOCALE=zh-CN
APP_FAKER_LOCALE=zh_CN
APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database
PHP_CLI_SERVER_WORKERS=4
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=math
DB_USERNAME=math
DB_PASSWORD=
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
BROADCAST_CONNECTION=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=redis
CACHE_STORE=redis
CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=admin
AWS_SECRET_ACCESS_KEY=admin666
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=web
AWS_USE_PATH_STYLE_ENDPOINT=false
AWS_ENDPOINT=http://192.168.110.134:9000
AWS_URL=//home.cc:9000
VITE_APP_NAME="${APP_NAME}"
octane 使用
composer require laravel/octane
php artisan octane:install # swoole
php artisan octane:start --server=swoole --host=0.0.0.0 --port=8089
多表登录
bootstrap/app.php
<?php
use App\Exceptions\BusinessException;
use App\Http\Middleware\CheckUserAuth;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Support\Facades\Route;
use Laravel\Sanctum\Http\Middleware\CheckAbilities;
use Laravel\Sanctum\Http\Middleware\CheckForAnyAbility;
use Illuminate\Http\Request;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__ . '/../routes/web.php',
commands: __DIR__ . '/../routes/console.php',
channels: __DIR__ . '/../routes/channels.php',
health: '/up',
then: function () {
Route::prefix("api")
->middleware(["auth:admin", "abilities:admin", "can:admin",CheckUserAuth::class])
->group(base_path("routes/api.php"));
Route::prefix("admin")
->middleware(["auth:admin", "abilities:admin", "can:admin",CheckUserAuth::class])
->group(base_path("routes/admin.php"));
// 学员端
Route::prefix('student')
->middleware([
"auth:student",// 认证的grud,作用域
"abilities:student",
"can:student", // 认证的grud
CheckUserAuth::class,
])
->group(base_path('routes/student.php'));
}
)
->withMiddleware(function (Middleware $middleware): void {
$middleware->redirectUsersTo("/");
$middleware->statefulApi();
$middleware->alias([
'abilities' => CheckAbilities::class,
'ability' => CheckForAnyAbility::class,
]);
// 全局中间件
$middleware->use([
// \Illuminate\Http\Middleware\TrustHosts::class,
\Illuminate\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Http\Middleware\ValidatePostSize::class,
\Illuminate\Foundation\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
]);
$middleware->validateCsrfTokens(except: [
"/common/*",
//微信公众号 关闭 csrf_token
"wechat/serve",
// 支付回调
"wechat/pay/callback",
"wechat/callback",
]);
})
->withExceptions(function (Exceptions $exceptions): void {
$exceptions->render(function (Exception $e, Request $request) {
if ($e instanceof Illuminate\Auth\AuthenticationException && $request->wantsJson()) {
return response()->json(["code" => 419, "msg" => "请重新登录"]);
}
// 其他类型的异常处理
if ($e instanceof BusinessException && $request->wantsJson()) {
return response()->json(["code" => 202, "msg" => $e->getMessage()]);
}
if ($e instanceof \Symfony\Component\Routing\Exception\RouteNotFoundException && $request->wantsJson()) {
return response()->json(["code" => 202, "msg" => $e->getMessage()]);
}
return response()->json(["code" => 202, "msg" => $e->getMessage()]);
});
})->create();
错误处理
app/Traits/ApiResponseData.php
<?php
/**
* Created by OragBus
* User email: orangbus40400@gmail.com
* website: orangbus.cn
* blog: doc.orangbus.cn
* github: github.com/orangbus
*/
namespace App\Traits;
trait ApiResponseData{
/**
* 成功返回消息
* @param string $msg
* @param array $data
* @param int $code
* @return \Illuminate\Http\JsonResponse
*/
public function success($msg="ok",$data=[],$code=200){
if (!empty($data)) return response()->json(["code"=>$code,"data"=>$data,"msg"=>$msg]);
return response()->json(["code"=>$code,"msg"=>$msg]);
}
/**
* 失败返回消息
* @param string $msg
* @param int $code
* @return \Illuminate\Http\JsonResponse
*/
public function error($msg="请求错误",$code=202){
return response()->json(["code"=>$code,"msg"=>$msg]);
}
/**
* 数据返回
* @param array $data
* @param string $count
* @param string $msg
* @param int $code
* @return \Illuminate\Http\JsonResponse
*/
public function resData($data=[],$total = '',$msg="success",$code=200){
if (empty($total)) return response()->json(["code"=>$code,"msg"=>$msg,"data"=>$data]);
return response()->json(["code"=>$code,"data"=>$data,"total"=>$total,"msg"=>$msg]);
}
/**
* @param $data
* @param string $msg
* @param int $code
* @return \Illuminate\Http\JsonResponse
*/
public function successData($data,$msg="success",$code=200){
return response()->json(["code"=>$code,"data"=>$data,"msg"=>$msg]);
}
/**
* @param string $msg
* @param array $data
* @param int $code
* @return \Illuminate\Http\JsonResponse
*/
public function addSuccess($msg="添加成功",$data=[],$code=200){
if ($data)return response()->json(["code"=>$code,"data"=>$data,"msg"=>$msg]);
return response()->json(["code"=>$code,"msg"=>$msg]);
}
/**
* @param string $msg
* @param array $data
* @param int $code
* @return \Illuminate\Http\JsonResponse
*/
public function updateSuccess($msg="修改成功",$data=[],$code=200)
{
if ($data)return response()->json(["code"=>$code,"data"=>$data,"msg"=>$msg]);
return response()->json(["code"=>$code,"msg"=>$msg]);
}
/**
* @param string $msg
* @param array $data
* @param int $code
* @return \Illuminate\Http\JsonResponse
*/
public function deleteSuccess($msg="删除成功",$data=[],$code=200)
{
if ($data)return response()->json(["code"=>$code,"data"=>$data,"msg"=>$msg]);
return response()->json(["code"=>$code,"msg"=>$msg]);
}
}
常用扩展包
composer require predis/predis
composer require pusher/pusher-php-server
composer require laravel/ui
composer require laravel/telescope
composer require laravel/envoy
composer require --dev barryvdh/laravel-ide-helper
composer require zoujingli/ip2region
composer require wangju/ding-notice
composer require torann/geoip
composer require simplesoftwareio/simple-qrcode
composer require overtrue/laravel-wechat
composer require overtrue/easy-sms
composer require maatwebsite/excel
composer require league/flysystem-aws-s3-v3
composer require jenssegers/agent
barryvdh/laravel-ide-helper
https://github.com/barryvdh/laravel-ide-helper
composer require --dev barryvdh/laravel-ide-helper
php artisan ide-helper:generate
php artisan ide-helper:models
ip地址信息
https://github.com/zoujingli/ip2region
composer require zoujingli/ip2region
在项目中快速调用
$ip2region = new \Ip2Region();
$result = $ip2region->simple('8.8.8.8');
var_dump($result);
封装方法
public static function getIpInfo($ip)
{
$app= new \Ip2Region();
$result =$app->btreeSearch($ip);
$data = explode("|", $result["region"]);
$param['country'] = $data[0] ?? "";
$param['region'] = $data[2] ?? '';
$param['city'] = $data[3] ?? '';
$param['isp'] = $data[4] ?? '';
return $param;
}
前端
php artisan ui vue --auth
templet live
@route-api
#[Route(method: "get",fullUri: "api/account/info")]
enum("api","admin","user")
enum("list","store","delete","creatre","edit")
pusher
如果需要运行多个 laravel-echo-serve ,需要配置 缓存前缀
指定数据库
laravel 配置
REDIS_CLIENT=phpredis
REDIS_HOST=home.cc
REDIS_PASSWORD=admin666
REDIS_PORT=6379
REDIS_PREFIX=xuekatu_ # 重要
REDIS_DB=5 # 重要
BROADCAST_CONNECTION=pusher # 重要
PUSHER_APP_ID=df520990040eb943
PUSHER_APP_KEY=7330b69b1df85b1e65c6b2034745a690
PUSHER_HOST=pusher.cc #
PUSHER_PORT=6001 # 切换不同的端口进行访问
PUSHER_SCHEME=http
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
laravel-echo-serve 配置
{
"authHost": "https://xuekatu.com", // 配置对应的域名
"authEndpoint": "/broadcasting/auth",
"clients": [
{
"appId": "df520990040eb943",
"key": "7330b69b1df85b1e65c6b2034745a690"
}
],
"database": "redis",
"databaseConfig": {
"redis": {
"host": "42.194.197.226", // redis 链接地址
"port": 6379,
"password": "123456",
"keyPrefix": "xuekatu_", // 跟laravel redis 配置的缓存前缀一致
"options": {
"db": 5 // 跟laravel redis 配置的 db 一致
}
},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": false,
"host": null,
"port": "6001", // 修改监听端口,也可以通过docker映射修改
"protocol": "http",
"socketio": {},
"secureOptions": 67108864,
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": "",
"subscribers": {
"http": true,
"redis": true
},
"apiOriginAllow": {
"allowCors": true,
"allowOrigin": "*",
"allowMethods": "GET, POST",
"allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
}
}