8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel】可変長配列の要素に対するTrimStringsミドルウェアの無効化方法

Last updated at Posted at 2024-12-13

trim勝手にやってくれて助かる〜!

リクエストパラメータの先頭や末尾に含まれた空白文字を取り除いてくれるTrimStrings。
普段アプリ開発をしている時にはとても便利で助かるmiddlewareですね。

でも 配列の要素を$exceptに指定したはずなのに、改行がtrimされてる! ってなことがありまして...
その備忘録になります。

前提

// dd($request->input('sample'))での出力結果
array:3 [
  0 => "sampleText1"
  1 => "sampleText2"
  2 => "sampleText3"
]

以降は、こんな形式のリクエストパラメータが返ってくるという前提で進みます!
(sampleの配列内の要素数は可変)

$exceptにキー書いたらそれで済む話じゃないの?

もし、返ってくる配列の要素数が固定されているのであれば、$exceptに下記のように指定すればそれで終わりです。

class TrimStrings extends Middleware
{
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
        // 追加部分
        'sample.0',
        'sample.1',
        'sample.2',
        // ここまで
    ];
}

でも今回はsampleの要素数が可変なんだよなぁってことで、ワイルドカード使って指定しちゃおうと思ったわけです。
class TrimStrings extends Middleware
{
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
        // 追加部分
        'sample.*',
        // ここまで
    ];
}

...動かん。
$exceptでワイルドカードが使えないことに初めて気づきました。

解決方法

ってことで、コンストラクタを使って、trimされる前に$exceptを書き換えよう! と書いたコードがこちらです。

class TrimStrings extends Middleware
{
    public function __construct(Request $request)
    {
        $textList = $request->input('sample');

        if(!empty($textList) && is_array($textList)) {
            foreach ($textList as $index => $text) {
                $this->except[] = 'sample.' . $index;
            }
        }
    }
    
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
    ];
}

foreachで配列のインデックス番号を取得して$exceptに追加することで、改行がtrimされないようになりました!やった!

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?