LaravelでFormの入力データから改行が消える件

はじめに
Laravelで、Formから入力したデータを受け取った時に奇妙な動きをしていた。
テキストエリアで、文頭や文末に入れた改行が消えてしまう。
入力値そのままにDBへ入れようとしていた時に発見。
原因の調査と、対策についてをまとめておく。
原因
まあ、ちゃんとドキュメントに記述がありました。
入力のトリムと正規化
リクエストに応じてすべての受信文字列フィールドを自動的にトリミングし、空の文字列フィールドをnullに変換します。
なるほど。
対策
A. 対象外の項目を指定する
\App\Http\Middleware\TrimStrings::classの中に、$except という変数がある。
この中に、トリミングしたくない入力枠のnameを記入する。
B. ミドルウェアを無効にする
すべての入力内容で、トリミングしないようにしてしまう方法。
laravel/app/Http/Kernel.php にある、\App\Http\Middleware\TrimStrings::classをコメントアウトしてしまう。
※空の時にnullになるのが困る場合は、\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::classも。
mixhostで、複数ドメイン運用かつ、メインドメインのドキュメントルートを変更する

そもそもの問題
mixhostでは、メインドメインのドキュメントルートは、「/public_html」で固定です。
そして、別ドメインを作った場合のドキュメントルートは、「/public_html」にディレクトリを作る形になります。
複数ドメインで運用しようとした時、これだと非常にわかりづらい。
public_html
┣ app
┣ config
┣ database
┣ public
┣ new.domain.site
┃ ┣ app
┃ ┣ config
┃ ┣ database
┃ ┣ public
┃ :
┃ :
┣ .env
:
:
更に、メインドメインも別ドメインもLaravel使いました、なんて場合だと、.htaccessが更にややこしいことになりました。
やりたいこと
public_html
┣ main.domain.site
┃ ┣ app
┃ ┣ config
┃ ┣ database
┃ ┣ public
┃ :
┃ :
┣ new.domain.site
┣ app
┣ config
┣ database
┣ public
:
:
実現方法
「/public_html/.htaccess」を作成し、以下のようにします。
※メインドメインをmain.domain.siteとしていますので、適宜読み替えてください。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} main.domain.site
RewriteCond %{REQUEST_URI} !(^/main.domain.site)
RewriteRule ^(.*)$ main.domain.site/$1 [L]
</IfModule>
- ドメインがmain.domain.siteであり
- main.domain.siteディレクトリ以下でないなら
→main.domain.siteディレクトリ下に飛ばす
という動きになります。
「RewriteCond %{HTTP_HOST} (main.domain.site)」を書く理由
この行がない場合、別ドメイン「new.domain.site」でのアクセス時にも、このルールが適用されてしまいます。
public_html
┣ new.domain.site
┃ ┣ main.domain.site
┃ ┃ ┣ index.html
:
:
みたいになる。
それは困るので、あくまでメインドメインでのみ行うようにするため、記述します。
これに気付くのに時間がかかった。
Laravelに認証機能を導入(Laravel Fortify)

概要
とあるレンタルサーバに、Laravelで作ったWEBアプリをリリースしようとしたら、npmが使えない事態が発生。
Laravel Jetstreamを使っていたので、構築段階でコケる状態になってしまった。
代替手段として、Laravel Fortifyを使ったので、導入方法の備忘録。
コマンド実行
composer require laravel/fortify
php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"
php artisan migrate
config
config/app.phpに、以下を追加します。
App\Providers\FortifyServiceProvider::class,
登録、ログインページの定義
app/Providers/FortifyServiceProvider.phpを編集します。
<?php
// ... 省略 ...
class FortifyServiceProvider extends ServiceProvider
{
// ... 省略 ...
public function boot()
{
// ... 省略 ...
// 登録ページは、resources/views/auth/register.blade.phpを表示する
Fortify::registerView(function () {
return view('auth.register');
});
// ログインページは、resources/views/auth/login.blade.phpを表示する
Fortify::loginView(function () {
return view('auth.login');
});
}
}
view
登録ページ
登録時に必要なのは、「名前(name)」「メールアドレス(email)」「パスワード(password)」「パスワード再入力(password_confirmation)」の4項目です。
それさえあれば良いので、以下だけでも動きます。
<form method="post" action="{{route('register')}}">
@csrf
name:<input type="text" name="name"><br />
mail:<input type="text" name="email"><br />
pass:<input type="password" name="password"><br />
pass:<input type="password" name="password_confirmation"><br />
<button type="submit">登録</button>
</form>
ログインページ
こちらは、「メールアドレス(email)」「パスワード(password)」があれば良いので、更にシンプル。
<form method="post" action="{{route('login')}}">
@csrf
mail:<input type="text" name="email"><br />
pass:<input type="password" name="password"><br />
<button type="submit">ログイン</button>
</form>
動作確認
http://(ドメイン)/registerから登録し、http://(ドメイン)/loginからログインできるかを確認。
備考:ログイン後の遷移先を指定
app/Providers/RouteServiceProvider.phpにある、HOMEの値を変更すればOK。
PHPから、GoogleAnalyticsプロパティ4にイベントを送信する

概要
公式ドキュメント
PHPからAnalyticsにイベントを送信しようとしても、上手く行かずにマハったので備忘録。
コード
// アカウントに関連付く情報
$api_secret = 'xxxxxxxxxx';
$measurement_id = 'yyyyyyyyyy';
// ユーザごとに設定される値
$client_id = '999999.999999';
// 送信したいイベント
$events = [
'name' => 'click',
'param' => [
'id' => 'ABC001',
],
];
$data = [
'client_id' => $client_id,
'events' => $events
];
$data_string = json_encode($data);
$post_url = 'https://www.google-analytics.com/mp/collect?api_secret=' . $api_secret . '&measurement_id=' . $measurement_id;
$ch = curl_init($post_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $post_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($ch, CURLOPT_POST, TRUE);
$result = curl_exec($ch);
【Laravel】バリデーションの前に、パラメータを操作する方法

やりたいこと
Laravelのバリデーションを行う前に、入力値に対して処理を行いたい。
例:半角英数字を入力してもらいたい項目だが、全角で入力された場合でも、半角に変換して受け入れてあげたい。
Request
prepareForValidationを利用することで、実現可能です。
<?php
// ... 省略 ...
class HogeRequest extends FormRequest
{
public function rules()
{
return [
// 必須 英数字 50文字
'key' => ['required', 'alpha_num', 'max:50'],
];
}
public function prepareForValidation() {
$this->merge([
'key' => mb_convert_kana($this->key, 'a'),
]);
}
}
