コードロード

エラー討伐

【Laravel】特定のcookieの値の暗号化を解除(Laravel外からもcookieを使用したい)

課題

CookieファサードPHPのfilter_inputで取得できるcookieの値が異なる。 Laravel外からcookieを使用したいが、暗号化されているため使用できない。

<?php

$cookie_key_1 = Cookie::get('cookie_key');
$cookie_key_2 = filter_input(INPUT_COOKIE, 'cookie_key');

原因

\Illuminate\Cookie\Middleware\EncryptCookies このミドルウェアがあるため。

Laravel内でCookieファサードを使用してcookieを設定すると、暗号化された状態になっている。

Cookieファサードを使用してcookieを取得する時は、上記のミドルウェアにより自動で復号されるようになっている。

対策

暗号化されていると都合が悪いケースがあったため、特定のcookieは暗号化の対象外とする。

<?php
// app/Http/Middleware/EncryptCookies.php

class EncryptCookies extends Middleware
{
    protected $except = [
        'cookie_key'
    ];
}

これで、Cookieファサードを使用してcookieを設定、取得しても、暗号化されていない平文を取得できる。

参考

【Laravel5】特定のCookieだけ暗号化を解除する|Laravel|PHP|開発ブログ|株式会社Nextat(ネクスタット)

【Laravel×Apache】413 (payload too large) が出たらphp.iniを変更する

環境

課題

本番環境にて画像をアップロードしようとしたら、 413 Content Too Large のエラーが返ってくる。

解決方法

php.ini で、 upload_max_filesizepost_max_size を確認する。

まず、そもそもどこの php.ini を読み込んでいるかを確認するために、ブラウザで phpinfo() を書いたファイルを表示させる。

「Loaded Configuration File」 という項目が、 php.ini を読み込んでいるパスになっている。

/etc/php.ini の場合も別の場合もある。

そのパスの php.ini を、広げたい容量の最大値に修正する。

// php.ini
<?php

// 修正前
post_max_size = 8M
upload_max_filesize = 2M

// 修正後
post_max_size = 10M
upload_max_filesize = 8M

修正したら、Apacheを再起動。

$ sudo systemctl restart httpd

phpinfo() にて、 「Server API」の箇所がFPM/FastCGIとあればPHP-FPMを介してPHPを実行しているので、php-fpmの再起動も忘れずに。

$ sudo systemctl restart php-fpm

Apache 2.0 Handler みたいにApacheのモジュールであれば、Apacheの再起動のみで良いらしい。

注意点

PHPの公式ドキュメントに下記のようにあるので、一応考慮する。

upload_max_filesize int

アップロードされるファイルの最大サイズ。 post_max_size には、 この値より大きな値を指定しなければいけません。

https://www.php.net/manual/ja/ini.core.php#ini.upload-max-filesize

参考

www.suzu6.net

techtech-note.com

【Laravel】413 (payload too large) が出た時の対処法 - ポッポプログラミング

qiita.com

【Laravel】本番環境で画像アップロードできないときに確認する箇所

課題

本番環境にて、下記のコードでアップロードできなかった。

ブラウザのネットワークタブで確認すると、500エラーとだけ表示される。

<?php

Storage::putFileAs('public/images', $file, $file_name);

Laravelのログを確認

storage/logs/laravel.log にエラー内容が出力されているはず。

[2022-08-14 10:27:40] production.ERROR: fopen(/var/www/プロジェクト名/storage/app/public/images/20220814102740.jpg): Failed to open stream: Permission denied {"userId":1,"exception":"[object] (ErrorException(code: 0): fopen(/var/www/プロジェクト名/storage/app/public/images/20220814102740.jpg): Failed to open stream: Permission denied at /var/www/プロジェクト名/vendor/league/flysystem/src/Adapter/Local.php:157)

権限エラーのよう。

解決方法

権限を付与してあげる。

$ pwd
/var/www/プロジェクト名
$ chmod -R 777 storage/

これで無事アップロードできた。

参考

qiita.com

【Laravel】認証していない場合のリダイレクト先を変更する

app/Http/Middleware/Authenticate.php のリダイレクト先を名前付きルートに変更する。
Sanctumで認証しているが、これでいけた

<?php

    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login'); // <-ここを名前付きルートに変更
        }
    }

公式にも書いてある

Note: 独自の/login エンドポイントを自由に作成できます。ただし、標準のLaravelが提供するセッションベースの認証サービス を使用してユーザーを認証していることを確認する必要があります。通常、これはweb 認証ガードを使用することを意味します。

参考

readouble.com

readouble.com

githubの秘密鍵を指定してgit pullする

こんな感じで .ssh/config に2つ登録したとする

// .ssh/config

Host github.com.first
        HostName github.com
        IdentityFile ~/.ssh/id_rsa_first
        User git

Host github.com.second
        HostName github.com
        IdentityFile ~/.ssh/id_rsa_second
        User git

秘密鍵を指定して git pull したいときはこうする

$ git pull github.com.second:組織名/リポジトリ名

公式ドキュメントにも、ここにオプションを指定しなさいと書いてある

git pull [<options>] [<repository> [<refspec>…]]

参考

qiita.com

git-scm.com

【Laravel×Postman】画像を取得できない(送信できない)時は

LaravelでREST API作成中にハマった。Postmanで動作確認中。

結論

リクエストヘッダーの Content-Type のチェックが外れていないか確認!

値は multipart/form-data; boundary=<calculated when request is sent> となっているはず。

ハマった

こんな感じで、POSTリクエストで、Bodyを form-data にして、ファイルを設定しているのに、Laravel側で取得できなかった。

<?php

dd($request->file('image'));

// 結果:null

Laravel Sanctumを使っていたので、Content-Typeapplication/jsonに指定していた。

色々ググってみて、Content-Typemultipart/form-dataにしてみても効果なし。

リクエストヘッダーを全部確認してみたら、デフォルトのContent-Typeのチェックが外れていて無効になっていた。

値はmultipart/form-dataではなく、デフォルトのmultipart/form-data; boundary=<calculated when request is sent>でないと送信できないよう。

こんな感じだと効果なし。

参考

stackoverflow.com

【Laravel】定数をクラスファイルで管理する

定数をクラスファイルで管理する

app/Consts/CommonConst.php を作成した。

<?php

namespace App\Consts;

class CommonConst {

  const MESSAGE = 'message';

  const RESULT = 'success';

}

config/app.phpエイリアスを追加

<?php

return = [
    // 省略

  'aliases' => [
    // 省略
    'CommonConst' => \App\Consts\CommonConst::class,
  ]
]

app/Http/Controllers/Api/UserController.php で使用する

<?php
    public function index()
    {
        $users = User::where('id', Auth::id())->get();
        return response()->json([CommonConst::MESSAGE => CommonConst::RESULT, 'user_info' => $users]);
    }

参考

qiita.com