2021/03/08

Laravel では Auth や Jetstream で認証機能を実装できますが、マルチログインは結構面倒です。

例えば未認証のリダイレクト処理はミドルウェアの Authenticate->redirectTo() で処理していますが、シングルログイン(user)の記述です。

Authenticate のデフォルト設定

app/Http/Middleware/Authenticate.php


    protected function redirectTo($request)
    {
        if (!$request->expectsJson()) {
            return route('login');
        }
    }

ここで user、admin 2つのマルチドメイン認証で「/user/xxx」「/admin/xxx」にアクセスしたとき、上記のルーティングでは「/login」にリダイレクトされてしまいます。

また「/login」でなく「/user/login」「/admin/login」でルーティングすると当然ながら Routing エラーになります。


Symfony\Component\Routing\Exception\RouteNotFoundException
Route [login] not defined.

Authenticate の修正

2つの認証「user」「admin」が未承認時、「/user/login」「/admin/login」 にリダイレクトするよう修正します。今回は直接「user」「admin」と直接設定しましたが、ループ処理は guard の設定と連携してもよいかと思います。


    protected function redirectTo($request)
    {
        if (!$request->expectsJson()) {
            foreach (['user', 'admin'] as $user) {
                if ($request->routeIs("{$user}.*)) {
                    return route("{$user}.login");
                }
            }
        }
    }

また、認証処理を user、admin の各コントローラーのコンストラクタやサービスなどで認証する場合は、 Authenticate->redirectTo() は無効にする必要があります。

  2021/03/05

Redis インストール

brew コマンドで redis をインストールします。


$ brew update
$ brew install redis

brew で redis サーバを起動します。


$ brew services start redis

redis サーバが起動しているか確認します。


$ brew services list
Name          Status  User Plist
mysql         started yoo  /Users/yoo/Library/LaunchAgents/homebrew.mxcl.mysql.plist
php@7.4       started yoo  /Users/yoo/Library/LaunchAgents/homebrew.mxcl.php@7.4.plist
postgresql@12 started yoo  /Users/yoo/Library/LaunchAgents/homebrew.mxcl.postgresql@12.plist
redis         started yoo  /Users/yoo/Library/LaunchAgents/homebrew.mxcl.redis.plist

redis-cli の確認

Redis クライアントでログインし、Redis コマンドで操作してみます。

redis-cli ログイン


$ redis-cli

データ登録


127.0.0.1:6379> set mykey "hello"
OK

データ取得


127.0.0.1:6379> get mykey
127.0.0.1:6379> keys *
1) "mykey"

全データ取得


127.0.0.1:6379> keys *
(empty array)

データ削除


127.0.0.1:6379> del mykey
(integer) 1

ログアウト


127.0.0.1:6379> exit

phpredis のインストールと設定

macOS の PHP で Redis を利用するには、PECL で Redis をインストールと設定する必要があります。


$ pecl install redis

php.ini で redis.so を読み込む

php.ini ファイルをパスを確認します。 以下は /usr/local/etc/php/7.4/php.ini になっていますが、各環境で確認してください。


$ php -r "echo phpinfo();" | grep "php.ini"
Configuration File (php.ini) Path => /usr/local/etc/php/7.4
Loaded Configuration File => /usr/local/etc/php/7.4/php.ini

確認した php.ini を修正し redis.so を読み込むよう設定します。


extension="redis.so"

PHP 再起動

PHP を再起動します。以下は php@7.4 をインストールして有効にしている場合です。 (インストールしているパッケージにあわせてください)


$ brew services restart php@7.4

$ php -i | grep Redis

  2021/03/03

以前は、jQuery や JavaScript でスムーズスクロールをいろいろ実装していましたが、CSS3 で1行書くだけで対応可能です。


html{
    scroll-behavior: smooth;
}

ただ 2021/02 時点で IE はもとより Safari に対応していないので、実際には JavaScript での記述も必要になります。

  2021/02/24

EC-CUBE4 で Gmail の smtp の設定方法は、.env の MAILER_URL に記述します。

前提として、Googleセキュリティでの2段階認証が必要になります。

  • smtp: smtp.gmail.com
  • port: 465
  • encryption: ssl
  • auth_mode: login
  • username: Gmail アカウント(Gmail アドレス)
  • password: Google セキュリティの2段階認証で作成したパスワード(Gmail アカウントのパスワードではありません)

EC-CUBE の.env

EC-CUBE4 から Swift Mailer を利用しますが、smtpプロトコルの URLをパラメータ方式で設定します。


MAILER_URL=smtp://smtp.gmail.com:465?encryption=ssl&auth_mode=login&username=xxxxx@gmail.com&password=xxxxxx

  2021/02/02

amazon-linux-extras とは

AWS EC2 の AMI(マシンイメージ) で Amazon Linux 2 を選択してサーバ構築すると amazon-linux-extras コマンドが利用できます。

amazon-linux-extras は Amazon Linux 用のパッケージツールで、主要なソフトウェアをまとめてインストールできます。
ただし、amazon-linux-extras パッケージに含まれないソフトウェアは別途インストールする必要があります。

amazon-linux-extras のコマンドは単純で、以下の4つのコマンドが用意されています。

  • help:ヘルプ
  • info:パッケージ詳細
  • install:パッケージインストール
  • list:パッケージ一覧

トピック一覧確認

amazon-linux-extras でトピック一覧(パッケージ情報)を確認できます。 amazon-linux-extras list でも同様の動作をします。


$ amazon-linux-extras
...
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
...
 42  php7.4=latest            enabled      [ =stable ]
...

数字の次にの項目が amazon-linux-extras のトピック名(パッケージ名)です。実際にインストールする Linux のパッケージ名とは違うので注意が必要です。

available はインストール可能な状態、enabled は実際にインストールされた状態です。

パッケージの詳細を確認

また、amazon-linux-extras info でパッケージ内容を確認できます。例えば、php7.4 のパッケージを確認してみます。


$ amazon-linux-extras info php7.4
php7.4 recommends php-cli                    # yum install php-cli
php7.4 recommends php-pdo                    # yum install php-pdo
php7.4 recommends php-fpm                    # yum install php-fpm
php7.4 recommends php-json                   # yum install php-json
php7.4 recommends php-mysqlnd                # yum install php-mysqlnd

Amazon Linux 2 の Linux のディストリビューションは RHEL7 / CentOS7 を採用しています。よって、実際のパッケージインストールコマンドは yum install が実行されます。

amazon-linux-extras でインストール

amazon-linux-extras install でパッケージを管理者権限でインストールします。


$ sudo amazon-linux-extras install トピック名

トピック名 php7.4 をインストールする例です。


$ sudo amazon-linux-extras install php7.4

パッケージを無効にする

ヘルプにはありませんが amazon-linux-extras disable でパッケージの動作を無効にすることもできます。


$ sudo amazon-linux-extras disable トピック名

実際にパッケージが削除されるわけでなく yum remove などで削除すると、パッケージ依存の問題が発生する可能性があるので注意が必要です。

amazon-linux-extras はよく利用するパッケージのインストールを少しだけ楽にしてくれるツールであることがわかりました。

  2021/01/26

UNIQUE(重複)を含むデータの更新で、FormRequest や Validate で単純に unique を設定してしまうと、自分自身を更新できません。

code がユニークの場合

以下は、FormRequest の rulde() で items.code を UNIQUE 制約している例です。

配列の場合


'code' => ['required', 'string', 'unique:items'],

パイプの場合


'code' => 'required|string|unique:items',

この設定だと SQL の WHERE で更新しようとしてしまいます。


WHERE code = 'xxxx';

id を除外して code をユニークにする

よって items テーブルのプライマリーキー items.id を除外して更新するのがよいでしょう。

配列の場合


'code' => ['required', 'string', Rule::unique('items')->ignore($this->id)],

パイプの場合


'code' => "required|string|unique:items,code,{$this->id},id",

SQL の WHERE は以下のようになります。


WHERE code = 'xxxx' AND id <> 'xxxx'

  2021/01/15

Laravelでは、csrf フォーム画面で放置した場合、セッションが異なる Token エラーで Page Expired ページが表示されるようになっています。

App\Exceptions\Handler 

Laravel ではエラーが発生すると、App\Exceptions\Handler が実行され最終的に render() でエラー画面を表示します。ExceptionHandler の詳細に関しては Laravel 8.x エラー処理 を参考にしてください。

ただ、フォーム有効期限切れで Page Expired ページを表示するのは、UI/UX 的に好ましくないのでリダイレクトしてみます。

App\Exceptions\Handler の render() で処理を振り分けてダイレクトしますが、今回は Tokenエラー TokenMismatchException クラスを判別します。


    public function render($request, Throwable $exception)
    {
        $class = get_class($exception);
        if ($class == 'Illuminate\Session\TokenMismatchException') {
            return back()->withInput();
        }
        return parent::render($request, $exception);
    }

フォームリクエストの場合は、 back()->withInput() で前の画面にリダイレクトするとよいでしょう。

またログインセッションの場合は Exception で振り分けず、Authenticate ミドルウェアなどで処理した方がわかりやすいでしょう。

  2020/12/28

ログのクリア

Laravel のログファイルをクリアします。

デフォルトでは storage/logs/laravel.log に記載されています。

echo で削除

ターミナルで Laravel プロジェクトのホームに移動し、echo で空にします。


% echo "" > storage/logs/laravel.log

truncate で削除

Mac の場合 truncate が入っていないので、Homebrew でインストールします。


% brew install truncate

truncate でログをクリアします。


% truncate -s 0 storage/logs/laravel.log

ログを日付ごとローテーション

ログの設定は、.env ファイルで簡単に設定できます。 デフォルトでは stack (複数のログチャンネルを一つのログチャンネルへ集結)になっています。


LOG_CHANNEL=daily

config/logging.php でも設定が可能で、デフォルトの設定は stack になっています。


'default' => env('LOG_CHANNEL', 'stack'),

利用可能なチャンネルドライバ

Laravel のログ設定に関しては公式を参考にしてください

参考)Laravel 7.x ログ

  • stack: 「マルチチャンネル」チャンネルを作成するためのラッパー機能
  • single: シングルファイル/パスベースのロガーチャンネル(StreamHandler)
  • daily: RotatingFileHandlerベースの毎日ファイルを切り替えるMonologドライバ
  • slack: SlackWebhookHandlerベースのMonologドライバ
  • syslog: SyslogHandlerベースのMonologドライバ
  • errorlog: ErrorLogHandlerベースのMonologドライバ
  • monolog サポートしているMonologハンドラをどれでも使用できる、Monologファクトリドライバ
  • custom チャンネルを生成するため、指定したファクトリを呼び出すドライバ

ログの保存日数を設定

ログファイルが増えた時にローテートしますが、config/logging.php でログの保存日数を指定できます。

cron などでログローテートする場合、パーミッションも設定しておきます。


'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 7,
            'permission' => 0666,
        ],

  2020/12/24

brew upgrade をしてしまい、PHP8.0 にアップグレードしてしまいました。

Homebrew でインストール済みの PHP バージョンを確認します。


% brew search php      
==> Formulae
brew-php-switcher   php-cs-fixer        php@7.4             phpmyadmin ✔
php ✔               php@7.2             phplint             phpstan
php-code-sniffer    php@7.3 ✔           phpmd               phpunit

PHP7.4 をインストールしていなかったのでインストールします。


% brew install php@7.4

パスを通す

PHP7.4 のパスを通します。 Zsh を利用しているので .zshrc にパスを記述します。(Bash 利用の人は .bashrc)


export PATH="/usr/local/opt/php@7.4/sbin:$PATH"
export PATH="/usr/local/opt/php@7.4/bin:$PATH"

brew services で PHP7.4 を有効にする

brew services で PHP7.4 を再起動して有効にします。


% brew services start php@7.4

ターミナルを再起動してバージョン確認

ターミナルを再起動して、PHP のバージョンを確認します。


% php -v
PHP 7.4.13 (cli) (built: Nov 30 2020 14:57:43) ( NTS )

  2020/12/12

zsh の切り替え


$ chsh -s /bin/zsh

ターミナルで再ログインして zsh が利用できることを確認します。

zsh になると、ターミナルのニュー力モードで「$」から「%」に変わります。


% cd

起動スクリプトの移行

zsh の関連ファイルが作成されているので、bash で登録していた自分の設定は再度移行しておきましょう。


% ls -al |grep '.zsh*'
-rw-------    1 yoo   staff        245 12 12 13:49 .zsh_history
drwx------    5 yoo   staff        160 12 12 13:49 .zsh_sessions
-rw-r--r--    1 yoo   staff        198  9 25  2019 .zshrc
bash zsh
~/.bash_profile ~/.zprofile
~/.bashrc ~/.zshrc
~/.bash_profile ~/.zprofile
~/.bash_logout ~/.zlogout

.bash_profile の bash 処理は無効

自分の場合 .bash_profile にカスタマイズ設定を記述していたので、.zprofile にコピーしました。


% cp .bash_proile .

当然ながら bash に関する処理は動作しないないので、書き換えないし無効にします。

自分の場合、GCP CLI や AWS CLI の bashスクリプトが動作しているので、これらは手動で書き換えました。

GCP CLI の例


# The next line updates PATH for the Google Cloud SDK.
if [ -f '/Users/yoo/gcp/google-cloud-sdk/path.zsh.inc' ]; then . '/Users/yoo/gcp/google-cloud-sdk/path.zsh.inc'; fi

# The next line enables shell command completion for gcloud.
if [ -f '/Users/yoo/gcp/google-cloud-sdk/completion.zsh.inc' ]; then . '/Users/yoo/gcp/google-cloud-sdk/completion.zsh.inc'; fi

AWS CLI の例

AWS:コマンド補完」参照


% autoload bashcompinit && bashcompinit
% complete -C '/usr/local/aws/bin/aws_completer' aws

Homebrew

Homebrew のアップデートをしたら、Cask の shallow clone のエラーになりました。


 % brew update
Error: homebrew-core is a shallow clone. To `brew update` first run:
...

その前に Big sur にしたので Xcode もアップデートする必要があります。よって Homebrew を 1からインストールして Xcode command line ツールをインストールします。。


% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

この辺は、Xcode を最初にアップグレードしてもよいかと思います。/p>

brew update で Git コマンドで解消してくださいと、警告が出ていたのでこれを実行します。


% git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask" fetch --unshallow

完了したら brew を update & upgrade します。


 % brew update
 % brew upgrade
<< Top < Prev Next > Last >>
マルチログインで未認証のリダイレクト
Homebrew で Redis をインストール
CSS だけでスムーズスクロール
EC-CUBE4 で Gmail の smtp を利用する
Amazon Linux 2 の amazon-linux-extras とは
UNIQUE カラムのバリデーションで自分自身を除外して更新
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証
Mac に AWS Client を設定する
Laravel7 リリース
v-html でHTML表示する
Laravel で Nuxt.js を使ってみる(Docker環境)
Laravel で Vue コンポーネントを使う
いちから始める Docker -コンテナをビルド- (2020年)