20210801のlaravelに関する記事は7件です。

【Laravel】よく使うリダイレクトのやり方2種類

HTTPリダイレクト リダイレクトレスポンスは、Illuminate\Http\RedirectResponseクラスのインスタンスで、ユーザーを他のURLへリダイレクトするために必要なしっかりとしたヘッダを含んでいる必要があります。RedirectResponseインスタンスを生成する方法はいくつかあります。 引用:HTTPリダイレクト 結論 通常のリダイレクト:redirectヘルパを使用する 前のページに戻るリダイレクト:backヘルパを使用する 1. redirectヘルパを使用する Laravelではredirectヘルパ関数がグローバルに定義されており、アプリケーションのどこからでも使用できます。 // URLへのリダイレクト return redirect('home/dashboard'); //名前付きルートへのリダイレクト return redirect()->route('login'); //名前付きルートへのリダイレクト(パラメータ付き) return redirect()->route('profile', ['id' => 1]); // コントローラアクションへのリダイレクト return redirect()->action('LoginController@login'); // コントローラアクションへのリダイレクト(パラメータ付き) return redirect()->action('LoginController@login', ['id' => 1]); // URLでへのリダイレクト(フラッシュメッセージ付き) return redirect('home')->with('status', 'ログインしました!'); // bladeでこんな感じに描けばフラッシュメッセージを表示できる @if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif 2. backヘルパを使用する backヘルパ関数もグローバルに定義されており、アプリケーションのどこからでも使用できます。 // 前の画面に戻る return back(); // 前の画面に戻る(入力された値は保持する) return back()->withInput(); // 前の画面に戻る(エラーを設定する) return back()->withInput()->withErrors([ 'email' => '入力必須です。' ]); // こんな書き方も見たことあるけど、古い書き方で現在は上記のbackヘルパを使う模様 return redirect()->back(); まとめ 2種類のヘルパを使って簡単にリダイレクトができました。 内部的にはどちらもreturnの後のヘルパでIlluminate\Http\RedirectResponseクラスのインスタンスを作成して返しています。 Illuminate\Http\RedirectResponseクラスのインスタンスはリダイレクト先のURLやHTTPのステータスコードを保持します。 redirectヘルパでは引数で指定したURLを、backヘルパでは前画面のURLをそれぞれ設定しているようなイメージでしょうか。 return back()について内部的に何が起こっているか確認する記事も投稿しているので、よろしければこちらも併せて確認いただければと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

2つの配列を1つのforeach処理でDBに格納する方法

やりたかったこと WordテーブルとNoteテーブルのカラムにformから送られてきた値を格納。 Noteテーブルのカラム ・user_id ・title Wordテーブルのカラム ・note_id ・question  ・answer create.blade.php <form action="{{route('Vocabularys.add')}}" method="POST"> @csrf <div> <h3>タイトル</h3> <input type="text" name='title'> </div> <div>      //name = 'question'だと最後の1個のデータしか渡せないがname='question[]'とすることで配列にして全部の値をコントローラーに渡すことができる <p>Q.<input type="text" name='question[]'></p> <p>A.<input type="text" name='answer[]'></p> <p>Q.<input type="text" name='question[]'></p> <p>A.<input type="text" name='answer[]'></p> <p>Q.<input type="text" name='question[]'></p> <p>A.<input type="text" name='answer[]'></p> <a href="">削除</a> </div> <div> <p> <a href="">追加</a> </p> <p class="create-btn"> <input type="submit" value="登録"> </p> </div> </form> contoroller public function add(Request $request){      //ログインしているユーザーのIDを取得 $userId = Auth::id(); //モデル名::createを使うとモデルと接続されているテーブルにカラムが格納される      //そのまま変数の中でcreateを行う。 $note = Note::create([ //上記でログインしているユーザーのID取得した$userIdをuser_idカラムに入れる。 'user_id'=>$userId //formから送られたtitleをリクエストで呼び出しtitleカラムに格納 'title'=>$request->title, ]); // create.bladeから配列で受け取った値をそれぞれ変数に代入 $questionItems = $request->question; $answerItems = $request->answer; // コールバック関数はないのでNull foreach (array_map(Null, $questionItems, $answerItems) as [$questionItem,$answerItem,]){ $word = Word::create([ 'note_id'=> $note->id, 'question' => $questionItem, 'answer' => $answerItem, ]); }; return redirect('/Vocabularys/index'); } 上記でうまく2つの配列を1つのforeach処理でDBに格納できた。 最初やろうとしたこと // create.bladeから配列で受け取った値をそれぞれ変数に代入 $questionItems = $request->question; $answerItems = $request->answer;      //①の処理 //$questionItemsの中の配列の値の分だけ回してWordテーブルに格納 foreach ($questionItems as $item){ $word = Word::create([ 'note_id'=> $note->id, 'question' => $item, ]); }; ②の処理 //$answerItemsの中の配列の値の分だけ回してWordテーブルに格納 foreach ($answerItems as $item){ $word = Word::create([ 'answer' => $item, ]); }; 実行すると ・①の処理でWordテーブルのanswerカラムがnullだよと怒られた。 同じ処理でquestionカラムとanswerカラムに値を入れないといけないだと!!え?どうしよう。 無知な僕はめちゃめちゃ悩んだ。ググるとarray_map関数に出会った。。 array_mapとは? https://techacademy.jp/magazine/29657 これでできるんじゃね? 実装するといけた。 使い方合ってるか知らんけどwww $配列1 = [1,2,3] function コールバック関数名($n) { //$nには$配列1が入る。 return $n + 1; } //hogeが呼ばれたら $hoge = array_map(コールバック関数名, $配列1) consol.log($hog); +1される [2,3,4] 自分のメモ用なのでわかりづらいと思いますが参考にしてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで認証・認可処理の諸々実装

はじめに   認証・認可関係の処理を実装した際の諸々をメモ。 細かい説明は抜きでとりあえず動く部分のみ書いてます。 やったこと   未認証の場合ログイン画面に遷移させる   ログイン後、再びログイン画面にいくと特定の画面にリダイレクトさせる ログイン後の遷移先を設定 権限によってアクセス制限を行う 1. 未認証の場合ログイン画面に遷移させる ルーティングでミドルウェアを通します。 Route::middleware('auth')->group(function (){ Route::get('/', [Controllers\StudentsController::class, 'show'])->name('top'); }); ログインしていないとき、'/'にアクセスするとログイン画面に飛ばされます。 2. ログイン後、再びログイン画面にいくと特定の画面にリダイレクトさせる 仮定として、usersテーブルにはroleカラムがあり、1or2の数字を権限として与えます。 ミドルウェアのRedirectIfAuthenticated.phpをいじっていきます。 //省略 public function handle(Request $request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { if(Auth::user()->role==1){ return redirect('/home1'); }elseif(Auth::user()->role==2){ return redirect('/home2'); } } } return $next($request); } 説明 ログイン後のリダイレクト画面の設定をしています。 if(Auth::user()->role==1){ return redirect('/home1'); }elseif(Auth::user()->role==2){ return redirect('/home2'); } ここでログインしているユーザーのroleがどれか確認しています。 roleが1であれば/home1へリダイレクトしています。 roleが2であれば/home2へリダイレクトしています。 (他に良い方法があればご指摘くださいっ。) その他RedirectIfAuthenticated.phpに関する処理で気になる部分がある方はこちらの記事に詳しく書かれていました。 【Laravel】Closure $next, ...$guardsとは? ちなみにログイン後の遷移先はLoginController.phpに同様な処理を追加しました。 //省略 public function authenticated(Request $request, $user) { if(Auth::user()->role==1){ return redirect('/home1'); }elseif(Auth::user()->role==2){ return redirect('/home2'); } } 3. 権限によってアクセス制限を行う Gateの機能を使用。プロバイダーのAuthServiceProvider.phpに以下を追記。 //省略 public function boot() { $this->registerPolicies(); Gate::define('admin',function ($user){ return($user->role == 1); }); Gate::define('teacher',function ($user){ return($user->role == 2); }); } そしてルーティングでミドルウェアを通します。 Route::middleware(['can:admin','auth'])->group(function (){ Route::get('/', [Controllers\StudentsController::class, 'show'])->name('top'); }); middleware('can:admin')と記載することで権限がadmin、つまりroleが1のユーザーだけが'/'画面に遷移できます。 それ以外のユーザーには403エラーが返されます。 おわりに 探り探りで初めての実装もりもりでしたがとりあえず想定通りの動きはできました・・・。 細かい部分の処理を見ていかないと、どのように認証が行われているか理解が難しいですね。。 動きだけでもどこか参考になれば幸いでございます。 (もっとこうしたほうが良いなどあればご指摘お願いします!) 以上!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelを用いてアプリを作る。

*本件はlaravelをインストールした状態から始める 1.アプリのインストール 1.アプリを作成する ターミナル composer create-project laravel/laravel アプリ名 下記のように出たらOK application keyはメモっとくのがいいらしいい ターミナル実行結果 php artisan key generate〜 application key〜  2.サーバーを起動(確認) ターミナル /ディレクトリは作成したアプリ名/ oredayoore@MacBook-Air-5 作成したアプリ$ php artisan serve 3.URL入力 リンク http://127.0.0.1:8000/ →画面が出る! 2.データベースを作成+設定する 1.環境変数を設定する アプリ名/.env 1.設定するデータベース名を記述(以下sqliteの場合) DB_CONNECTION = sqlite *他のDB_CONNECTION = データベース名が記述されていた場合、削除すること 2.データベースの『絶対』パスを指定すること(以下例) DB_DATABASE=/home/foobar/myproject/database/database.sqlite 2.データベースを作成する。 ターミナル 上述の『環境変数を設定する』2番で設定したパス通りにデータベースを作成すること touch /home/foobar/myproject/database/database.sqlite 3. デフォルトのデータベースを設定する。 config/database.php /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ //下記のsqliteの所に自分の指定したいデータベースを入れる。上述のDB_CONNECTION = sqliteの環境変数と一致させること 'default' => env('DB_CONNECTION', 'sqlite'), 3.マイグレーションファイル作成 1.マイグレーションファイル作成 ターミナル oredayoore@MacBook-Air-5 作成したアプリ$php artisan make:migration create_books_table --create=books ターミナル 結果 created migration〜と出れば成功! →/database/migration/配下にファイルが作成される 2.マイグレーションファイルをいじる /database/migration/ public function up() { Schema::create('books', function (Blueprint $table) { //いじるのはここ!↓ 参考)$table->型(カラム名);                          $table->id(); $table->string('title'); $table->timestamps(); }); } 3.マイグレーションファイル更新(忘れがち) ターミナル oredayoore@MacBook-Air-5作成したアプリ$php artisan migrate 4.モデルの作成 1.モデルの作成 ターミナル oredayoore@MacBook-Air-5作成したアプリ$php artisan make:model Book(モデル名) //ここのモデル名の命名規則は頭文字は大文字、単数系 →/app/models/Book.phpにモデルファイルが作成される 5.ビューファイルを追加する 1.ビューファイルを追加 books.blade.php(自分でHTMLファイルを作成してみましょう) @extends('layouts.app') @section('content') <div class="container"> <div class="col-sm-offset-2 col-sm-8"> <div class="panel panel-default"> <div class="panel-heading"> 新たに書籍を追加する </div> <div class="panel-body"> <!-- Display Validation Errors --> @include('commons.errors') <!-- New Book Form --> <form action="/book" method="POST" class="form-horizontal"> {{ csrf_field() }} <!-- Book Name --> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">Book</label> <div class="col-sm-6"> <input type="text" name="name" id="book-name" class="form-control" value="{{ old('book') }}"> </div> </div> <!-- Add Book Button --> <div class="form-group"> <div class="col-sm-offset-3 col-sm-6"> <button type="submit" class="btn btn-default"> <i class="fa fa-plus"></i>本を追加する </button> </div> </div> </form> </div> </div> <!-- Books --> @if (count($books) > 0) <div class="panel panel-default"> <div class="panel-heading"> 書籍一覧 </div> <div class="panel-body"> <table class="table table-striped task-table"> <thead> <th>書籍タイトル</th> <th>&nbsp;</th> </thead> <tbody> @foreach ($books as $book) <tr> <td class="table-text"><div>{{ $book->title }}</div></td> <!-- Task Delete Button --> <td> <form action="/book/{{ $book->id }}" method="POST"> {{ csrf_field() }} {{ method_field('DELETE') }} <button type="submit" class="btn btn-danger"> <i class="fa fa-trash"></i>削除 </button> </form> </td> </tr> @endforeach </tbody> </table> </div> </div> @endif </div> </div> @endsection *注意 一番上の use App\models\Book; は、モデルのパスを表しているので 必ず一致されるようにしましょう! 主な語句の説明 @extends('layouts.app') @section('content') @include('commons.errors') @book→データベースから抽出したデータを表示されます。 そのためには後述の『ルーティング』で設定してあげる必要があります。 追加されたファイルを格納するパスの例) resources/views/layouts/ resources/views/layouts/ resources/views/layouts/ ルーティングの設定 WEBアプリケーションは必ずルーティングという見えない管を通じてVIEWを表示させたりデータベースを引っ張っていくので これを設定してあげなければVIEWも表示されない books.blade.php(自分でHTMLファイルを作成してみましょう) <?php use App\models\Book; use Illuminate\Http\Request; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ //画面遷移のルーティング $booksはビューに表記されている。 Bookというモデルクラスのallという関数によって、データベースのデータを全て呼び出して、 booksに代入している。 だからデータベースのデータをビューに表示することができる // Route::get('/', function () { $books = Book::all(); return view('books',['books' => $books]); }); //データ送信のルーティング 送信するには 送信先のパスが必要になる それが下記の例)post('/book' $validatorは、データ入力の制御(何でもかんでも受け入れる賭けにはいかない) また、データを保存するには、例のviewにある$bookという変数に、入力値を代入して、モデルまで送らなければならない。 その処理が $book = new Book; $book->title = $request ->name; $book->save(); である。 // Route::post('/book' , function(Request $request){ $validator = Validator::make($request->all(),[ 'name' => 'required|max255', ]); $book = new Book; $book->title = $request ->name; $book->save(); return redirect('/'); })->middleware('auth'); Route::delete('/book/{book}',function(Book $book){ $book->delete(); return redirect('/'); }); Auth::routes(); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); 【解説】 ルーティングを作成するイメージとして、通信する度にルーティングの設定が必要になる 例) ページに移動→Route::get データを送信→Route::post 画像を削除→Route::delete、、などなど
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】一度設定したプロジェクト名を変更してみたら詰んだ話

Laravelプロジェクトの名前を変更したい 個人開発等を進めていて後から『プロジェクト名変えたいないぁ』と思う機会がありました。本来であれば要件定義、詳細設計等の段階でしっかりと決めておくべき内容でしたが、個人で学習用に開発を進めている場合だったので変更することとしました。 今回の記事では一度作成してしまったLaravelプロジェクト名の変更方法と注意点をまとめていきます。 本記事で対象となる方は以下の通りです ・個人開発で進めていたが途中からプロジェクト名を変えたくなった。 ・ポートフォリオ作成等で後からサービス名を変更する必要があった。 ・プロジェクト名が気に食わない。 ※僕自身まだ学習中のみであるため本記事によるエラーは自己責任でご対応ください。。。 【結論】なるべくおすすめはしません 例えば、以下のように元々sampleという名前のプロジェクトからsample2に変更する場合、そのまま修正するとエラーになり全く動かなくなります。 sample //変更前 sample2//変更後 その場合、その旧名の新フォルダを削除し、名前を元に戻せば、エラーは出なくなります。つまり、このフォルダ名自体を直接変更するというのは、出来ないと思ってください。 この後説明する内容も基本は新規にプロジェクトを作成しなおすという形になります。実際に試したところ結構面倒くさかったのでおすすめはしないです。 Laravelプロジェクト名の変更はGithubを使って行う ではどうするのかというと以下の流れで変更していきました。 ①Githubにバックアップを作成する ②ローカルに①でバックアップを保管した内容をクローンする ③環境構築を再設計する(docker等) ④ライブラリー関連を再インストールする(composer等) ①Githubにバックアップを作成する Githubにプッシュしてバックアップを作成します。コミット・プッシュが完了していなければ対応します。 ②ローカルに別ディレクトリを作成してGithubからクローンを作成する ローカルに新しく作成したいプロジェクト名のフォルダを作成します。 先程の例でいうと『sample2』 git cloneコマンドで①でバックアップした内容を反映します。 git clone http://リポジトリのurl/プロジェクト名.git ③新しく環境構築を設定しなおす ここからは各々の開発環境によるのであくまで参考程度にご覧ください。僕の場合はdocker(Laradock)を使った開発になります。 新しくdockerでの環境構築を行なっていきます。古いdockerコンテナ&イメージが走っているままだとエラーが起きるため一度停止&削除します。 ※僕の場合はLaravelインストールして少し実装を行なった程度の状態でした。古いプロジェクトを残す必要はなかったため、かつ既存プロジェクトのdockerファイルをそのまま転用するために上記対応を行いました。もし、既存プロジェクトを残した状態で複製する場合はDockerfileも既存適宜修正する必要があります。 ④Composerを再インストールする ここでかなり沼リました。 githubからプロジェクトを再インストールして、かつdockerでの環境構築も再設計しなおし、 『いざローカルホストにアクセス!!』したらこのありさま。 【事象】 【分析】 画像が表示されていない? ↓ intervention/image(PHPで画像を編集するためのライブラリー)が機能していない? ↓ 他の実装内容もチェックしていくとcomposerでインストールして実装した内容が軒並みエラーを起こしているよう。 ↓ vendorディレクトリがない・・・???!!! ↓ いやまってそもそもvendorディレクトリどっこいった。 ↓ エラーになにか書いてある。 /app/vendor/autoload.php : failed to open stream: No such file or directory in… 【対処】 composerを再インストールしたところうまくきました。 まとめ 今回は事象とエラー解決に絞って記載しました。 次回は『なぜcomposerの再インストールが必要なのか』『vendorディレクトリをGit管理下に置かない理由(gitignore指定)』について学んだことを書いてみようと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(Laravel)具体例付きでEloquentでリレーション先を見ながらデータ取得する操作の確認

はじめに 本記事作成の目的 私の同僚で過去にクエリビルダでjoinを駆使する方法をメインに使用していたためにEloquentに慣れていないという方にもっとEloquentを使ってもらいたいという目的で作成しております。 複数テーブルを跨いだ処理について、クエリビルダでjoinを駆使して実装することもできますが、 Eloquentを使ってLaravelに任せてしまったほうが簡単だしバグも発生しづらいということを目の当たりにして記事作成を決意しました。 基本は公式ドキュメントを見て状況に合った方法を確認するべきですが、まずはこの記事を理解の第一歩にしていただけると幸いです。 注意 ・想定する読者について マイグレーションやモデルの作成等、Laravelの基本的な操作をある程度把握している方を想定しています。 一通り使い方を学んだ方がデータ取得を実装するときに読んでいただけると理解しやすくなるのではと思います。 ・具体例について 本記事はイメージしやすくするため、予約サイトの機能を開発する状況を想定しています。 現実の予約サイトの開発では起こらない例もあるかと思いますがそのあたりはご容赦ください。 ・実行環境について php:7.4.8 Laravel Framework 6.20.23 Case1: データを取得してリレーション先のデータを表示 DB図 状況 全ての予約の中で"2021-08-01"のものだけを取得して画面に表示させたい。 画面には予約日と予約に紐づいた会員の名前、メールアドレスを表示させたい。 実装方法 ・予約モデルにリレーションを設定 app/Models/Reservation.php //...いろいろ省略 public function user() { return $this->belongsTo('App\User'); //App\Models\Userにするプロジェクトもあるかもしれません。 } ・コントローラでデータ取得を行ってビューに送る ※実際にはコントローラの肥大化を防ぐために別ファイルに実装するかもしれません。今回はコントローラに実装します app/Http/Controllers/ReservationController.php //...いろいろ省略 use App\Models\Reservation; //...いろいろ省略 public function search() { $reservations = Reservation::where('date', '2021-08-01')->get(); return view('index', compact('reservations')); } ・Eloquentで取得したデータをビューに表示する resources/views/index.blade.php <table> <tr> <th>予約日</th> <th>名前</th> <th>メールアドレス</th> <tr> @foreach($reservations as $reservation) <tr> <td>{{$reservation->date}}</td> <td>{{$reservation->user->name}}</td> <td>{{$reservation->user->email}}</td> </tr> @endforeach </table> Case2: リレーション先の値を条件にデータを検索したい DB図 状況 全ての予約の中で"山田太郎"さんのものだけを取得して画面に表示させたい。 画面には予約日、名前、メールアドレスを表示させたい。 実装方法 ・予約モデルにリレーションを設定 app/Models/Reservation.php //...いろいろ省略 public function user() { return $this->belongsTo('App\User'); //App\Models\Userにするプロジェクトもあるかもしれません。 } ・コントローラでデータ取得を行ってビューに送る ※いろいろ方法があるようですが、whereHasを使う形を紹介します。 app/Http/Controllers/ReservationController.php //...いろいろ省略 use App\Models\Reservation; //...いろいろ省略 public function search() { $userName = '山田太郎'; $reservations = Reservation::whereHas('users', function($query) use ($userName){ $query->where('name', $userName); //use ($userName)をよく忘れてエラーになるので注意。 })->get(); return view('index', compact('reservations')); } ・Eloquentで取得したデータをビューに表示する resources/views/index.blade.php <table> <tr> <th>予約日</th> <th>名前</th> <th>メールアドレス</th> <tr> @foreach($reservations as $reservation) <tr> <td>{{$reservation->date}}</td> <td>{{$reservation->user->name}}</td> <td>{{$reservation->user->email}}</td> </tr> @endforeach </table> Case3: リレーション2個分先の値を条件にデータを検索したい DB図 状況 全ての予約の中で"夏にこそ旅に出よう!20%OFF!"のクーポンを持つ会員のものだけを取得して画面に表示させたい。 画面には予約日、名前、メールアドレス、会員が所有する全クーポンを表示させたい。 実装方法 ・予約モデルにリレーションを設定 app/Models/Reservation.php //...いろいろ省略 public function user() { return $this->belongsTo('App\User'); //App\Models\Userにするプロジェクトもあるかもしれません。 } ・会員モデルにリレーションを設定 app/User.php //...いろいろ省略 public function coupons() { return $this->hasMany('App\Models\Coupon'); } ・コントローラでデータ取得を行ってビューに送る ※いろいろ方法があるようですが、whereHasを使う形を紹介します。 app/Http/Controllers/ReservationController.php //...いろいろ省略 use App\Models\Reservation; //...いろいろ省略 public function search() { $couponName = '夏にこそ旅に出よう!20%OFF!'; $reservations = Reservation::whereHas('users', function($query) use ($couponName){ $query->whereHas('coupons', function($query) use ($couponName) { $query->where('coupon_name', $couponName); }); })->get(); return view('index', compact('reservations')); } ・Eloquentで取得したデータをビューに表示する resources/views/index.blade.php <table> <tr> <th>予約日</th> <th>名前</th> <th>メールアドレス</th> <th>所有クーポン</th> <tr> @foreach($reservations as $reservation) <tr> <td>{{$reservation->date}}</td> <td>{{$reservation->user->name}}</td> <td>{{$reservation->user->email}}</td> <td> @foreach($reservation->user->coupons as $coupon) {{$coupon->coupon_name}}<br> @endforeach </td> </tr> @endforeach </table>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel Class 'ZipArchive' not foundエラー

laravelでExcelにあるデータをインポートしようとしたら 「Class 'ZipArchive' not foundエラー」が出ました。 内容的には「ZipArchiveというクラスが無いです!」と言っています。 しかし、 どこにZipArchiveというクラスをインストールしたら良いのか? などエラー解決に時間がかかったのでメモに残したいと思います。 開発環境 MacOSにLinuxの環境を作り、 Dockerを立ててlaravelを動かしている感じです。 実装 まずphp -mでモジュールがあるか確認してください。 ※php -m (モジュールの一覧を表示) ■MacOS ユーザー名@コンピュータ名 docker-on-vagrant %php -m ■Linux [vagrant@local-docker docker-laravel]$php -m ■Docker Webコンテナ内 [root@3ab4e8805629 html]# php -m 今回はDocker Webコンテナ内にzipモジュールをインストールすることで解決できました。 zipインストール [root@3ab4e8805629 html]# yum install --enablerepo=remi,remi-php72 php-pecl-zip DockerのWebコンテナ再起動 docker restart apache-php もう一度Docker Webコンテナ内に戻り php -mを試してください。 zipがインストールされていてエラーが解決できると思います。 ※docker-compose downにするとzipモジュール消えます 今回はこの方法でzipをインストールしましたが、docker-compose downすると毎回zipをインストールしないといけないので Dockerファイルにzipをインストールする記述を書いた方がいいとも感じました。 またおいおい書いていこうかと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む