Search code examples
laravel-5middleware

How to replace data in middleware on data submitting


In Laravel 5.8 app after submitting form with the data I need to clear data, like doubled spaces, so I created middleware with clearing code :

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);
    }

}

But I see that the submitted data are not cleared. Looks like $request->replace does not work for me.

routes/api.php :

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

Modified : I found article https://dev.to/samolabams/transforming-laravel-request-data-using-middleware-2k7j and reading the article I suppose I have to use cleanData of my middleware, so I commented method I used before and added method :

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();
}

Just to check and replace any value

BuT i got error in log file:

[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))
...

and no message I wrote in \Log::info... Which way is right ?

How to do it correctly ?


Solution

  • I found a decision using method in model for any fields needs clearing:

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

    without middleware and it works for me