20201027のlaravelに関する記事は10件です。

Youtuberヒカキンさんのじゃんけんを統計したWebアプリを開発してみた!

なぜ作ったのか?

国民的アニメのじゃんけんを集めたデータで機械学習でそのじゃんけんに勝てるプログラムを作っていたのが始まりです。
で、プログラムを作って満足はしたんですが、今度は違う題材で機械学習プログラム作ってみようと思いました。
それでじゃんけんって言ったら他に誰が人気かって言うと真っ先に思い浮かんだのは子供達に大人気のYoutuberである「ヒカキンさん」と考えました。
なので、HikakinTVでヒカキンさんがじゃんけんをし始めた2014年11月からの動画を視聴し続けて結果を記録していきました。

現状、機械学習するまでは至ってはいませんが、他にヒカキンさんのじゃんけん記録している人って探した限りいませんでした。
それならば!自分がヒカキンさんのじゃんけんの第一人者になっても良いんじゃないかって思ったので、突発的にフレームワークの勉強しながら統計したWebサイトを作成してみました

またヒカキンさんを選んだ理由として他にはこんな理由があります。

  • テレビとは違ってYoutubeに投稿されているので、投稿者が消去しなければ半永久的に全ての動画が存在するので記録しやすい

  • ヒカキンさんのじゃんけんはゲストと一緒にしたり変装や特殊な環境下が多かったりするので、じゃんけんでも様々なバリエーションがあって面白そう

  • ヒカキンさんは子供にも人気あるので、もしかしたら子供達も大勢みてくれるサイトになるかも!?という甘い願望

環境・ツール

開発PC:MacBook Pro macOS High Sierra 10.13.6
フレームワーク:Laravel
サーバサイドプログラム言語:PHP
フロントエンドプログラム言語:Javascript,scss
データベース:MySQL
ライブラリ:Webpack
運用サーバ:さくらVPS(Webサーバ,DBサーバの2つ) CentOS7.8

サイトマップやワイヤーフレームなどはなく作成しながらデザインを決め、テーブル設計もボロが出てしまっていると思います。
制作時間はわかりませんが、期間は大体3ヶ月近くかかりました。

成果物

URL:https://hikakinjunken.tk/
PC向けとして公開しています。
スマホでもみれますが、やや文字が小さくタップしにくいかと思います。

サイトについて紹介している動画
Youtube:https://www.youtube.com/watch?v=aOOWyjU3kLc
ニコニコ:https://www.nicovideo.jp/watch/sm37629624

GitHub:後日公開予定...

トップページ

トップページにアクセスすると、
左側は累計のじゃんけん数とそのグー・パー・チョキの内訳、
右側は最近投稿した動画でじゃんけんした動画5選表示されます。
- 「結果↓」をクリックするとじゃんけんの結果が表示されます。
- サムネイルまたはタイトルをクリックすると動画視聴ページに移行します。
image.png

キーワード検索

動画のタイトルと参戦したゲストに一致するワードを検索します。

ゲスト検索

じゃんけんに一緒に行ったゲストをプルダウンメニューから検索します。
image.png

じゃんけん一覧

年月ごとにHikakinTV内でアップロードされた動画を検索します。
image.png

検索ページ

キーワード検索とゲスト検索で検索すると、以下のように条件にあった動画が検索されてじゃんけん結果も確認できます。
- 例として、ゲスト検索で「はじめしゃちょー」を選んだときの結果です。
- 動画の投稿順やじゃんけんで出した手を決めて詳細に検索することも可能です。

image.png

動画視聴ページ

動画のサムネイルかタイトルをクリックすると、動画視聴ページに移行できます。
このページでYoutubeに行かなくてもHikakinTVに投稿された動画を視聴できます。(怒られるかもしれない)
- 「タグ一覧」では、最大5つ動画に関連したタグを登録することができ、「キーワード検索」で登録したタグのワードで検索するとその動画が出てきます。(ニコニコ動画のタグ機能に似ている)
image.png

じゃんけん結果管理ページ

これは、私(管理者)しかアクセスできないページですが、ヒカキンさんの投稿動画とじゃんけん結果を登録・管理するページを作成しています。
このページのフォームに動画情報とじゃんけん結果、参戦したゲストを記載して登録することでMySQL側のデータベースに情報がInsertされます。
image.png

 反省点

  • 最初にサイトマップや要件を洗い出して作った方が良かった

Laravelで作ろうとは考えていましたが、環境を整えていたりコーディングしている間にも必要なライブラリが欲しかったり、こういう機能も入れた方が良いみたいな考えが出てきて寄り道することが多かった

  • テーブル設計も考えて作るべきであった

ER図は作成したが第3正規化までのことをしていなかったので、もっとデータベースのテーブルはよく考えて作るべきだった

  • 現状は単にじゃんけん結果を見るだけのサイトになってしまっている

じゃんけんの結果見るだけの需要でしかなく、サイトに満足して?使ってもらえるようにはしていないです。
機械学習でじゃんけんの結果を予測するページを作ったり、動画視聴ページでコメントできる機能を盛り込んで見ようかなとは考えています。

まとめ

フレームワークを使ってオリジナルのアプリ開発するのは初めてに近い感じでしたので、色々と不備はあるかもしれないがある程度形にできたサイトになったのは良かったです。
自分がサボらなければ、ヒカキンさんが動画投稿したらじゃんけん結果を確認して、サイトに記録する...みたいなことを続けていきたいとは思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのEloquentでポリモーフィック関連

ポリモーフィック関連とは

あるエンティティが複数のテーブルを参照しているような状態のこと。
アンチパターンにもあるとおり基本的に使用しない最後の手段的なイメージだが使った方が便利なケースもある。今回は使っても良さそうなケースに当てはまって触ってみたのでその備忘録。

要件

コンテンツ→設定一覧→記録一覧(ポリモーフィック )→記録詳細のよう繋げ方をしたい。
ポリモーフィック関連にしない場合には例えばあんまり好ましくないけれど絶対に上限が決まっている場合には、それぞれのテーブルの外部キー用のカラムを作成してsettingテーブルに持たせるとか、テーブルを増やして対応するとかになると思う。

登場テーブル一覧

  • contents
  • settings
  • setting_measurables
  • measure_a_recordings
  • measure_a_records
  • measure_b_recordings
  • measure_b_records
  • measure_c_recordings
  • measure_c_records

リレーションのイメージ
ポリモーフィック .png

マイグレーション

ポリモーフィック関連に使用するテーブル(setting_measurables)のマイグレーションに関してだけ書く。ポリモーフィック関連を使用する場合マイグレーションの段階でmorphを使うど便利、リレーションに必要なカラムを指定したキーワードから作成してくれる。マイグレーションファイルを見たときにポリモーフィック関連を使用することが明示的にわかるので便利。

create_setting_measurables_table.php
public function up()
    {
        Schema::create('setting_measurables', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('setting_id');
            $table->foreign('setting_id')->references('id')->on('settings')->onDelete('cascade');
            $table->morphs('measurable'); // measurable_id, measurable_typeを作成
            $table->timestamps();
        });
    }

モデル

class Setting extends Model
{
    protected $fillable = ['content_id'];

    public function measureARecordings()
    {
        return $this->morphedByMany(
            'App\Models\MeasureARecording',
            'measurable', //morphsに指定したカラム名
            'setting_measurables' //テーブル名
        );
    }

    public function measureBRecordings()
    {
        return $this->morphedByMany(
            'App\Models\MeasureBRecording',
            'measurable',
            'setting_measurables'
        );
    }

    public function measureCRecordings()
    {
        return $this->morphedByMany(
            'App\Models\MeasureCRecordings',
            'measurable',
            'setting_measurables'
        );
    }
}

呼び出し

withでEagerLoadingももちろんできる。

public function getMeasureArecording($content_id)
{
    return Content::with([
        'settings',
        'settings.measureARecordings',
        'settings.measureBRecordings',
        'settings.measureCRecordings',
    ])->find($content_id);
}

保存

public function storeSettingMeasurable(Request $request)
{
    SettingMeasurable::create([
        'setting_id' => $request->input('setting_id'),
        'measurable_id' => $request->input('recording_id'), //それぞれのレコーディングテーブルの外部キー
        'measurable_type' => 'App\Models\MeasureARecording' //namespace含む対象モデル名
    ]);
}

# まとめ
ORMだと随所でポリモーフィックであることを明示できるのと呼び出しがより簡潔になるので利用してみたが慎重にCURDしないと不整合が起きるので頻繁には使わない方がいいORMを使用しないならより複雑な処理が必要になるはずなのでORMで無い場合にも避けるべきだとは思った
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者チームがWebサービス開発を始めて約2ヶ月が経ちました

はじめに

ドットインストール、プロゲート上がりの素人集団の挑戦を綴らせて頂いております。
YouTube万屋エンジニアチャンネルのコミュニティ内で、「フレームワークって何?美味しいの?」レベルのプログラミング初学者が4人集まってWebアプリを制作を始めて9週間、つまり約2ケ月が経過しました。

チームメンバーの振り返り用のメモですが、「初心者だけど何かモノを作ってみたい!」という方の参考にもなれば幸いです。過去記事はこちら。

2週間ごとにフェーズを設けて、目標設定、振り返りということを繰り返してきて、これが第4フェーズが終了しました。

GitHubを初めて公開してみます→https://github.com/WebYorozuya/jazz-review

目標達成度

3週間前掲げていた目標と、実際できたことを整理します。

3週間前掲げた目標 達成度10点満点 コメント
検索機能 9 投稿とタグのテーブルそれぞれから同時に検索し、検索ワードをハイライトすることができます。レスポンシブも対応。ただ今はタグがハイライトできません。
いいね機能の実装 10 jQueryで非同期処理で実装。
投稿の編集削除権限をその投稿主に限る 0 全く手をつけられませんでした。
投稿にチップスの効いたタグ付けができる 10 最後はチーム総力戦の様相を呈すほど苦戦しましたが、メンターの助けも得て実現しました。
投稿に付いたタグをクリックするとそのタグの投稿一覧をTagControllerで表示できる 8 扱うモノとコントローラの名前は合わせた方が良いという助言をいただき、ReviewControllerから移設できました。
ユーザーがプロフ画像を設定できる 5 担当メンバーががんばってくれているのですが、難しいようです...
開発者紹介がモーダルウィンドウで展開できる 9 良い感じのができました。あとはHTMLのフォーマットを繰り返さないように改善したいです。
フッターの画像がランダムに切り替わる 10 新メンバーが朝飯前的なスピードで実装してくれました。
ユーザーログイン周りのデザインを統一する 7 継承レイアウトやテンプレートを駆使してかんなり進歩しました。あとはマイページ
利用規約ページを設ける 8 あとは細かい文言を修正していきたいところ。
総合 74/100 達成度74%

その他にやったこと

  • JavaScriptファイルの大整理
  • ビューファイルのディレクトリと名前の大整理
  • 新メンバーの環境構築
  • 投稿ページの文字数カウント機能
  • レスポンシブ対応
  • もっと読む機能の実装
  • 投稿編集削除ページにその投稿のタグも表示する
  • 投稿のテキストの改行を表示の時に反映する
  • オンラインお茶会

この3週間を振り返って

  • プルリクする際になるべくメンバーにブリーフィングしてもらうようにしました。コードレビューがだいぶスムーズになって良い感じでした。
  • この第4フェーズからプロが参加してくださっており、もっと効率的にチームとして開発する方法など、プロならではの視点で指摘をしてくれてありがたいです。
  • メンバーが確実にレベルアップしいます。勉強しなきゃ!っていう義務感でやっている人はたぶんいなくて、みんな楽しく作業している感じがします。

次に目指すもの(第5フェーズ)

目標:我らがメンターおさない氏にレビューをお願いする!!
期日:11/16月曜

  1. プロフ画像
  2. 退会機能
  3. 投稿の編集削除権限をその投稿主に限定する
  4. 細かいスタイルや機能の修正
  5. リファクタリング
  6. シーダーを利用してメンバー間の開発をもっと効率的にしたい(いまさら感w)
  7. モーダルウィンドウで投稿の通報を実装
  8. セキュリティ対策を考える
  9. マイページ(PW変更、アイコン画像など)をテンプレートを活用してスタイル整える
  10. エラーハンドリング(例外処理)を考える

この3週間でメンターのレビューを頂けるレベルに磨いていって、第6フェーズでそれを反映して一旦この開発をひと段落させてもいいのかなと考えていたりします。
ここまで読んでくださってありがとうございます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel:v8.xにおけるTarget class ...Controller does not exist.の解消方法

【概要】

1.結論

2.Target class ...Controller does not exist.はどういう意味か

3.どのように変更するか

4.なぜTarget class ...Controller does not exist.になるのか

5.開発環境

1.結論

web.phpのルーティングの書き方を変更する!


2.Target class ... Controller does not exist.はどういう意味か

目的である....コントローラーがないよ!と言っています。つまり、
❶何かしらの原因でコントローラーがいないことになっている
❷何かしらの原因でルーティング➡︎コントローラーへと指示がいっていない

という可能性があります。

3.どのように変更するか

今回は❷でした。

正しい書き方は2種類あります。
i)絶対パスを記載する

routes/web.php
Route::get('/person' , 'App\Http\Controllers\UserController@index' );

ii)useを使用してルートを設定

routes/web.php
#省略
use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);





自分が記載した間違った方法は以下のようでした。(Laravel6.xでは使用可能)
iii)パスを省略して記載

routes/web.php
Route::get('User' , 'UserController@index' );


4.なぜTarget class ...Controller does not exist.になるのか

LaravelのVersionが原因でした。Laravel6.xでは3.iii)の方法で記載できましたが、Laravel8.xでは3.i)orii)でないとダメみたいです。下記の参照URLにて詳しく書かれています。

参考にさせていただいたURL:
Laravel8を試したら即効でエラー「Target class [〇〇〇Controller] does not exist.」が表示された

5.開発環境

PHP 7.4.10
Laravel 8.9
Apache 2.4.41
Mysql 5.6.47
Sequl Pro 1.1.2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerコンテナ内でcomposer updateしようとしたらproc_open(): fork failed と怒られた

環境

Docker for windowsを使用しています.
Docker Machineのバージョンは以下の通りです.

docker-machine.exe version 0.16.1, build cce350d7

Docker内でcomposer updateしようとした

LaravelをDockerコンテナ内で動かしているのですが,composer updateをしようとしたら怒れてしましました.

PHP Fatal error: Uncaught exception 'ErrorException' with message
'proc_open(): fork failed - Cannot allocate memory'

どうやらメモリ領域が足りないことが原因で起きたようです.
そこでスワップ領域を拡張しようと思い,以下のコマンドを実行したのですが,swapon failed: Operation not permittedと怒られました.

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

権限を与えてもダメでした.

解決方法

Docker Machineのメモリを増やしたらうまくいきました.
Docker Machineを一度停止し,Oracle VM VirtualBox マネージャーを起動します.
2020-10-25.png

以下のように該当するMachineの設定を開き,システム>マザーボード>メインメモリでメモリを増やします.
自分の環境では2GBでうまくいきました.

2020-10-25 (1).png
※Machineを起動した状態では変更できません.落とすのを忘れないように.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelコレクションのselect()とpluck()の違い

備忘録。

タイトル通り、Laravelコレクションのselect()とpluck()の違い。

両者をdd()してみてのあくまでもイメージ。細かくは理解していないけど。

select('カラム名')

ddすると、目的のカラムの項目までは何階層かある。

pluck('カラム名')

ddしてみると、目的のカラムの項目まですぐ直下。

あくまでも、イメージ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose upでpostgresが起動しなかったのでエラーを解決するに至った話

laravelをインストールする前段階docker-compose upでコンテナを起動させたかったが出来なかった

ある学習教材をベースにlaravelの学習を進めていて、PostgreSQLを使ってコンテナを起動させる内容だったのですが、上手く起動しなかったのでエラー解決に至るまでの備忘録です。

実際に行ったコマンド

ターミナル
 docker-compose up -d workspace php-fpm nginx postgres

up以降はオプションになってますが、最後についているpostgresが今回の話になります

無事にコンテナが起動されれば、

ターミナル
Creating laravel-sns_docker-in-docker_1 ... done
Creating laravel-sns_workspace_1        ... done
Creating laravel-sns_php-fpm_1          ... done
Creating laravel-sns_nginx_1            ... done
Creating laravel-sns_porstgres_1        ... done

この様に出るはずなのですが、私の場合は

ターミナル
Recreating laravel-sns_postgres_1 ... error
Creating laravel-sns_docker-in-docker_1 ... done
Creating laravel-sns_workspace_1        ... done
Creating laravel-sns_php-fpm_1          ... done
Creating laravel-sns_nginx_1            ... done

ERROR: for laravel-sns_postgres_1  Cannot start service postgres: Ports are not available: listen tcp 0.0.0.0:5432: bind: address already in use

こんな感じになってしまいました。

原因

数ヶ月前に、今よりもっと何も解っていない時期にインストールしていたpostgresだと言う事がわかりました。

当時、MySQL以外のDBを使いたいと言う気持ちから特に何も考えずにインストールしていたpostgresの存在を思い出し、pgadminから接続状態を見たら、今回のエラー内容に出ているポート番号5432が接続状態になっていました。
※エラー解決する前に画面を残すのを忘れてしまってました。

解決に向けた道筋を考える

今回はとある教材の学習中で起きたエラーでしたので、講師の方に相談した所、
・Ports are not available
・address already in use
辺りをキーワードに検索をしてみれば?と言うアドバイスを頂いたので、

Ports are not available→ポートが利用できない
address already in use→アドレスは既に使われている
と、ほぼ直訳の解釈を元に、検索をかけてこれかと思えるヒントを見付けました。

参考にさせてもらった記事
https://mebee.info/2020/04/20/post-7968/

これを元にポート番号5432を使用しているプロセスをkillすればいけるのかな?と思い早速実行

ターミナル
sudo lsof -i -P | grep 5432

pgAdmin4   2471 ---------   21u  IPv6 ---------      0t0  TCP localhost:64447->localhost:5432 (CLOSE_WAIT)
※アカウント名やトークンはーーで伏せさせてもらってます。

これでプロセス番号が2471だった事が解ったので、

ターミナル
kill 2471

でkillコマンドを実行

再度コンテナを起動

ターミナル
 docker-compose up -d workspace php-fpm nginx postgres

起動済みのコンテナは省略
 Starting 8d38216de390_laravel-sns_postgres_1 ... done

無事にpostgresも起動できました。

思えば当時インストールだけして、全く使っていなかったpostgresがずっとサーバーと接続済みだったんだな〜と言う事を思い知らされました。

無知の状態であれこれインストールする恐ろしさを知った反面、当時はkillコマンドとかも全く解っていなかったので、時間が立つ事で解決できる事もあるんだなと言う学びにもなりました。

めっちゃしょーもない内容ですが、もし1人でも同じ境遇の方がいて、何かのお役に立つかも知れません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelコレクション中の文字列の有無の判定方法

Laravelにて、
Eloquentでクエリビルドして(用語の使い方が不適切かも)得られたDBのコレクションの中の特定の文字列の有無をtrue/falseで返すことについて、はまってしまったので、備忘録として記す。

最終的には、コレクションをpluck('カラム名')で絞り込んでから、contains('文字列')メソッドで判定するという方法に落ち着いた。

やりたかったこと

テーブルは、Articlesテーブル(記事テーブル)と、
お気に入り記事を格納するLikesテーブル(お気に入りテーブル)がある。

記事一覧画面において、記事ごとにお気に入りに入っているかいないかを判定したい。

判定に使うカラムは、わけあってarticle_idではなく、article_nameとしている。

Unicodeを知らなかったため、文字化けと思ってしまった。

下のようにcontrollerでDBから値を取る。

ArticleController.php
public function index(){
        $articles = Destination::paginate(20);
        $likes = Like::where('user_id', Auth::id())->get();
        return view('index', compact('articles', 'likes));
}

bladeファイルの中で、article->nameとlikes中のarticle_nameで同一のものがあるかの判定を記述すればいいのだが、そんななか、たまたま下のように打ったことで、ちょっと泥沼にはまった。

index.blade.php
{{$likes}}

下のような、HTML画面になった。

[{"id":1,"user_id":1,"article_name":"\u30c6\u30b9\u30c8","created_at":null,"updated_at":null},
{"id":2,"user_id":1,"article_name":"\u30c6\u30b9\u30c82","created_at":null,"updated_at":null},
{"id":3,"user_id":1,"article_name":"\u30c6\u30b9\u30c83","created_at":null,"updated_at":null}]

なんだこれは。文字化けか??
よくわかっていない私は、Webの検索と、意味のないトラブルシューティングを重ねた。

何時間かして、\u30c6\u30b9\u30c8テストのunicodeであることを理解した。

なぜ上記のようにすると日本語がUnicodeで表示されるのかはまだよくわかっていないが。。

意味のないトラブルシューティング例

Unicodeを理解していなかった私は、トラブルシューティングのなかで、下の意味のないものもやってしまった。

Eloquentで取得した型はコレクション。コレクションはforeachで回して値を取るというのでこれまでやってきたし、日本語もUnicodeで表示されずにきちんと表示されていた。文字化けが原因で、色々うまく行かないと思ったので、文字化けさせないことが大事と考えて、下のようにforeachを使って判定をやってみた。

index.blade.php
@foreach ($articles as $article)
<tr>
       <td>{{$article->name}}</td>
<td>        
@foreach ($likes as $like)
@if ($like->article_name == $article->name)
チェック済み
@else
<div class="form-check">
    <input class="form-check-input" type="checkbox" id="{{$articles->name}}" 
      name="article_names[]" value="{{$article>name}}">
</div>
@endforeach
</td>
</tr>
@endforeach

結果はそう、画面がチェックボックスだらけになるという。。。。
likesテーブルのarticle_nameの値を総当りして、ほとんどがelseの方でチェックボックスを描画するという、おバカなコード。

containsメソッドが使えない?!

コレクション中の語句が有り無しを調べればいいので、コレクションのメソッドであるcontains()を使えばいいとわかったのだが、下のようにしても、なぜか効かない。

ArticleController.php
$likes = Like::where('user_id', Auth::id())->get(); //likesには'テスト'というarticle_nameが含まれている
$bool = likes->contains('テスト'); //false

//下はテスト用のコレクションを作って、contains()メソッドを試した。
$collection = collect(['テスト記事です', 'テスト記事だよ', 'テスト記事なんだね' ]);
$bool = collection->contains('テスト記事です'); //true

上記の$likes$collectionをdd()してみると、下のようになった。

$likesのdd結果
スクリーンショット 2020-10-27 100308.png

$collectionのdd結果
スクリーンショット 2020-10-27 100122.png

なんだか、$likesのほうは、目的のarticle_nameまで行くには何階層もあるみたい。これが悪いのかなと思って、以下のようにしたところ、うまく行った。

pluck()でカラムを絞り込んでから、contains()してうまくいった

ArticleController.php
$like_article_names = Like::where('user_id', Auth::id())->pluck('article_name');
$bool = $like_article_names->contains('テスト');  //true

ようやく、'テスト'という語句がコレクション中にありますよ、と判定することができるようになった。

ということで、コレクションでcontains()を使うには、絞り込んで(?)から使う、というふうにすればいいのかなと理解した。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Redisのライブラリをインストールしたらエラーが発生した

目的

  • LaravelのセッションをAWSのElastiCatcheで管理しようと思いpredis/predisをインストール後にローカルサーバを起動したときのエラーの解決方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 6.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提情報

問題までの経緯

  1. アプリ名ディレクトリで下記コマンドを実行してライブラリを取得した。

    $ composer require predis/predis
    
  2. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動した。

    $ php artisan serve
    
  3. 当該アプリの.envファイルのSESSION_DRIVER=fileの記載をSESSION_DRIVER=redisに変更した。

  4. 下記にアクセスした。

問題

  • ブラウザで下記のエラーが表示された。

    • Please make sure the PHP Redis extension is installed and enabled.
    • 訳: PHPRedis拡張機能がインストールされ有効になっていることを確認してください。

    ?_Please_make_sure_the_PHP_Redis_extension_is_installed_and_enabled__と_ElastiCatche.png

問題解決までの経緯

  1. おそらく.envファイルのSESSION_DRIVER=SESSION_DRIVER=redisとなっているときにPhpRedis PHP拡張が導入されていないと本エラーが出るようである。公式ドキュメントでRedisを使用する際はPhpRedis PHP拡張を入れて使うことが推奨されている。
  2. とはいえpredis/predisのライブラリが入っていれば動くはずであるが、推奨されている通りにPhpRedis PHP拡張を入れたら解決しそうである。
  3. 下記方法でMacのローカルにPhpRedis PHP拡張をインストールした。
  4. ローカルサーバを起動して下記にアクセスしてみた。
  5. 一向にページが表示されず挙げ句には下記のエラーを返してきた。
    • Operation timed out
  6. 下記の公式ドキュメントを見ていったらpredis/predisのライブラリを使用する際はconfig/database.phpのredis配列のclientキーの第二引数を'predis'に書き換えろと書いてあったPhpRedis PHP拡張をインストールしてしまったが本方法を試してみる。
  7. 下記コマンドを実行してPhpRedis PHP拡張をアンインストールする。

    $ pecl uninstall redis
    
  8. 下記コマンドを実行してphp.iniファイルの場所を出力する。

    $ php -r "echo phpinfo();" | grep "php.ini"
    
  9. 下記コマンドを実行してphp.iniファイルのバックアップを作成する。(下記コマンドは筆者の環境でのphp.iniファイルの場所を指しており、皆さんは先のコマンドで出力されたphp.iniのパスを指定してバックアップを作成していただきたい。)

    cp /usr/local/etc/php/7.4/php.ini /usr/local/etc/php/7.4/php.ini_org
    
  10. 下記コマンドを実行してphp.iniファイルを開く。(下記コマンドは筆者の環境でのphp.iniファイルの場所を指しており、皆さんは先のコマンドで出力されたphp.iniのパスを指定してファイルを開いていただきたい。)

    $ vi /usr/local/etc/php/7.4/php.ini
    
  11. ファイルに下記の記載があるはずなのでコメントアウト後に保存する。

    • 修正前

      /usr/local/etc/php/7.4/php.ini
      extension="redis.so"
      
    • 修正後

      /usr/local/etc/php/7.4/php.ini
      ;extension="redis.so"
      
  12. アプリ名ディレクトリで下記コマンドを実行して設定ファイルを開く。

    $ vi config/database.php
    
  13. 下記のように修正した。

    • 修正前

      config/database.php
      /*
      |--------------------------------------------------------------------------
      | Redis Databases
      |--------------------------------------------------------------------------
      |
      | Redis is an open source, fast, and advanced key-value store that also
      | provides a richer body of commands than a typical key-value system
      | such as APC or Memcached. Laravel makes it easy to dig right in.
      |
      */
      
      'redis' => [
      
          'client' => env('REDIS_CLIENT', 'phpredis'),
      
          'options' => [
              'cluster' => env('REDIS_CLUSTER', 'redis'),
              'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
          ],
      
          'default' => [
              'url' => env('REDIS_URL'),
              'host' => env('REDIS_HOST', '127.0.0.1'),
              'password' => env('REDIS_PASSWORD', null),
              'port' => env('REDIS_PORT', '6379'),
              'database' => env('REDIS_DB', '0'),
          ],
      
          'cache' => [
              'url' => env('REDIS_URL'),
              'host' => env('REDIS_HOST', '127.0.0.1'),
              'password' => env('REDIS_PASSWORD', null),
              'port' => env('REDIS_PORT', '6379'),
              'database' => env('REDIS_CACHE_DB', '1'),
          ],
      
      ],
      
    • 修正後

      config/database.php
      /*
      |--------------------------------------------------------------------------
      | Redis Databases
      |--------------------------------------------------------------------------
      |
      | Redis is an open source, fast, and advanced key-value store that also
      | provides a richer body of commands than a typical key-value system
      | such as APC or Memcached. Laravel makes it easy to dig right in.
      |
      */
      
      'redis' => [
      
          /* 下記を修正した */
          'client' => env('REDIS_CLIENT', 'predis'),
      
          'options' => [
              'cluster' => env('REDIS_CLUSTER', 'redis'),
              'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
          ],
      
          'default' => [
              'url' => env('REDIS_URL'),
              'host' => env('REDIS_HOST', '127.0.0.1'),
              'password' => env('REDIS_PASSWORD', null),
              'port' => env('REDIS_PORT', '6379'),
              'database' => env('REDIS_DB', '0'),
          ],
      
          'cache' => [
              'url' => env('REDIS_URL'),
              'host' => env('REDIS_HOST', '127.0.0.1'),
              'password' => env('REDIS_PASSWORD', null),
              'port' => env('REDIS_PORT', '6379'),
              'database' => env('REDIS_CACHE_DB', '1'),
          ],
      
      ],
      
  14. 別のエラーが発生したが問題になっていたPhpRedis PHP拡張が存在しない旨のエラーは出なくなった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelをバージョン指定(laravel6)でインストールする方法

laravelをバージョン指定してインストールした

個人アプリ開発に向けてPHPの学習を行っている最中にlaravelのバージョンを最新バージョンインストールしていた事で、学習中の教材の内容とハンズオンでの挙動が噛み合わなくなってしまった為、バージョンを6系統でインストールし直したかったので、備忘録として記述します。

早速インストールの方法

ターミナル
composer create-project --prefer-dist laravel/laravel blog "6.*"

これだけです

バージョン6にしたかった理由

・バージョン6はLTS(= Long Term Support)でサポート期間が長かった為
・現在は約半年の周期でバージョン変更が行われているが現時点(2020/10/26)でLTSの最新がバージョン6の為
・その為かLaravelに関する教材もバージョン6の物が多い気がしたので、まずは6でしっかり学習したかった為

と言った感じです。

もし同じ様なイメージで学習を考えられている方の参考になれば幸いです。

ちなみに
--prefer-distオプションでzipでインストールされるので、処理時間が高速で行われるそうです。

インストール後のバージョン確認

ターミナル
php artisan -V

Laravel Framework 6.19.1

無事にバージョン指定できました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む