One minute
Windowsでテキストエリアに入力した改行をLFに変換する
Laravelのバージョンは6です。
Windowsで入力フォームのテキストエリアに改行を入れるとCRLFとなるのですが、Laravelの文字数に関するバリデーションでCRとLFで2文字にカウントされるのをLFに変換して1文字でカウントされるようにする方法です。
調べてみるとFormRequestのvalidationDataをオーバーライドするやり方が見つかったのですが、変換処理は全ての入力に対して行いたいので、基底となるクラスを作成して継承させるか、Traitを作成してuseするか等が考えられます。そうなると現行システムに対して変更するファイルが多くなってしまうのと、そもそもFormRequestを使ってない箇所もあったのでapp/Providers/AppServiceProvider.phpに処理を書いてみました。
class AppServiceProvider extends ServiceProvider
{
private function convertCrlfToLf(&$results, $params, $prevKey = null)
{
foreach ($params as $key => $value) {
if ($prevKey) {
$key = $prevKey . '.' . $key;
}
if (is_array($value)) {
$this->convertCrlfToLf($results, $value, $key);
} else {
$value = preg_replace("/\r\n/", "\n", $value);
data_set($results, $key, $value);
}
}
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// windowsの場合、改行がCRLFで2文字としてカウントされるのでLFに変換する
$results = [];
$this->convertCrlfToLf($results, request()->all());
request()->replace($results);
// 以下省略
項目の多い入力フォーム等で、
<textarea name="foo[bar][baz]"></textarea>
のようにネストした配列にも対応させるため、再帰的に処理できるようにしました。
Read other posts