# Laravel授業3回目(Laravel9版) ## 環境構築(先週の復習) ## 環境構築 ### 【PHPセットアップ】 #### 1.パッケージのアップデート `sudo yum update -y` #### 2.PHPのパッケージをすべてアンインストール `sudo yum -y remove php-*` #### 3.amazon-linux-extrasをアップデート `sudo yum update -y amazon-linux-extras` #### 4.amazon-linux-extrasで使用中のパッケージと使えるパッケージを確認 `amazon-linux-extras` #### 5.lamp-mariadb10.2-php7.2を使用停止 `sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2` #### 6.PHP8.0を有効化 `sudo amazon-linux-extras enable php8.0` #### 7-1.インストールするパッケージの案内があったので、表示されたコマンドを実行 `sudo yum clean metadata && sudo yum install php-cli php-pdo php-fpm php-mysqlnd` #### 7-2.インストールするパッケージの案内があったので、表示されたコマンドを実行 `sudo yum install php-cli php-common php-devel php-fpm php-gd php-mysqlnd php-mbstring php-pdo php-xml` #### 8-1.apacheなどを再起動 `sudo systemctl restart httpd.service` #### 8-2.apacheなどを再起動 `sudo systemctl restart php-fpm.service` ### 【データベースの準備】 #### 1.MariaDBデフォルト確認 `sudo yum list installed | grep mariadb` #### 2.MariaDBのインストール `sudo amazon-linux-extras install mariadb10.5 -y` #### 3-1.Apache, MariaDBの起動 `sudo systemctl start mariadb` #### 3-2.Apache, MariaDB初期設定 `sudo mysql_secure_installation` ``` 初回設定の入力項目 Enter current password for root (enter for none): [Enterキー] Switch to unix_socket authentication [Y/n] y Set root password? [Y/n] y New password: root Re-enter new password: root Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] y Remove test database and access to it? [Y/n] y Reload privilege tables now? [Y/n] y ``` #### 4-1.MaridaDBの自動起動を有効化 `sudo systemctl enable mariadb` #### 4-2.MaridaDBの自動起動確認 `sudo systemctl is-enabled mariadb` #### 5-1. Composerインストール `curl -sS https://getcomposer.org/installer | php -- --version=2.3.5` #### 5-2. Composerパスを通す `sudo mv composer.phar /usr/bin/composer` #### 5-3. Composer確認 `composer` #### 6. Laravelインストール(最新バージョン) `composer create-project "laravel/laravel=9.1.8" cms` #### 7. サーバーの起動とLaravelプロジェクトの起動チェック #ディレクトリ移動 `cd cms` #BuiltInサーバーを起動:動作確認 `php artisan serve --port=8080` *Cloud9の画面上部の緑の起動ボタンの左側Previewボタン>Preview Running Applicationをクリック 右下に画面が起動してLaravelの文字が確認できたらOK (編集済み) ### 【データベースの作成】 `mysql -u root -p` `root [Enterキー]` `create database c9;` `show databases; ` `exit;` ### 【Laravelプロジェクト初期設定】 #### 1. env(ファイル内の同じ箇所を上書き) ``` DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=c9 DB_USERNAME=root DB_PASSWORD=root ``` #### 2. サーバーの再起動 サーバー起動後のターミナル上で `Ctrl + C` #### 3. /app/Providers/ AppServiceProvider.php ファイルを修正 ``` use Illuminate\Routing\UrlGenerator;//この行を追加 //bootメソッドを以下に変更 public function boot(UrlGenerator $url) { $url->forceScheme('https'); } ``` #### 4. 表示の仕組みをチェックしてみる! #4-1 /resouces/views/welcome.blade.php を編集して見よう! #4-2 ブラウザ・更新で確認 → 変更確認できればOK ### 【phpMyAdmin設定】 #### 1. cms階層からpublicフォルダに移動 `cd public` #### 2. phpMyAdminのzipをダウンロード `wget https://files.phpmyadmin.net/phpMyAdmin/5.1.2/phpMyAdmin-5.1.2-all-languages.zip` #### 3. zipファイルを解凍 `unzip phpMyAdmin-5.1.2-all-languages.zip` #### 4. cms階層に戻る `cd ..` > <手順解説> > 1 publicフォルダ内に「phpMyAdmin-5.1.2-all-languages」フォルダが作成される > 2 フォルダ名が長いので「phpMyAdmin」に変更 > 3「Preview」でサイトを開き、URLの最後に「phpMyAdmin/index.php」をつけてEnterキーを押す > 4 URL例: https://******.cloud9.us-east-1.amazonaws.com/phpMyAdmin/index.php > 5 phpMyAdmin画面が表示されたら: ユーザー名・パスワードともに「root」を入力してログイン > 6 ログインできればOK ## ログイン認証 ### 【ログイン認証実装】 #### 1. マイグレーションを実行 `php artisan migrate` #### 2. laravel/ui パッケージをインストール(Laravel 9.x の場合) `composer require laravel/ui` #### 3. artisan コマンドを実行 `php artisan ui vue --auth` #### 4. npmパッケージをインストール `npm install` #### 5. パッケージをビルド(1回目) `npm run dev` #### 6. パッケージをビルド(2回目) `npm run dev` *なぜかビルド2回必要です! ## メール送信機能実装 ### 【Mailtrap】 #### 1. アカウント作成 https://mailtrap.io/ #### 2. メール情報を確認 Inboxes>Demo inbox>SMTP Setting>Integrations>Laravel を選択するとLaravelの.envに記述する内容が表示される。 #### 3. メールアドレスの確認 Inboxes>Demo inbox>Email Adressから自分のメールアドレスが確認できる ### 【Mail送信処理を作成】 #### 1. .envファイルに設定情報を記述 ``` MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=*************** //自分のmailtrapのユーザーネーム MAIL_PASSWORD=*************** //自分のmailtrapのパスワード MAIL_ENCRYPTION=tls ``` #### 2. サーバー再起動(cms階層で) `Ctrl + C` `php artisan serve --port=8080` #### 3. mail.blade.phpを作成して以下をコピペ ``` @extends('layouts.app') @section('content') <form action="{{ url('/mail/send') }}" method="post" enctype="multipart/form-data"> {{ csrf_field() }} <div class="form-group"> <label for="exampleInputEmail1">Eメールアドレス</label> <input type="email" class="form-control" name="email" id="exampleInputEmail1" placeholder="Eメールアドレス"> <small class="text-muted">あなたのメールは他の誰とも共有しません。</small> </div> <div class="form-group"> <label for="exampleInputEmail1">サンプルテキスト</label> <input type="text" class="form-control" name="text" id="exampleInputEmail1" placeholder="送りたい文字列"> </div> <button type="submit" class="btn btn-primary">送信する</button> </form> @endsection ``` #### 4. web.phpにuseを記述後にルーティングを二つ追加 ``` use App\Http\Controllers\MailController;//追記 //メール送信フォームを表示 Route::get('/mail', [MailController::class, 'index']); //メール送信処理 Route::post('/mail/send', [MailController::class, 'send']); ``` #### 5. MailControllerを作成 `php artisan make:controller MailController` #### 6. MailController内に以下を追記 `use Mail;` #### 7. MailController内にindex処理を追記 ``` //メールフォーム表示 public function index(){ return view('mail'); } ``` #### 8. MailController内にsend処理(送信処理)を追記 ``` // メール送信処理 public function send(Request $request){ $email = $request->email; //送信先アドレス取得 $text = $request->text; //送信テキスト取得 // dd($text); // メール送信処理(//view/emails/test_mail_text.blade.phpにデータを送る) Mail::send(['text' => 'emails.test_mail_text'], [ 'text'=>$text , //送りたい情報 ] , function($message) use($email) { $message ->from('info@test.jp') ->to($email) ->subject("テストメールだよ!"); }); return redirect('mail'); } ``` #### 9. viewsフォルダの直下にemailsフォルダを作成してその中にtest_mail_text.blade.phpを作成して以下をコピペ ``` テストメールです 以下は入力した内容 ========================== {{$text}} ========================== ``` ## 画像アップロード機能 ### 【画像アップロード処理】 #### 1. userのマイグレーションファイルに以下を追加 `$table->string('img_url')->nullable();//追記!!!` ``` public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('img_url')->nullable();//追記!!! $table->rememberToken(); $table->timestamps(); }); } ``` #### 2. migrate refreshしてテーブルにカラム追加実行 `php artisan migrate:refresh` #### 3. 画像処理をまとめるcontroller作成 `php artisan make:controller ImgController` #### 4. web.phpにルーティングを2つ追加 ``` use App\Http\Controllers\ImgController;//追記 //画像アップロード画面表示 Route::get('/img', [ImgController::class, 'index']); //画像アップロード処理 Route::post('/img/upload',[ImgController::class, 'upload']); ``` #### 5. views直下にimg_upload.blade.phpファイルを作成して以下をコピペ ``` @extends('layouts.app') @section('content') @if ($errors->any()) <div class="errors"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form action="{{ url('/img/upload') }}" method="post" enctype="multipart/form-data"> {{ csrf_field() }} <div class="form-group"> <input id="fileUploader" type="file" name="img" accept='image/' enctype="multipart/form-data" multiple="multiple" required autofocus> </div> <button type="submit" class="btn btn-primary">送信する</button> </form> @endsection ``` #### 6. ImgControllerに以下4行を追記 ``` use Validator; use Auth; use Illuminate\Support\Str; ``` #### 7. ImgControllerに表示処理作成 ``` //画像アップローダー表示 public function index(){ return view('img_upload'); } ``` #### 8. ImgControllerに画像アップロード処理作成 ``` // 画像アップロード処理 public function upload(Request $request){ // バリデーション $validator = $request->validate( [ 'img' => 'required|file|image|max:2048', ]); // 画像ファイル取得 $file = $request->img; // ログインユーザー取得 $user = Auth::user(); if ( !empty($file) ) { // ファイルの拡張子取得 $ext = $file->guessExtension(); //ファイル名を生成 $fileName = Str::random(32).'.'.$ext; // 画像のファイル名を任意のDBに保存 $user->img_url = $fileName; $user->save(); //public/uploadフォルダを作成 $target_path = public_path('/uploads/'); //ファイルをpublic/uploadフォルダに移動 $file->move($target_path,$fileName); }else{ return redirect('/home'); } return redirect('/img'); } ``` ### 【画像表示処理】 #### 1. img_upload.blade.phpのフォームの直下に以下を追記 ``` @if($user->img_url) <img src="/uploads/{{ $user->img_url }}"> @endif ``` #### 2. ImgControllerのindex処理を以下に変更 ``` //画像アップローダー表示 public function index(){ $user = Auth::user(); return view('img_upload',[ 'user'=>$user ]); } ``` #### 3. 最後にImgControllerにログインユーザーのみの指定をする ``` //ログインユーザーのみ使える機能にする これを追加する!順番重要です!最初にログイン確認です。 public function __construct() { $this->middleware('auth'); } //画像アップローダー表示 public function index(){ 省略 } //画像アップロード処理 public function upload(Request $request){ 省略 } ``` ## Gateを使ったログイン認証切り分け > 今回は一番簡単な0と1のflagを使った直接管理 > 0の時は無料会員 > 1の時は有料会員 ### 【Userテーブルにflag管理カラム追加】 #### 1.userテーブルにflagを追加する為にマイグレーションファイルに下記追加 `$table->integer('flag')->default(0);` #### 2.migrate refreshしてテーブルにカラム追加実行 `php artisan migrate:refresh` ### 【Gate処理の作成】 #### 1.AuthServiceProvider.phpのboot()メソットの中に処理を追記 ``` //プレミア会員用のみ許可(flagが1の人のみ許可) Gate::define('premier-only',function($user){ return($user->flag == 1); }); ``` #### 2.web.phpに認可した場合のGroupを作成しその中にプレミア会員向けルーティングを入れる ``` // プレミア会員用のルーティング Route::group(['middleware' => ['auth', 'can:premier-only']], function () { Route::get('/premier', 'HomeController@premier_index')->name('premier'); }); ``` ## ページ毎にCSSを実装したい場合 #### 1. views/layout/app.phpのheadタグ内に以下を追記 ` @stack('css')` #### 2. publicのcssフォルダの中にオリジナルCSSファイル(〇〇.css)を作成 #### 3.呼び出したいbladeの@extends()の直下に記述 ``` @push('css') <link href="{{ asset('css/〇〇.css') }}" rel="stylesheet"> @endpush ``` ## ページ毎にjsを実装したい場合 #### 1. views/layout/app.phpのbody終了タグ直前に以下を追記 ` @stack('js')` #### 2. publicのjsフォルダの中にオリジナルJSファイル(〇〇.js)を作成 #### 3.呼び出したいbladeの@endsectionの直上に記述 ``` @push('js') <script src="{{ asset('js/〇〇.js') }}"></script> @endpush ``` ##### レイアウトの組み方などの参考記事 https://nodoame.net/archives/10756 https://qiita.com/yktk435/items/cc606f915859872eec9a https://engineering.mobalab.net/2019/03/08/laravel%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AEinclude-yield-section%E3%81%AE%E9%81%95%E3%81%84/