Ikeda's Blog

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'),
        ]);
    }
}

JavaScriptで、MarkdownをHTMLに変換する

やること

テキストエリアに入力したMarkdown形式の文字列を、HTMLに変換する。

使用するライブラリ

markedjs

使い方

1. ライブラリを読み込む

CDNにJSファイルを置いてくださっているので、利用させて頂く。

<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>

2. 変換

変換自体は、marked.parse()でできてしまう。
後は、必要に応じたオプションを設定するくらい。

const before = '# 変換前';
const after = marked.parse(before);
console.log(after); // <h1>変換前</h1>

使用例

▼ Markdown入力欄<br />
<textarea id="demo_markdown_before"></textarea><br />
<input type="button" id="demo_markdown_parse" value="Markdown変換" /><br />
▼ 変換後<br />
<textarea id="demo_markdown_after"></textarea>
                    
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
    $(document)
        .on('click', '#demo_markdown_parse', function(){
            // オプション:文中の改行をbrタグに変換する
            marked.setOptions({breaks : true});

            // テキストエリアに入力されたMarkdown形式の内容をHTMLに変換
            const after = marked.parse($('#demo_markdown_before').val());

            // 変換したHTMLを、変換後テキストエリアに出力
            $('#demo_markdown_after').val(after);
        })
    ;
</script>