我想实现一个用户跟踪系统,经过搜索我意识到我必须在中间件中做到这一点.我遇到的问题是,我只能在中间件中的答案中向响应头添加值.保存它们的信息后,在中间件响应中删除它们.请指导我如何在中间件响应中添加自定义数据,谢谢

为此,我找到了两个在json模式下工作的示例,但是在我想要将用户转移到路由的情况下,我必须使用头.

Json响应的示例代码:

return $response->json([
                    'status' => $status,
                    'code' => $code,
                    'errors' => [$errors],
                ], $status);

推荐答案

我在我的项目中做了完全相同的系统,没有使用头文件,请参见下面的示例

例如: 我们计划在软件中 for each 用户的表现创建一个跟踪系统,以便将其报告存储在系统中.

迁移:

Schema::create('user_trackings', function (Blueprint $table) {
            $table->id();
            $table->boolean('transaction')->default(1);
            $table->string('event');
            $table->string('class');
            $table->longText('request_params')->nullable();
            $table->string('request_method');
            $table->string('request_ip');
            $table->string('request_userAgent');
            $table->longText('params')->nullable();
            $table->foreignId('user_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
            $table->timestamps();
            $table->softDeletes();
        });

♪角色控制器♪

use App\Traits\Response;

class RoleController extends Controller
{
    use Response;

    public function store(Request $request)
    {
        $Validator = Validator::make($request->all(), [
            'display_name' => ['required', 'unique:roles,display_name', 'max:255'],
            'name' => ['required', 'unique:roles,name', 'persian_not_accept', 'max:255'],
            'permissions' => ['nullable', "array","min:1"],
            'permissions.*' => ['nullable', 'exists:permissions,name'],
            'parent' => [new ParentRule('roles,name')]
        ]);
        if ($Validator->fails()) {
            $this->Validation($Validator);
            return back();
        }

        DB::beginTransaction();
        try {
            $Role = Role::create([
                'name' => $request->name,
                'display_name' => $request->display_name
            ]);
            $Role->syncPermissions($request->permissions);
            if($request->parent != 'no-parent'){
                $RoleParent = Role::findByName($request->parent);
                $Role->parent()->associate($RoleParent);
                $Role->save();
            }

            DB::commit();
        } catch (\Exception $e) {
            DB::rollback();
            $this->Error([
                'Permission' => $Role,
                'Exception' => $e->getMessage()
            ]);
        }
        return $this->Success([
            'Permission' => $Role
        ], 'role.index');
    }

}

响应式列车:

trait Response {
    use SweetAlert;

    public function Success($Params = [], $Route = null , $RouteParams = [], $title = null, $message = null){
        $title = is_null($title) ? __('message.response.title.Success') : $title;
        $message = is_null($message) ? __('message.response.message.Success') : $message;

        if($Route){
            return (new RedirectResponse(route($Route, $RouteParams)))->bag(true, $Params);
        }

        return (new HttpResponse)->json(['status' => true, 'message' => $message])->bag(true, $Params);
    }

    public function Error($Params = [], $Route = null , $RouteParams = [], $title = null, $message = null){
        $title = is_null($title) ? __('message.response.title.Error') : $title;
        $message = is_null($message) ? __('message.response.message.Error') : $message;

        if($Route){
            $this->AlertError( $title , $message );
            return (new RedirectResponse(route($Route, $RouteParams)))->bag(false, $Params);
        }

        return (new HttpResponse)->json(['status' => false, 'message' => $message])->bag(false, $Params);
    }

}

提示: 在中间件响应中,您将收到2种类型的响应,它们由2个类组成(Illuminate\Http\Response,Illuminate\Http\RedirectResponse),因此我们必须为此创建2个自定义类并扩展这2个类.

创建自定义响应:

1-1级:

namespace App\Library\Response;

use Illuminate\Http\RedirectResponse as BaseRedirectResponse;

class RedirectResponse extends BaseRedirectResponse {

    public $bag;

    public function bag($Status = null, $Data = null){
        $this->bag = (object) [
            'Status' => $Status,
            'Data' => $Data
        ];
        return $this;
    }
}

2--2级:

namespace App\Library\Response;

use Illuminate\Http\Response;

class HttpResponse extends Response {

    public $bag;

    public function bag($Status = null, $Data = null){
        $this->bag = (object) [
            'Status' => $Status,
            'Data' => $Data
        ];
        return $this;
    }
}

我们创建用户跟踪存储trait

namespace App\Traits;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use App\Models\UserTracking as ModelUserTracking;

trait UserTracking{

    public function Track($Transaction = true, $Params = []){
        DB::beginTransaction();
        try {
            $UserTracking = new ModelUserTracking;
            $UserTracking->transaction = $Transaction;
            $UserTracking->event = Route::currentRouteName();
            $UserTracking->class = Route::currentRouteAction();
            $UserTracking->request_params = json_encode(request()->all());
            $UserTracking->request_method = Route::current()->methods()[0];
            $UserTracking->request_ip = request()->ip();
            $UserTracking->request_userAgent = request()->userAgent();
            if(!empty($Params)): $UserTracking->params = json_encode($Params); endif;
            $UserTracking->User()->associate(Auth::user());
            $UserTracking->save();

            DB::commit();
        } catch (\Exception $e) {
            DB::rollback();

            Log::error("Insert User Tracking Data Error", [
                'UserTracking' => $UserTracking,
                'Exception' => $e->getMessage()
            ]);
        }
    }

}

现在我们开始构建自定义中间件

自定义中间件:

namespace App\Http\Middleware;

use Closure;
use App\Traits\UserTracking as TraitUserTracking;
use Illuminate\Http\Request;

class UserTracking
{
    use TraitUserTracking;
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\App\Library\Response\HttpResponse|\App\Library\Response\RedirectResponse)  $next
     * @return \App\Library\Response\HttpResponse|\App\Library\Response\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);

        if(property_exists($response, 'bag'))
            $this->Track($response->bag->Status, $response->bag->Data);

        return $response;
    }
}

本指南的要点是,您应该创建响应的自定义类,并从(Illuminate\Http\Response,Illuminate\Http\RedirectResponse)类扩展它.有了这个技巧,你可以发送和处理任何你喜欢的值.好运

Php相关问答推荐

如何在Woocommerce中禁用机器人添加到推车?

PHP日期操作,将多个日期输出为格式化字符串

获取要删除的图像的公共ID

从WooCommerce订单状态更改更新用户自定义元数据

这是在可召回的背景下吗?

根据发货类别在WooCommerce产品页面中显示快捷代码

如何使用定制的StateProvider设置JsonLd@上下文?

使用DOMPDF获取PDF格式的本 map 像

更改WooCommerce checkout 中的错误消息以获得不可用的送货方式

强制客户在注册时 Select WooCommerce角色

未检测到laravel控制器

如何在 apache Laragon - laravel 10 中允许方法 DELETE?

如何在laravel中获得两个时间戳之间的小时和分钟差异

如何在 Laravel 中app文件夹之外的文件夹内创建文件路径?

在特征中使用类的属性

向元素添加类时添加循环错误

PHP 简单 XML Xpath 上移树(带有名称的父级)

在 PHP 8.2 中使用 PHP Spreadsheet 和 CodeIgniter 3 导出 Excel 时出错

使用php删除数组中相同数字的所有变体

如何在 WooCommerce 中显示每个自定义选项卡的内容