【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_filesize
と post_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
参考
【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/
これで無事アップロードできた。
参考
【Laravel】認証していない場合のリダイレクト先を変更する
app/Http/Middleware/Authenticate.php
のリダイレクト先を名前付きルートに変更する。
Sanctumで認証しているが、これでいけた
<?php protected function redirectTo($request) { if (! $request->expectsJson()) { return route('login'); // <-ここを名前付きルートに変更 } }
公式にも書いてある
Note: 独自の
/login
エンドポイントを自由に作成できます。ただし、標準のLaravelが提供するセッションベースの認証サービス を使用してユーザーを認証していることを確認する必要があります。通常、これはweb
認証ガードを使用することを意味します。
参考
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>…]]
参考
【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-Type
を application/json
に指定していた。
色々ググってみて、Content-Type
を multipart/form-data
にしてみても効果なし。
リクエストヘッダーを全部確認してみたら、デフォルトのContent-Type
のチェックが外れていて無効になっていた。
値はmultipart/form-data
ではなく、デフォルトのmultipart/form-data; boundary=<calculated when request is sent>
でないと送信できないよう。
こんな感じだと効果なし。
参考
【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]); }