20210913のlaravelに関する記事は8件です。

Laravelログイン認証のリダイレクトについて

はじめに  Laravelを使うと簡単にログイン機能を実装できますが、反面、完成されすぎていてカスタマイズするには結構調べないといけません。大した内容ではありませんが、今回はそんな中でもリダイレクトについて備忘録として残して行きたいと思います。 ログインしていないユーザーをリダイレクト  まずは、ログインしていない状態で、あるページにアクセスしようとするとログイン画面にリダイレクトする方法をご紹介します。ログイン前に表示させたくないコントローラーに下記のように書いてください。 HomeController.php public function __construct() { $this->middleware('auth'); }  これだけでOKです。何が起きているのかは正直よく分かりませんが、とにかくこれでログイン画面へリダイレクトされるようになります。認証に関わるものはMiddlewareで定義されています。ちなみに、リダイレクト先を変更する場合もMiddlewareで変更することが出来ます。 App\Http\Middleware\Authenticate.php  protected function redirectTo($request) { if (! $request->expectsJson()) { return route('リダイレクト先'); } }    デフォルトではloginがリダイレクト先になっていますが、自由に変えることが出来ます。 ログアウト後のリダイレクト  認証機能を実装すると当然ログアウト機能も付いてきますが、ログアウトするとLaravelのトップページへリダイレクトされます。これも変更していきたいと思います。こんな感じで書き換えてみましょう。 App\Http\Controllers\Auth\LoginController.php //use AuthenticatesUsers; use AuthenticatesUsers{ logout as doLogout; } public function logout(Request $request){ $this->doLogout($request); return redirect('/home'); }  これで、ログアウトするとhomeへリダイレクトするようになります。loginとするとログイン画面へ遷移します。 まとめ  こんな感じで結構簡単に書き換えることは可能ですが、中身を理解しようとすると結構時間かかると思います・・・。(自分も全然理解できてませんので、もっと勉強していこうと思います。)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】中間テーブルのmigrationファイルを作るときは順番に注意

タイトルの通りですが、何も気にせずmigrationファイルをつらつら作っていたらエラー発生したので、忘れないようにメモです。 前提知識 Laravelのmigrationは作成日順に実行される。今日はとりあえずここさえ覚えてもらえればOKです。 2014_10_12_000000_create_users_table.php 2014_10_12_100000_create_password_resets_table.php 2019_08_19_000000_create_failed_jobs_table.php こんな順番ですね。 さて本題 中間テーブルを作成する時にこのmigrationファイルの実行順番でエラーになりました。 が、よく考えてみれば当たり前の挙動でした。 テーブル構成(例) rolesテーブル role_usersテーブル(中間テーブル) usersテーブル migrationファイルを作る時に起こったこと DB設計書通りの順番でrolesテーブル→role_usersテーブル→usersテーブルと php artisan make:migrationでファイルを作りました。 ファイルの先頭に付く日付は、 rolesテーブル role_usersテーブル(中間テーブル) usersテーブル この順番になりますね。 その後php artisan migrateすると、、、 SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table .... 中間テーブルで落ちました。外部キーの設定かな?と一瞬思いましたが、よく見ると参照できないって言っている。 あ、まだもう一個のテーブルが作られていない! 中間テーブルはこんな構成(例) public function up() { Schema::create('role_users', function (Blueprint $table) { $table->unsignedBigInteger('role_id'); $table->unsignedBigInteger('user_id'); $table->dateTimes(); //外部キー制約 $table->foreign('role_id') ->references('id') ->on('roles') ->onDelete('cascade'); $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade'); // 複合主キー $table->primary(['role_id', 'user_id']); }); } 中間テーブルが外部キーの設定をするため、usersテーブルを参照しにいくが、まだusersテーブルはmigrationが実行されていないため参照できなくてエラーになるというわけですね。 解決方法 解決方法は単純で、中間テーブルを最後に作ればいいだけです。 rolesテーブル usersテーブル role_usersテーブル(中間テーブル) こんな感じですね。 これでエラーにならないはず。 補足 Laravel5.8系からはIDカラムがbigintになっているので、中間テーブル側も合わせて unsignedBigInteger にしないとダメです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel】中間テーブルのmigrationファイルを作るときは順番に注意

タイトルの通りですが、何も気にせずmigrationファイルをつらつら作っていたらエラー発生したので、忘れないようにメモです。 前提知識 Laravelのmigrationは作成日順に実行される。今日はとりあえずここさえ覚えてもらえればOKです。 2014_10_12_000000_create_users_table.php 2014_10_12_100000_create_password_resets_table.php 2019_08_19_000000_create_failed_jobs_table.php こんな順番ですね。 さて本題 中間テーブルを作成する時にこのmigrationファイルの実行順番でエラーになりました。 が、よく考えてみれば当たり前の挙動でした。 テーブル構成(例) rolesテーブル role_usersテーブル(中間テーブル) usersテーブル migrationファイルを作る時に起こったこと DB設計書通りの順番でrolesテーブル→role_usersテーブル→usersテーブルと php artisan make:migrationでファイルを作りました。 ファイルの先頭に付く日付は、 rolesテーブル role_usersテーブル(中間テーブル) usersテーブル この順番になりますね。 その後php artisan migrateすると、、、 SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table .... 中間テーブルで落ちました。外部キーの設定かな?と一瞬思いましたが、よく見ると参照できないって言っている。 あ、まだもう一個のテーブルが作られていない! 中間テーブルはこんな構成(例) public function up() { Schema::create('role_users', function (Blueprint $table) { $table->unsignedBigInteger('role_id'); $table->unsignedBigInteger('user_id'); $table->dateTimes(); //外部キー制約 $table->foreign('role_id') ->references('id') ->on('roles') ->onDelete('cascade'); $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade'); // 複合主キー $table->primary(['role_id', 'user_id']); }); } 中間テーブルが外部キーの設定をするため、usersテーブルを参照しにいくが、まだusersテーブルはmigrationが実行されていないため参照できなくてエラーになるというわけですね。 解決方法 解決方法は単純で、中間テーブルを最後に作ればいいだけです。 rolesテーブル usersテーブル role_usersテーブル(中間テーブル) こんな感じですね。 これでエラーにならないはず。 補足 Laravel5.8系からはIDカラムがbigintになっているので、中間テーブル側も合わせて unsignedBigInteger にしないとダメです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】npmコマンドでエラーが出る方へ

Laravelにてnpmコマンド実行時、エラーが出た時にハマったためメモ。 (4時間格闘しました…) 【結論】 再度Laravelのプロジェクトを作り直したところ、npmコマンドがLaravelプロジェクト内で使用可能になった。 ハマった時の状況 composer create-projectで新規プロジェクト作成 ↓ laravelプロジェクト内でnpmコマンドが使えない ↓ node.jsのインストール ↓ C:直下ではnpmコマンドが使用可能。Laravelプロジェクト内ではnpmコマンドが使えない。 nodeとnpmのバージョンも同一。 ↓ プロジェクトを作り直したところ、npmコマンドがLaravelプロジェクト内で使用可能になった。 まとめ 途中でnode.jsをインストールしたため、Laravelでは使用不可の状態になっていた…? 詳しいところまで説明できずにすみません…。 分かる方、ぜひ教えてくださいませm(__)m 初歩的なことですけど、ハマる方が一人でも減れば…
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのRedisでワイルドカードのパターンに一致するキーを一括削除する

Redisではキーにワイルドカードを使って一括削除するコマンドがありません。 今回はLaravel5.8でRedisのキーをワイルドカードを使って、一括削除する方法を共有します。 一括削除する方法(prefixあり) $keyPattern = 'hogehoge_*'; $keys = array_map(function ($key) { return str_replace(config('database.redis.options.prefix'), '', $key); }, Redis::keys($keyPattern)); if (!empty($keys)) { Redis::del($keys); } 複数のコネクションを使っていてそれぞれprefixが違う場合は、 config('database.redis.options.prefix')の部分を適宜修正してください。 Laravel5.8からはデフォルトでprefixが指定されているので上記のprefixありで実行してください。 prefixを使っていない場合はこちらでもOK Redis::del(Redis::keys('hogehoge_*')); Laravel5.7はデフォルトだとprefixが指定されていないので、こちらでOK。 今回はリリース時の一部キャッシュのクリアでしたので、 php artisan tinkerで上記のコードを実行しました。 参考URL
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

composer installした際、メモリエラーになる場合の対応

docker環境でcomposer installした際、メモリエラーになる場合の対応。 PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 COMPOSER_MEMORY_LIMIT=-1を追加してcomposer installを実行する。 COMPOSER_MEMORY_LIMIT=-1 composer install
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者】Dockerを使用したLaravelをAWSのECR,ECS,Fargateで環境構築するにあたっての学習記録

AWS環境構築について 参考 学習 Dockerとは docker, docker-compose, docker compose, それぞれ何? Dockerfile docker-compose.ymlは何をしているのか。 ECR,ECSについて つまり・・・? context とは 参考 Docker compose ことはじめハンズオン ecsでLaravelのトップページ表示まで 今から追いつくDocker講座!AWS ECSとFargateで目指せコンテナマスター!〜シリーズ1回目〜 自己紹介 組み込みエンジニア ⇨ UnityでMR/VR制作 ⇨ モーショングラフィック等の映像制作。AWS?なにそれ、美味しいの? WEBのフロントエンドは少し、バックエンドはさっぱり。 今回はWEBシステムを構築することになったので、その時に勉強したことをまとめます。 学習 ローカルで作成したLaravel環境をECSにデプロイするにあたって、色んな所を調べてもそれぞれやっている内容や、Dockerfileの中身が違っていたりした為かなり苦戦した。 そのため一つ一つ動きや考え方を再学習したので、ここに記録を残す。 ※初心者がネットを漁ってつけた知識ですので、解釈に齟齬があるかもしれません。間違っていたらご指摘頂けるとありがたいです。 Dockerとは Dockerについては参考のYoutubeが非常にわかりやすかった。 自分が作成したい環境を一発で立ち上げることのできるパソコンを作る仕組みみたいなイメージだと思う。 Docker環境を作成しておけば、それぞれを起動するだけでどこでもアプリケーションが実行可能になる。 docker, docker-compose, docker compose, それぞれ何? それぞれターミナルで実行可能なコマンドだが、人によって使っているものが違う。 docker は Dockerfile に対してごにょごにょする機能。 docker は単一のコンテナに対してしか操作できないため、複数のコンテナを同時に管理できる仕組みが出来た それが docker-compose で docker-compose.yml ファイルを用いて管理する。 そのdocker-compose の機能を docker に互換性を持たして docker-compose と(ほぼ)同等の命令を出せるのが docker compose である。 Dockerfile docker-compose.ymlは何をしているのか。 これらのファイルはそれぞれコンテナのイメージの情報を記載している。 イメージ的にはPCのスペック表みたいなイメージ? FROMで動作する環境を定義し、他でアプリをインストールしたり、環境変数を定義したり、開放するポート番号を定義したり、ボリュームマウントを定義したり... また docker-compose.yml に記載されている image では、他所(指定しなければdocker hubから)イメージを持ってきて即座に環境構築ができる。 ここで持ってくるイメージと、docker compose build で出来るイメージのせいでDockerの動きがうまくイメージできませんでした。(最後のイメージはinterpretationのイメージです。他でも使ってるのでごっちゃなったらすいません。) 例えるなら、誰かが作成したPCを購入し、自分でSSDやRAMを増設したり、GPUを入れ替えて使う、みたいなイメージ。 ECR,ECSについて 詳しい説明は省くが、Docker環境を実行する場所のイメージ。 ローカルでビルドしたイメージデータをECRへプッシュし、ECSでそのデータをデプロイし、Fargateで実行します。 FargateはECSでコンテナを展開するための方式みたいなもので、他にはEC2があります。 ECRが作ったパソコンパーツを置く場所で、ECSはPCを組み立て電源をつくてくれる人で、Fargateは電源見たいなものです(ちょっと無理があるか) ここで大事なのが、ECSは Dockerfile を ビルドして実行してくれるわけですが、DockerHubにあげられているイメージを使用すればECRを介さずにECSでDockerを実行できることです。 例えばWordpressの環境等の出来合いのイメージを記載した Dockerfile をECSで実行すればそのままWordpressの環境が作れます。 逆に言うと、自分が作成したイメージをECRへプッシュしECSでデプロイするには、ECSにイメージの場所を伝えないと行けないんですね。 ECRプッシュコマンド表示では docker を用いてタグ付けしているのがその部分なのですが、 docker-compose を用いた場合は同じやり方では出来ません。 そこで image にそのタグ付けをすることで実行することができます。 image: xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/[リポジトリ]:latest デプロイする時も、ここからイメージを取得し展開してくれます。 これが初めは理解できずに苦労しました。 つまり・・・? ローカルで Docker image を作成 docker, docker-compose, docker compose で build 作成した image を ECR へ push ECS で Dockerfile をビルドして実行 up context とは ファイルをどこで実行するか、見たいなイメージでいいと思う。 例えば上記1,2はローカルで行うが、3はECSで行うのでコンテキストを切り替える必要がある。 また、ymlファイルの build: に度々記載されている context は Dockerfile をどこで実行するかと言うこと。 例えば bild: ./php だと ./php 上で Dockerfile を実行してくれるが、Dockerfile で実行されるパスは ./php がルートになる。 build: cntext: . ockerfile: ./php/Dockerfile だと ./ をルートとして Dockerfile を実行している。 これの何がいいのかと言うと、 Dockerfile では上位のフォルダにアクセスすることができないからです。 COPY ../../app /work # これはNG COPY ./app /work # これはOK Docker単体で動かす場合は -f でDockerファイルを指定してもいいそうです。 終わりに とりあえずこんなところで、なんとなくAWS上でサービスを動かす仕組みがわかってきた気がしました。 巷ではいろんなやり方が書かれているけど具体的な説明は少ない or 分からないで大苦戦・・・ まだネットワーク周りがさっぱり分からないので、その辺りも学習していきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP(Laravel) 空白を含む検索

はじめに 空白区切りで複数の検索をかけれるようにしたい。 【例】 "Ruby PHP JavaScript" → Ruby PHP JavaScript 条件 mac OS "11.2.3 Big Sur" Laravel Framework "6.20.27" PHP "8.0.7" 最終的なコード ControllerとModelに分かれています。 Controllerで使用している関数をModelの方で定義しています。 Controllers/SearchController.php class SearchController extends Controller { public function __construct(Search $search) { $this->search = $search; } public function index(Request $request) { $query = Recipe::query(); // エスケープ処理 $keyword = $this->escape($request->input('keyword')); // 空白区切りで文字列を分割 $keywords = $this->search->pregSplit($keyword); // 検索処理 $recipes = $this->search->searchQuery($query, $keywords); return view('search.index', [ 'recipes' => $recipes, 'keywords' => $keywords, 'searchCount' => $this->search->searchCount($recipes), ]); } /** * 検索欄に文字が入力された際、str_replaceを実行する * @param string $value * @return string $value */ private function escape(string $value = null) { if(!$value) { return $value; } return str_replace( ['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $value ); } } Models/Search.php class Search extends Model { /** * 空白区切りで検索欄に入力された場合 * @param string $keyword * @return Array */ public function pregSplit($keyword) { // 全角空白→半角空白 $keyword = mb_convert_kana( $keyword, "s" ); return preg_split('/[\p{Z}\p{Cc}]++/u', $keyword, -1, PREG_SPLIT_NO_EMPTY); } /** * 検索処理 * @param \Illuminate\Database\Eloquent\Builder $query * @var string[]|false $keywords * @return \Illuminate\Database\Eloquent\Builder $query */ public function searchQuery($query, $keywords = null) { if(!empty($keywords)) { foreach ($keywords as $keyword) { $query->where('title', 'like', "%$keyword%") ->orWhere('cook_time', 'like', "%$keyword%") ->orWhere('ingredients', 'like', "%$keyword%") ->orWhereHas('tags', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealType', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealClass', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }); } } return $query->get()->sortByDesc('created_at') ->load('user', 'stocks', 'tags', 'mealType', 'mealClass'); } /** * 検索ヒット数カウント * @param mixed $recipes * @return int */ public function searchCount($recipes) { return $recipes->count(); } } 各コードの流れ Controllers/SearchController.php class SearchController extends Controller { public function __construct(Search $search) { $this->search = $search; } public function index(Request $request) { $query = Recipe::query(); // ① エスケープ処理 $keyword = $this->escape($request->input('keyword')); // ② 空白区切りで文字列を分割 $keywords = $this->search->pregSplit($keyword); // ③ 検索処理 $recipes = $this->search->searchQuery($query, $keywords); return view('search.index', [ 'recipes' => $recipes, 'keywords' => $keywords, 'searchCount' => $this->search->searchCount($recipes), ]); } /** * 検索欄に文字が入力された際、str_replaceを実行する * @param string $value * @return string $value */ private function escape(string $value = null) { if(!$value) { return $value; } return str_replace( ['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $value ); } } ① エスケープ処理 ① のescape()は下の方に定義してあるように、文字の中に怪しい記号が入っていないかを調べています。 もし指定している記号\\, %, _があれば\\\\, \\%, \\_と置き換えてくれています。 ② 空白区切りで文字列を分割 $keywords = $this->search->pregSplit($keyword); // pregSplit()の内容 /** * 空白区切りで検索欄に入力された場合 * @param string $keyword * @return Array */ public function pregSplit($keyword) { // 全角空白→半角空白 $keyword = mb_convert_kana( $keyword, "s" ); return preg_split('/[\p{Z}\p{Cc}]++/u', $keyword, -1, PREG_SPLIT_NO_EMPTY); } まず、空白区切りが全角であれば半角にしてあげる。 $keyword = mb_convert_kana( $keyword, "s" ); 全て半角区切りにした次に、空白ごとに文字を分割してその値を返す。 preg_split('/[\p{Z}\p{Cc}]++/u', $keyword, -1, PREG_SPLIT_NO_EMPTY); ③ 検索処理 空白処理を行い、単語のみとなったため最後に検索をかけてヒットしたものを表示。 $recipes = $this->search->searchQuery($query, $keywords); // 検索処理 public function searchQuery($query, $keywords = null) { if(!empty($keywords)) { foreach ($keywords as $keyword) { $query->where('title', 'like', "%$keyword%") ->orWhere('cook_time', 'like', "%$keyword%") ->orWhere('ingredients', 'like', "%$keyword%") ->orWhereHas('tags', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealType', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealClass', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }); } } return $query->get()->sortByDesc('created_at') ->load('user', 'stocks', 'tags', 'mealType', 'mealClass'); } おわり 正規表現あたりが今だに慣れないので、少しずつ慣れていきたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む