如何基于Laravel为电商网站与Android应用搭建共用后端
电商网站与Android应用共用Laravel后端的实现方案
1. 项目基础架构搭建
- 初始化Laravel项目:
composer create-project laravel/laravel e-commerce-backend - 配置
.env文件中的数据库连接信息,确保后端能正常读写数据。 - 采用分层架构:将业务逻辑抽离到
app/Services目录,Model层只负责数据库关联和基础查询,Web控制器与API控制器共用Service层,保证数据处理逻辑完全一致。
2. 路由分离与适配
Laravel原生支持Web路由与API路由分离,分别对应网站和Android应用的请求:
- Web路由(
routes/web.php):处理网站的页面渲染、表单提交等请求,使用Session认证,返回Blade视图或重定向。 - API路由(
routes/api.php):处理Android端的接口请求,返回JSON格式响应,搭配Token认证。示例API路由配置:
use App\Http\Controllers\API\ProductController; use App\Http\Controllers\API\OrderController; Route::middleware('auth:sanctum')->group(function () { Route::get('/products', [ProductController::class, 'index']); Route::post('/orders', [OrderController::class, 'store']); });
3. 双重身份认证配置
针对Web和Android端的不同场景,配置对应的认证方式:
- Web端:直接使用Laravel Breeze或Jetstream快速搭建基于Session的登录、注册流程,满足网站用户的会话管理需求。
- Android端:采用Laravel Sanctum实现Token认证,步骤如下:
- 安装Sanctum:
composer require laravel/sanctum - 发布迁移文件并执行:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"、php artisan migrate - 在
User模型中添加HasApiTokenstrait:
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; }- 配置CORS(
config/cors.php),允许Android应用的域名访问API,开发环境可暂时设置allowed_origins为*。 - Android端登录时,发送POST请求到
/api/login,验证通过后获取Token,后续所有请求在请求头中携带Authorization: Bearer {token}。
- 安装Sanctum:
4. 统一响应与错误处理
为了让Web和Android端都能高效处理响应,统一返回格式并标准化错误处理:
- 创建基类控制器
app/Http/Controllers/BaseController.php,封装成功与错误响应方法:
namespace App\Http\Controllers; use Illuminate\Http\Response; class BaseController extends Controller { public function sendResponse($result, $message) { $response = [ 'status' => 'success', 'data' => $result, 'message' => $message, ]; return response()->json($response, Response::HTTP_OK); } public function sendError($error, $errorMessages = [], $code = Response::HTTP_BAD_REQUEST) { $response = [ 'status' => 'error', 'message' => $error, ]; if(!empty($errorMessages)){ $response['data'] = $errorMessages; } return response()->json($response, $code); } }
- API控制器继承该基类,调用封装好的方法返回响应;Web控制器则根据场景返回视图或带错误信息的重定向。
- 自定义业务异常(如
InsufficientStockException),在app/Exceptions/Handler.php中捕获,针对Web和API请求分别返回适配的错误提示。
5. 业务逻辑复用核心
将所有核心业务逻辑(如商品查询、订单创建、库存扣减)封装到Service类中,Web和API控制器仅作为请求入口,调用对应的Service方法完成业务操作。示例订单创建逻辑:
// app/Services/OrderService.php public function createOrder(array $data, \App\Models\User $user) { // 验证订单数据 $validated = validator($data, [ 'total_amount' => 'required|numeric|min:0.01', 'items' => 'required|array', 'items.*.product_id' => 'required|exists:products,id', 'items.*.quantity' => 'required|integer|min:1', ])->validate(); // 创建订单主记录 $order = \App\Models\Order::create([ 'user_id' => $user->id, 'total_amount' => $validated['total_amount'], 'status' => 'pending', ]); // 添加订单项并扣减库存 foreach ($validated['items'] as $item) { $order->items()->create($item); \App\Models\Product::where('id', $item['product_id']) ->decrement('stock', $item['quantity']); } return $order; }
Web端的OrderController和API端的API\OrderController都调用这个方法,确保两端的订单逻辑完全一致,避免重复代码。
6. 测试与优化
- Web端:直接访问对应路由,验证页面渲染、表单提交、业务流程是否正常。
- Android端:用Postman或Retrofit测试API接口,验证Token有效性、响应格式、业务逻辑正确性。
- 后续可根据需求添加缓存(如商品列表缓存)、队列(如订单异步通知)等优化措施,提升后端性能。
内容的提问来源于stack exchange,提问作者PAWAN BISHT
相关产品推荐
相关产品推荐

