Closed12

さくらレンタルサーバ にLaravelのお問い合わせフォームを設置する

plaincode_jpplaincode_jp

環境

本番環境

  • さくらのレンタルサーバ スタンダード
  • Laravel v8.20.1
  • PHP7.4.10

開発環境

  • mac + docker + Laravel sail
  • Laravel v8.20.1
  • PHP v7.4.13

要件

  • お問い合わせフォームのURLは、https://xxxxx.com/contact として、contact配下のみでLaravelを実行する
  • フォームは、入力+確認+完了の一般的なもの
  • google reCaptcha でbotスパム対策する
  • デザインはLaravel UIをベースにする
  • ユニットテスト
  • さくらへのデプロイは、Github Actionsで自動化
  • サンプル送付希望の場合、住所入力を必須にするvalidation
  • 郵便番号から住所補完機能
  • レスポンシブ表示
plaincode_jpplaincode_jp

本番:さくらレンタルサーバ にLaravel環境を設置

ローカルで

  • githubリポジトリにローカルのソースコードをpush

さくらサーバで

  • githubとさくらが通信できるようにSSHkeyを登録
  • さくら上で、リポジトリをclone

https://pointsandlines.jp/server-infra/sakura-github

  • gitconfigでユーザ名、メアドを設定
  • コミット、pushできることを確認する
  • composer をインストール
  • composer を実行し、Laravelのvendorディレクトリ をダウンロード
  • .httaccess 編集
  • .env の作成
  • '/contact' にシンボリックリンク設置
  • Laravelの表示確認

https://mike-neko.github.io/blog/laravel-sakura/

plaincode_jpplaincode_jp

github actions でローカルから本番さくらサーバへ自動デプロイ

plaincode_jpplaincode_jp

ローカル環境にLivewireをインストール

./vendor/bin/sail composer require livewire/livewire

お問い合わせフォームの入力、確認、完了画面の各Livewireコンポーネントを作成

./vendor/bin/sail php artisan make:livewire Input
./vendor/bin/sail php artisan make:livewire Confirm
./vendor/bin/sail php artisan make:livewire Complete

https://readouble.com/livewire/2.x/ja/making-components.html

plaincode_jpplaincode_jp

キャッシュクリア

./vendor/bin/sail php artisan cache:clear
./vendor/bin/sail php artisan config:clear
./vendor/bin/sail php artisan config:cache
plaincode_jpplaincode_jp

checkbox のバリデーションがめんどくさい問題

check選択して、外すと、↓のようにfalseが残り、これがvalidationの邪魔をしてしまう。
選択したものだけ、[ key => value ] だけ保持して、submitさせたい。

対応

Livewireのライフサイクルフックで、checkbox 配列の値がfalseのとき、filterする。

    public function updatedPosts()
    {
        $this->posts['request'] = array_filter(
            $this->posts['request'],
            function($value) {
                return $value !== false;
            }
        );
    }

↑の修正。$postsプロパティが更新されたら、毎回実行されてしまって、
$this->posts['request'] が定義されていない、エラーが出るので、以下に修正。

updatedPostsRequest() のようにしたいが、うまく動かなかった。

public function updatedPosts()
    {
        if(!empty($this->posts['request'])) {
            $this->posts['request'] = array_filter(
                $this->posts['request'],
                function($value) {
                    return $value !== false;
                }
            );
        }
    }

https://readouble.com/livewire/2.x/ja/lifecycle-hooks.html

このスクラップは2021/03/12にクローズされました