如何在Laravel的DataFormController与PointController间传递指定数据?
解决Laravel控制器间数据传递的几种方案
方案一:前端中转传递(最直接的交互场景)
两个接口由前端依次触发时,可先调用app/data-form接口拿到目标数据,再在调用campaign/newTransaction接口时,将values、dates、count作为请求参数传递。
前端伪代码示例:
// 先调用getDataForm接口获取数据 fetch('/app/data-form', { method: 'GET', headers: { 'Authorization': 'Bearer ' + token } }) .then(res => res.json()) .then(data => { // 提取需要的三个字段 const { values, dates, count } = data; // 调用newTransaction接口并传递数据 return fetch('/campaign/newTransaction', { method: 'POST', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }, body: JSON.stringify({ values, dates, count }) }); }) .then(res => res.json()) .then(result => { // 处理接口返回结果 });
PointController接收数据:
class PointController extends Controller { public function newTransaction(Request $request){ // 直接从请求中提取数据 $values = $request->input('values'); $dates = $request->input('dates'); $count = $request->input('count'); // 后续业务逻辑处理 return response()->json([ 'status'=>'success', 'msg'=>$data ],200); } }
方案二:提取公共逻辑到服务类(推荐,解耦控制器)
将生成values、dates、count的核心逻辑抽离到独立服务类,让两个控制器通过调用服务类方法获取数据,避免控制器间耦合,实现代码复用。
1. 创建服务类
在app/Services目录下新建DataFormService.php:
<?php namespace App\Services; use Illuminate\Http\Request; class DataFormService { public function getRequiredData(Request $request) { // 原DataFormController中生成values、dates、count的逻辑 $model = $request->model; $uuid = $request->uuid; // 替换为实际生成数据的代码 $values = ...; $dates = ...; $count = ...; return compact('values', 'dates', 'count'); } }
2. 修改DataFormController
class DataFormController extends \App\Http\Controllers\Controller { public function getDataForm(Request $request, \App\Services\DataFormService $service) { $model = $request->model; $uuid = $request->uuid; // 通过服务类获取目标数据 $data = $service->getRequiredData($request); $values = $data['values']; $dates = $data['dates']; $count = $data['count']; // 其他原有逻辑 return response()->json([ 'status' => 'success', 'settings' => $settings, 'form' => $form, 'relations' => $relations, 'values' => $values, 'dates' => $dates, 'actions' => $actions, 'translations' => $translations, 'count' => $count, 'max' => $limitationMax, 'limitReached' => $limitReached ], 200); } }
3. 修改PointController
class PointController extends Controller { public function newTransaction(Request $request, \App\Services\DataFormService $service){ // 调用服务类获取数据(需确保request中包含model、uuid等必要参数) $data = $service->getRequiredData($request); $values = $data['values']; $dates = $data['dates']; $count = $data['count']; // 后续业务逻辑处理 return response()->json([ 'status'=>'success', 'msg'=>$data ],200); } }
方案三:使用会话(Session)传递(仅适用于有状态场景)
注意:auth:api中间件默认无状态,需修改app/Http/Kernel.php的api中间件组,添加StartSession中间件,且两个接口需属于同一用户。
在DataFormController中存储数据到Session:
public function getDataForm(Request $request) { // 生成values、dates、count的逻辑 // 存储到会话 $request->session()->put([ 'df_values' => $values, 'df_dates' => $dates, 'df_count' => $count ]); // 返回原有响应 }
在PointController中从Session读取:
public function newTransaction(Request $request){ // 从会话中获取数据 $values = $request->session()->get('df_values'); $dates = $request->session()->get('df_dates'); $count = $request->session()->get('df_count'); // 可选:读取后删除会话中的数据,避免重复使用 $request->session()->forget(['df_values', 'df_dates', 'df_count']); // 后续业务逻辑处理 }
内容的提问来源于stack exchange,提问作者ARBIND KUMAR
相关产品推荐
相关产品推荐

