【问题标题】:How to replace data in middleware on data submitting如何在数据提交时替换中间件中的数据
【发布时间】:2019-12-23 13:22:33
【问题描述】:

在 Laravel 5.8 应用程序中提交带有数据的表单后,我需要清除数据,比如双倍空格,所以我创建了中间件 有清除代码:

app/Http/Middleware/WorkTextString.php:

<?php

namespace App\Http\Middleware;

use Closure;
use App\Http\Traits\funcsTrait;
use function PHPSTORM_META\type;

class WorkTextString
{

    use funcsTrait;
    public function handle($request, Closure $next, $strip_tags_excluding= false )
    {
        $inputDataArray = $request->all();

        \Log::info($request->all());


        $stripTagsExcludingArray= $this->pregSplit('/ /',$strip_tags_excluding);
        foreach( $inputDataArray as $next_field_name=>$next_field_value ) {
            if ( !empty($next_field_value) and is_string($next_field_value) ) {
                $skip_strip_tags= in_array($next_field_name,$stripTagsExcludingArray);
                $inputDataArray[$next_field_name] = $this->workTextString($next_field_value, $skip_strip_tags);
            }
        }

        \Log::info('$inputDataArray:: ::');  // I CHECK AND SEE CLEARED DATA!
        \Log::info($inputDataArray);

        $request->replace($inputDataArray); // THAT DOWS NOT WORK ?

        return $next($request);
    }

}

但是我看到提交的数据没有被清除。看起来$request-&gt;replace 不适合我。

路由/api.php:

Route::resource('skills', 'API\Admin\SkillController')->middleware('WorkTextString'); 

修改: 我找到了文章https://dev.to/samolabams/transforming-laravel-request-data-using-middleware-2k7j 并阅读文章我想我必须使用我的中间件的 cleanData,所以我评论了我之前使用的方法并添加了 方法:

private function cleanData(array $data)
{
    \Log::info('$data:: ::');
    \Log::info($data);
    return collect($data)->map(function ($value, $key) {
        \Log::info('$value:: ::');
        \Log::info($value);
        $value= 'Some text ';
           return $value;
    })->all();
}

只是为了检查和替换任何值

但是我在日志文件中有错误:

[2019-12-24 12:40:48] local.ERROR: Function name must be a string {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Function name must be a string at /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:164)
[stacktrace]
#0 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#1 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/tymon/jwt-auth/src/Http/Middleware/Authenticate.php(32): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#2 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Tymon\\JWTAuth\\Http\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#3 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#4 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#5 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#6 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#7 /mnt/_work_sdb8/wwwroot/lar/CTasksRestAPI/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(58): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
...

我在 \Log::info 中没有写任何消息... 哪种方式是对的?

如何正确操作?

【问题讨论】:

  • 试试$request-&gt;merge方法
  • 我试过 $request->merge($inputDataArray);返回 $next($request);并再次提交 - 我的数据清除不适用
  • 请看修改
  • 谁替换了中间件中提交的数据,请指点一下你用的是什么方法?
  • 您必须使用更新的数据调用合并。像这样的东西:$inputDataArrayWithoutTags = removeUnwantedTags($inputDataArray);$request-&gt;merge($inputDataArrayWithoutTags);return $next($request);

标签: laravel-5 middleware


【解决方案1】:

我发现在模型中使用方法的决定需要清除的任何字段:

public function setNameAttribute($value)
{
    $this->attributes['name'] = $this->workTextString($value);
}

没有中间件,它对我有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多