- 投稿日:2020-10-19T23:23:17+09:00
yps並走備忘録 Task6 既存コードからアプリケーションを作成する(To Do List)
いよいよ本格的にWebアプリケーションを作成します。
今回の開発ではWebアプリの定番CRUD操作も入ってきますし、Laravelのミドルウェアも使います。また開発でも機能単位での開発になるのでこのタスクからは本格的にgit-flowを使うことが推奨されています。
参考:git-flow図解
git-flowはWeb開発の現場では当たり前に使われているそうなので、この機会に慣れておきたいですね!
注意事項
2020年/20/19日現在Laravel 8のリリースにより最新版のLaravelを導入した場合本記事やリンク先の参考記事の通りの実装だと動かなくなる可能性があるのでLaravelのプロジェクト作成時には以下のコマンドで7.25.0で作成することをおススメします。
cd /var/www/html
//まずはアプリを公開するnginxの公開ディレクトリに移動
composer create-project --prefer-dist laravel/laravel myapp2 "7.25.0"
//Laravelを7.25.0バージョンで構築しますまずは認証系を作っていきましょう
下記参考記事をなぞりながら認証機能を導入していきます
cd myapp2
composer require laravel/ui "2.*"
//フロント側のログインのテンプレートを一発で導入できるLaravel/uiを入れます
npm install
php artisan ui bootstrap --auth
npm install cross-env
npm install
npm run dev
npm run devでエラーが出た場合は下記コマンドで対応
rm ./package-lock.json
rm -rf ./node_modules/
npm install
補足: npm run devは導入したjsやcss等のライブラリやフレームワークをビルドするコマンド、上記の場合で言うとimportしたbootstrap関連のscss,jsファイルなどをまとめていい感じにpublicに配置してくれます。
なお、ビルドには多少時間かかるので面倒な場合は一先ずbladeとかに書きなぐっておいて、後ほどSassやjsファイルに突っ込んでビルドするのもいいかもしれないです。参考:
dotenvとcross-envで環境変数を設定して開発環境の処理を切り替える
npm run devに関して:Readoubleここまでやったら一先ず新しく構築したアプリへ公開ディレクトリを移しておきましょう
sudo vi /etc/nginx/conf.d/default.conf
/var/www/html/yps/public; ↓ /var/www/html/myapp2/public;※3か所くらいあります
WebサーバーとPHP-FPMを再起動
sudo systemctl restart nginx && sudo systemctl restart php-fpm
キャッシュクリア
php artisan cache:clear &&php artisan config:clear && php artisan route:clear &&php artisan view:clear
composer clear-cache && composer dump-autoload --optimize
※上記のコマンドは割と使うので.bashrc等でエイリアスに指定しておくのがおススメオーナーとディレクトリ権限変更
sudo chown -R centos:nginx /var/www/
sudo chmod -R 777 storage/ bootstrap/cache/
※このコマンドも新しいファイルやディレクトリ作ったり、ファイルを移動したりすると稀に使うのでエイリアス登録推奨ここまでやると画面右上にLOGIN REGISTERという認証用のリンクが出ているはずです。
いざ!アプリ構築!
いよいよ、アプリを構築していきます。
とはいえ、いきなりだと何から手を付けていいか分からないと思うので、最初はハンズオンで…
php artisan make:model Task -m
//-mオプションでマイグレーションファイルも同時に作成します参考:Readouble:マイグレーション
(ザックリ言うとDBとやり取りするのを任せるファイル、このファイルを通じてLaravelではSQLのデータ型やカラムの構造などを含めたデータベース操作を行います)アプリで使うデータベースを作成
mysql -u root -p
create database myapp2db;
exit
作成したDBをLaravelと連携させます
vi .env
//下記を編集 DB_DATABASE=myapp2db DB_USERNAME=root DB_PASSWORD="パスワード"設定が終わったら実際に接続します
php artisan migrate
//念のためテーブルがちゃんと作られているか確認
mysql -u root -p -D myapp2db
show tables;
※tasksテーブルが作成されています +--------------------+ | Tables_in_myapp2db | +--------------------+ | failed_jobs | | migrations | | password_resets | | tasks | | users | +--------------------+あとは下記参考リンクのコードを模写しながらタスク管理アプリを実装します。
なお、本タスクのクリア要件は
- ユーザー登録後に送信されたメールで認証したユーザーのみログイン可能
- ログイン後にタスク一覧画面に変遷
- タスク一覧及び個別画面はログインしていないと見られない
- ログアウト機能の実装
だそうです。
参考:
サンプルソース(GitHub)
※サンプルソースに一部修正が必要な個所があります↓
クリア要件:画面の変遷補足
gmailによる認証はセキュリティの関係でハマりやすいのと、別アカウントを取る手間もあるのでおススメは下記ブログで紹介されているmailtrapというWebサービス。メール関係の実装のテストなんかに気軽に使えて便利です。
簡単にできてしまった方は追加機能開発をしてみるのがおススメです。(結構沼れます)
- タスクのソート機能
- 期限を過ぎたタスクの色変更
- メールでの期限通知
- 検索機能
- ユーザーにタスクを紐づけ
- その他モロモロ私は
- ソート機能(ライブラリ使用)
- 表示色変更
- ユーザーに紐づけ(自分の物しか見られない)
上記に加えて下記参考リンクのカレンダー機能をガッチャンコしてみました(これがかなりの沼だった…)具体的には上記参考リンクの臨時休業の設定に当たる部分を流用して簡易的なシフトの入力(日勤、夜勤、休み)を入力できるようにしました。
もう少し発展させて管理者画面から操作できるようにしてあげればシフト管理アプリとしても使えそうですね…今後の課題として作り込みをゆっくりやっていきたいと思います。Task6は結構カスタマイズのしがいもあると思うので、是非色々自分好みのカスタマイズを行ってみましょう!
- 投稿日:2020-10-19T21:55:19+09:00
Laravel SanctumでSPA認証ができない(Unauthenticated.)
動機
Laravel Sanctumを利用してログインはできるものの、次のPOSTアクションでUnauthenticated.のエラーが発生しました。この原因調査に苦労したので、まとめました。
結論
.envでのSANCTUM_STATEFUL_DOMAINSとSESSION_DOMAINの設定が誤っていました。これらを正しく設定することで、問題なく動作するようになりました。
環境
- Laravel 7.x
- sanctum 2.6
- React 16.13.1
- Docker
ドキュメント内容
SANCTUM_STATEFUL_DOMAINS
基本的には公式を参照して設定すれば、問題はありません。ただ初心者の私には分かりづらく、設定を誤っていました。
まずstateful設定に関しては、以下のように書かれています。最初に、どのドメインから皆さんのSPAがリクエストを作成するのか設定する必要があります。sanctum設定ファイルのstateful設定オプションを利用してこのドメインを指定します。この設定を元にして皆さんのAPIへリクエストを作成するときに、Laravelのセッションクッキーを使用することで「ステートフル」な認証を維持する必要があるドメインを判断します。
Note: ポート(127.0.0.1:8000)を含むURLによりアプリケーションにアクセスする場合は、ドメインにポート番号を含める必要があります。
指示通りに
config/sanctum.php
をみてみます。
env()
は、第一引数の環境変数を探して、みつからない場合は第二引数をデフォルト値として使用します。
ここに直接書くか、SANCTUM_STATEFUL_DOMAINS
を.envファイルで指定すればOKです。config/sanctum.php/* |-------------------------------------------------------------------------- | Stateful Domains |-------------------------------------------------------------------------- | | Requests from the following domains / hosts will receive stateful API | authentication cookies. Typically, these should include your local | and production domains which access your API via a frontend SPA. | */ 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1,127.0.0.1:8000,::1')),SESSION_DOMAIN
SESSION_DOMAINの設定は、以下のように書かれています。
最後に、アプリケーションのセッションクッキードメイン設定で、ルートドメイン下の全サブドメインをサポートしているかを確認する必要があります。session設定ファイル中で、.にドメイン名を続ければ指定できます。
'domain' => '.domain.com',
config/session.php
をみてみると、以下の通りとなっています。ここも直接書くか.env
ファイルでSESSION_DOMAIN
を設定すればOKです。config/session.php'domain' => env('SESSION_DOMAIN', null),設定の仕方
Local環境
まず、通常の開発時の設定からになります。ブラウザに
loacalhost:8000
と入力しているので、SANCTUM_STATEFUL_DOMAINS
にはポート番号も含めた値を指定します。.envSANCTUM_STATEFUL_DOMAINS=localhost:8000 SESSION_DOMAIN=localhostDusk環境
次にDuskテスト時の設定になります。私の開発環境では、以下の設定で正しく動作するようになりました。
.envAPP_URL=http://web SANCTUM_STATEFUL_DOMAINS=web SESSION_DOMAIN=web私の場合は、開発環境にDockerを用いており、nginxとchromedriverは別のコンテナで起動しています。そのため、localhostのままでは認証されず、認証時にエラーが発生しました。
これに関しては、APP_URLのドメイン名と同じドメイン名にしておけば、問題はないように思います。どこでこれらの設定が使われているのか
SANCTUM_STATEFUL_DOMAINS
はEnsureFrontendRequestsAreStateful
クラスのfromFrontend()
で使用されています。php<?php namespace Laravel\Sanctum\Http\Middleware; use Illuminate\Routing\Pipeline; use Illuminate\Support\Collection; use Illuminate\Support\Str; class EnsureFrontendRequestsAreStateful { ... /** * Determine if the given request is from the first-party application frontend. * * @param \Illuminate\Http\Request $request * @return bool */ public static function fromFrontend($request) { $referer = Str::replaceFirst('https://', '', $request->headers->get('referer')); $referer = Str::replaceFirst('http://', '', $referer); $referer = Str::endsWith($referer, '/') ? $referer : "{$referer}/"; $stateful = array_filter(config('sanctum.stateful', [])); return Str::is(Collection::make($stateful)->map(function ($uri) { return trim($uri).'/*'; })->all(), $referer); }まず、以下の1行目をみてみると、リクエストのヘッダから
referer
を取得しています。ここには、ブラウザで入力したhttp://localhost:8000/hogehoge/piyopiyo
が入っており、少しずつ置換されて、3行目でlocalhost:8000/hogehoge/piyopiyo/
となります。$referer = Str::replaceFirst('https://', '', $request->headers->get('referer')); $referer = Str::replaceFirst('http://', '', $referer); $referer = Str::endsWith($referer, '/') ? $referer : "{$referer}/";
$stateful
には["localhost:8000"]
が入るので、コレクション化して、map
関数で["localhost:8000/*"]
を返します。
Str::is()
は、第二引数が第一引数に一致するか(*はワイルドカード)判断します。
localhost:8000/hogehoge/piyopiyo/
はlocalhost:8000/*
に一致するので、true
を返し、無事に処理が進みます。return Str::is(Collection::make($stateful)->map(function ($uri) { return trim($uri).'/*'; })->all(), $referer);ポートを含むURLでアクセスしている場合に、
SANCTUM_STATEFUL_DOMAINS
にポート番号を指定し忘れた場合は、localhost/*
で検索するようになってしまうので、false
となってしまいます。これで、以下のNoteの理由が分かりました。また、
$request
のreferer
と同じドメイン名にする必要があることが理解できました。Note: ポート(127.0.0.1:8000)を含むURLによりアプリケーションにアクセスする場合は、ドメインにポート番号を含める必要があります。
まとめ
SANCTUM_STATEFUL_DOMAINS
はEnsureFrontendRequestsAreStateful
クラスのfromFrontend()
で使用されており、$request
のreferer
と同じドメイン名にする必要があることが分かりました。
SESSION_DOMAIN
に関してはまだ調査中ですので、内容が理解できたら後ほど追記したいと思います。
- 投稿日:2020-10-19T21:55:19+09:00
Laravel Sanctumを利用するときのSANCTUM_STATEFUL_DOMAINSとSESSION_DOMAIN
動機
Laravel Sanctumを利用してみたものの、SANCTUM_STATEFUL_DOMAINSとSESSION_DOMAINの設定が理解できずに苦労したので、まとめました。
環境
- Laravel 7.x
- sanctum 2.6
- React 16.13.1
- Docker
公式の記述
基本的には公式を参照して設定すれば、問題はありません。ただ初心者の私には分かりづらく、設定を誤っていました。
まずstateful設定に関しては、以下のように書かれています。最初に、どのドメインから皆さんのSPAがリクエストを作成するのか設定する必要があります。sanctum設定ファイルのstateful設定オプションを利用してこのドメインを指定します。この設定を元にして皆さんのAPIへリクエストを作成するときに、Laravelのセッションクッキーを使用することで「ステートフル」な認証を維持する必要があるドメインを判断します。
Note: ポート(127.0.0.1:8000)を含むURLによりアプリケーションにアクセスする場合は、ドメインにポート番号を含める必要があります。
指示通りに
config/sanctum.php
をみてみます。
env()
は、第一引数の環境変数を探して、みつからない場合は第二引数をデフォルト値として使用します。
ここに直接書くか、SANCTUM_STATEFUL_DOMAINS
を.envファイルで指定すればOKです。config/sanctum.php/* |-------------------------------------------------------------------------- | Stateful Domains |-------------------------------------------------------------------------- | | Requests from the following domains / hosts will receive stateful API | authentication cookies. Typically, these should include your local | and production domains which access your API via a frontend SPA. | */ 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1,127.0.0.1:8000,::1')),もう一方の設定が、以下になります。
最後に、アプリケーションのセッションクッキードメイン設定で、ルートドメイン下の全サブドメインをサポートしているかを確認する必要があります。session設定ファイル中で、.にドメイン名を続ければ指定できます。
'domain' => '.domain.com',
config/session.php
をみてみると、以下の通りとなっています。ここも直接書くか.env
ファイルでSESSION_DOMAIN
を設定すればOKです。config/session.php'domain' => env('SESSION_DOMAIN', null),設定の仕方
まず、通常の開発時の設定からになります。ブラウザに
loacalhost:8000
と入力しているので、SANCTUM_STATEFUL_DOMAINS
にはポート番号も含めた値を指定します。.envSANCTUM_STATEFUL_DOMAINS=localhost:8000 SESSION_DOMAIN=localhost次にDuskテスト時の設定になります。私の開発環境では、以下の設定で正しく動作するようになりました。
.envAPP_URL=http://web SANCTUM_STATEFUL_DOMAINS=web SESSION_DOMAIN=web私の場合は、開発環境にDockerを用いており、nginxとchromedriverは別のコンテナで起動しています。そのため、localhostのままでは認証されず、認証時にエラーが発生しました。
これに関しては、APP_URLのドメイン名と同じドメイン名にしておけば、問題はないように思います。どこでこれらの設定が使われているのか
SANCTUM_STATEFUL_DOMAINS
はEnsureFrontendRequestsAreStateful
クラスのfromFrontent()
で使用されています。php<?php namespace Laravel\Sanctum\Http\Middleware; use Illuminate\Routing\Pipeline; use Illuminate\Support\Collection; use Illuminate\Support\Str; class EnsureFrontendRequestsAreStateful { ... /** * Determine if the given request is from the first-party application frontend. * * @param \Illuminate\Http\Request $request * @return bool */ public static function fromFrontend($request) { $referer = Str::replaceFirst('https://', '', $request->headers->get('referer')); $referer = Str::replaceFirst('http://', '', $referer); $referer = Str::endsWith($referer, '/') ? $referer : "{$referer}/"; $stateful = array_filter(config('sanctum.stateful', [])); return Str::is(Collection::make($stateful)->map(function ($uri) { return trim($uri).'/*'; })->all(), $referer); }まず、以下の1行目をみてみると、リクエストのヘッダから
referer
を取得しています。ここには、ブラウザで入力したhttp://localhost:8000/hogehoge/piyopiyo
が入っており、少しずつ置換されて、3行目でlocalhost:8000/hogehoge/piyopiyo/
となります。$referer = Str::replaceFirst('https://', '', $request->headers->get('referer')); $referer = Str::replaceFirst('http://', '', $referer); $referer = Str::endsWith($referer, '/') ? $referer : "{$referer}/";
$stateful
には["localhost:8000"]
が入るので、コレクション化して、map
関数で["localhost:8000/*"]
を返します。
Str::is()
は、第二引数が第一引数に一致するか(*はワイルドカード)判断します。
localhost:8000/hogehoge/piyopiyo/
はlocalhost:8000/*
に一致するので、true
を返し、無事に処理が進みます。return Str::is(Collection::make($stateful)->map(function ($uri) { return trim($uri).'/*'; })->all(), $referer);ポートを含むURLでアクセスしている場合に、
SANCTUM_STATEFUL_DOMAINS
にポート番号を指定し忘れた場合は、localhost/*
で検索するようになってしまうので、false
となってしまいます。これで、以下のNoteの理由が分かりました。また、
$request
のreferer
と同じドメイン名にする必要があることが理解できました。Note: ポート(127.0.0.1:8000)を含むURLによりアプリケーションにアクセスする場合は、ドメインにポート番号を含める必要があります。
まとめ
SANCTUM_STATEFUL_DOMAINS
はEnsureFrontendRequestsAreStateful
クラスのfromFrontent()
で使用されており、$request
のreferer
と同じドメイン名にする必要があることが分かりました。
SESSION_DOMAIN
に関してはまだ調査中ですので、内容が理解できたら後ほど追記したいと思います。
- 投稿日:2020-10-19T18:47:59+09:00
[Laravel] groupByが実行される前にidが新しいグループ順のデータを取得したい時に「whereIn」が使えた
WhereIn 備忘録
whereInの使い方は、以下のwhereInを参照してください。
https://readouble.com/laravel/6.x/ja/queries.html
SQLのWHERE ~ IN ~ と同じ使い方なので大丈夫だとは思いますが、
SQLだとSELECT * FROM sports WHERE name IN('baseball','football','basketball');のように記述できるところを
DB::table('sports')->whereIn('name', ['baseball', 'football', 'basketball']);というように簡単に記述することができるのです。
本題ですが、
以下のようなテーブルがあり、question_idは別にquestionテーブルがあってリレーションしてる状態です。
question_idは1~3まであるとして、下のテーブルから
id = [4, 5, 6]のデータを取得したいのですが、
groupByを使用すると古い(idが若いもの id = [1,2,6])を取得してきてしまいます。report テーブル
id question_id 1 2 2 1 3 1 4 1 5 2 6 3 そのため、以下のようなコードを実行するとうまくいきました。
reportのidカラム(whereIn第一引数)のなかで、
report question_idでグループ化されたレコードでreportのidが大きいもののリスト(whereIn第二引数)
のデータを取得する。DB::table('report') ->whereIn('report.id', function($query) { $query->select(DB::raw('MAX(report.id)')) ->from('report') ->groupBy('report.question_id'); );もっと他に良い書き方あるはずなんだろうけどとりあえず解決。
- 投稿日:2020-10-19T12:27:55+09:00
Laravelの日本語化ファイルを編集し、バリデーションメッセージの:valueや:dateなどのプレースホルダーを日本語化する
Laravelを日本語化し、言語ファイルのvalidation.phpを編集することで、バリデーションメッセージを日本語化することができます。
attributesメソッドを編集することで英語の属性名も日本語化できるので、例えば年齢入力欄の属性名をageにしていても、
ageには、数字を指定してください。
ではなく、
年齢には、数字を指定してください。
と表示することが可能です。
問題
ただ、attributesメソッドを追加しても、:dateなどのプレースホルダーは日本語化されないため、一部日本語化されない箇所があります。
例えば、以下のような例です。
まず、日本化していない場合はLaravelの言語を日本語に変更の記事に沿って日本語しておきます(インストーラのダウンロードでは対応したバージョンを指定します)。
次に、make:requestコマンドでフォームリクエストクラスを作成します。
CLIphp artisan make:request ExampleRequestバリデーションルールを追加します。
app/Http/Request/ExampleRequest.phppublic function rules() { return [ 'deadline' => 'required|date|after_or_equal:today', ]; }ここでは、deadline(締切日)という属性に、
- 必須
- 日付文字列
- 本日以降
というルールを設定しました。
次に、カスタムバリデーション属性名を設定するため、attributeメソッドを追加します。
resources/lang/ja/validation.php'attributes' => [ 'deadline' => '締切日', ],これによって、例えばrequiredのバリデーションに失敗した場合の表示が
deadlineは必ず指定してください。
から
締切日は必ず指定してください。
という表示に変わります。
:valueや:dateなどのプレースホルダーを日本語に置き換えたい
しかしながら、after_or_equalのバリデーションメッセージは
resources/lang/ja/validation.php'after_or_equal' => ':attributeには、:date以降の日付を指定してください。',となっているため、:dateプレースホルダーの部分は、attributeメソッドでも置き換えられず、after_or_equalのバリデーションに失敗した場合、
締切日には、today以降の日付を指定してください。
という表示になってしまいます。
解決策
:valueや:dateなどのプレースホルダーを変更する場合は、valuesメソッドを使います。
:valueプレースホルダーの変更方法は、ドキュメントの言語ファイルでカスタム値を指定に記載があります。
:dateプレースホルダーの変更は、次のように記述します。
resources/lang/ja/validation.php'values' => [ 'date' => [ 'today' => '本日', ], ],これによって、
締切日には、本日以降の日付を指定してください。
と表示されるようになります。
- 投稿日:2020-10-19T11:52:24+09:00
View 疑問 備忘録
基礎
<!DOCTYPE html> <html> <head> <!-- ファイル・スクリプトの読み込みや、様々なメタ情報 --> </head> <body> <!-- 実際に表示される内容 --> </body> </html>bootstrap
雛形
https://getbootstrap.jp/docs/4.5/getting-started/introduction/
グリットシステム
div class=row
以下に
https://qiita.com/akatsuki174/items/53b7367b04ed0b066bbcard
bootstrap4以降
https://webnetamemo.com/coding/bootstrap4/201711116162#panelsそれ以前はpanelが使用されていた
form
https://qiita.com/AquaMeria/items/fe3fd9ebeb4c7171da3b
HTML
lang属性 書く必要はあまりない
【HTML】metaタグ:『X-UA-Compatible』
【meta X-UA-Compatible】をわざわざ指定する必要はあまりないかもしれません。
https://www.creativevillage.ne.jp/2819nav
https://style.potepan.com/articles/21440.html
container
コンテナ、範囲を定め利用しやすくするため
csrf
- 投稿日:2020-10-19T10:38:32+09:00
php artisan コマンド 備忘録
- 投稿日:2020-10-19T10:28:07+09:00
Laravel8 CRUD処理を使った投稿アプリを作成する その3 投稿保存処理の作成
目的
- 投稿内容を保存する処理を追加する
実施環境
- 筆者の実施環境を記載する。
- ハードウェア環境
項目 情報 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 バージョン 8.6.0 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする 前提条件
- その1の記事の内容が完了していること。
前提情報
- 作成するアプリ名は「laravel8_crud」とする。
- 作成するMySQLのデータベース名は「laravel8_crud_DB」とする。
- 下記に今回の作業のあとのソースコードのリモートリポジトリのリンクを記載する。
- 投稿をデータベースのテーブルに保存したあとリダイレクトするURLはhttp://127.0.0.1:8000/inputとする。
概要
- ルーティング情報の記載
- コントローラファイルの記載
- モデルファイルの作成
- テーブルの作成
- ビューファイルの修正
- 確認
詳細
ルーティング情報の記載
laravel8_crudディレクトリで下記コマンドを実行してルーティングファイルを開く。
$ vi routes/web.php開いたファイルに下記の行を追記する。
laravel8_crud/routes/web.phpRoute::post('/save', [ContentController::class, 'save'])->name('save');追記後のルーティングファイルの内容を下記に記載する。
laravel8_crud/routes/web.php<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\ContentController; /* |-------------------------------------------------------------------------- | 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! | */ Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); Route::get('/input', [ContentController::class, 'input'])->name('input'); // 下記を追記する Route::post('/save', [ContentController::class, 'save'])->name('save');コントローラファイルの記載
laravel8_crudディレクトリで下記コマンドを実行して作成したコントローラファイルを開く。
$ vi app/Http/Controllers/ContentController.php下記の内容をクラス内に追記する。
laravel8_crud/app/Http/Controllers/ContentController.phpuse App\Models\Content; // -----------省略----------- public function save(Request $request) { $input_content = new Content(); $input_content->content = $request['content']; $input_content->save(); return redirect(route('input')); }追記後のコントローラファイルの内容を下記に記載する。
laravel8_crud/app/Http/Controllers/ContentController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // 下記を追記する use App\Models\Content; class ContentController extends Controller { public function input() { return view('contents.input'); } // 下記を追記する public function save(Request $request) { $input_content = new Content(); $input_content->content = $request['content']; $input_content->save(); return redirect(route('input')); } // 上記までを追記する }モデルファイルとマイグレーションファイルの作成
laravel8_crudディレクトリで下記コマンドを実行してモデルファイルとマイグレーションファイルを作成する。
$ php artisan make:model Content --migrationテーブルの作成
laravel8_crudディレクトリで下記コマンドを実行して作成したマイグレーションファイルを開く。(YYYY-MM-DDにはマイグレーションファイル作成日が、XXXXXXにはランダムな数字が入る。)
$ vi database/migrations/YYYY_MM_DD_XXXXXX_create_contents_table.php下記の様に記載を行う。記載後のマイグレーションファイルの内容を下記に記載する。
laravel8_crud/database/migrations/YYYY_MM_DD_XXXXXX_create_contents_table.php<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateContentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('contents', function (Blueprint $table) { $table->id(); // 下記を追記する $table->string('content'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('contents'); } }laravel8_crudディレクトリで下記コマンドを実行してマイグレーションを行い、テーブルを作成する。
$ php artisan migrateビューファイルの修正
laravel8_crudディレクトリで下記コマンドを実行してビューファイルを開く。
vi resources/views/contents/input.blade.php
作成して開いたビューファイルを下記の様に修正する。
laravel8_crud/resources/views/contents/input.blade.php<h1>input</h1> <!-- 下記を修正 --> <form action="{{route('save')}}" method="post"> @csrf <textarea name="content" cols="30" rows="10"></textarea> <input type="submit" value="送信"> </form>確認
laravel8_crudディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serveブラウザで下記にアクセスする。
テキストボックスに何かしらの文字列を入力して「送信」をクリックする。
リダイレクト処理が実行されて今一度http://127.0.0.1:8000/inputのページが表示される。
下記コマンドを実行してMySQLにログインする。(MySQLのrootユーザのパスワードを忘れてしまった方はこちら→Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法)
$ mysql -u root -p下記SQLを実行する。
select * from laravel8_crud_DB.contents;下記の様に出力されれば本記事の作業は完了である。(contentの内容は皆さんがブラウザのテキストボックスに入力した内容)
+----+--------------------------+---------------------+---------------------+ | id | content | created_at | updated_at | +----+--------------------------+---------------------+---------------------+ | 1 | これはテストです | 2020-07-14 07:50:16 | 2020-07-14 07:50:16 | +----+--------------------------+---------------------+---------------------+
- 投稿日:2020-10-19T10:10:52+09:00
[Laravel]ファサード is 何
はじめに
初投稿です。
掌田 津耶乃さん著「PHPフレームワークLaravel入門」を学習中、しばしば意味の分からないワードが出てきていました。
「ファサード」
ワイ「なんだお前(思考停止)」
調べてみると、どうもLaravelに限った用語ではないそうなので、自分なりにまとめてみます。
記事を書く練習にもなるし。ファサードの語源
語源というかそもそもの意味ですが、建築用語で「建築物の正面部分(デザイン)」を意味するフランス語だそうです。
建物の顔、入り口部分といった感じのイメージですかね。
確かに、フランスの古い建築物をググって調べてみると、正面からの見栄えが重視されてる気がします。
ITにおいてのファサード
正確には「ファサードパターン(Facade pattern)」と呼ばれており、コンピュータソフトウェアのデザインパターンの一つとのこと。
デザインパターンとは、wikiに乗ってる情報をまとめると、経験則に基づく典型的なパターンに名前を付け、再利用しやすいようにカタログ化した物、という理解で良いと思います。
話を戻すと、ファサード・パターンとは、単純な操作だけを持ったFacadeクラスを実装し、(メインシステムと異なる)サブシステムを結びつける事を言います。
建物(サブシステム)に対し正面玄関(ファサード)を実装するイメージですね。
これにより、サブシステムの詳細を知らなくてもファサードからサブシステムの機能を呼び出せます。
ファサードパターンのメリット
ファサードを用いることで、ユーザーが必要な機能のみに絞ってサブクラスから呼び出すことができます。
また、ユーザーはサブクラスの詳細を知る必要がないため、サブクラスの実装から解放されます。要はサブクラスの中身は知らないけど、ファサードがあるから簡単に使えるよねって所でしょうか。
この辺は感覚としては分かりますが、言語化するのが難しいです。ユーザー毎に使用するクラスを絞れるというのは明確なメリットだと思います。
ファサードクラスを見るだけでよく使う機能が分かりますし。ちなみに、ファサードパターンはサブクラスの機能を直接呼び出すことを特に制限はしていません。
これは少し意外でした。必要ならファサードで定義されていない機能も使っていいよってことですね。
- 投稿日:2020-10-19T06:08:25+09:00
【備忘録】LaravelでAuthを導入
Laravelのバージョンを確認
ターミナル$ php artisan -vLaravel Framework 7.x もしくは 6.xの場合
①
$ cd ~/[プロジェクトの階層]
まで移動して、
Composerでlaravel/uiパッケージをインストールターミナル$ composer require laravel/ui
② Authの認証に必要なルートとビューをスカフォールド
(スカフォールド(scaffold)...必要なフォルダ構成やソースなどを自動的にセットして、すぐに試せる状態までもっていってくれる)ターミナル$ php artisan ui vue --auth
③ 必要なJavaScriptパッケージをインストールターミナル$ npm install && npm run dev
npm install
→ package.jsonに書かれた設定に基づいて、必要なJavaScriptパッケージをダウンロード・インストールするコマンド。
npm run dev
→ それらをコンパイルして実行可能な状態にするコマンド。
④ マイグレーションしてAuthの導入完了!ターミナル$ php artisan migrate
Laravel Framework 5.xの場合
下記のコマンドを実行していくだけ!ターミナル$ cd ~/[プロジェクトの階層] $ php artisan make:auth $ php artisan migrate参考記事
- 投稿日:2020-10-19T03:39:46+09:00
Laravel 6.x 【エラー】 Base table or view not found: 1146 Table 対応方法
制作環境
Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
MDBootstrap : 4.19.1
chart.js : 2.9.3
XAMPP
PHP : 7.4.3
Visual Studio Codeはじめに
この記事はプログラミングをはじめたばかりの素人が、できたことをメモするのに利用しています。
内容には誤りがあるかもしれません。Base table or view not found: 1146 Table
発生のタイミング 内容・症状 php artisan コマンドでオリジナルコマンドにてテーブルの作成をした時に発生。 テーブルの作成がエラーでできない。 原因
参照しにいったテーブルが見つからない為。
解決方法
作成したテーブルのモデルに以下を追記。
protected $table = 'テーブル名';
- 投稿日:2020-10-19T03:26:15+09:00
【Laravel】ユニットテストのファイルを生成した時 にDatabase [mysql] not configured. が出た時の対処法
エラー状況
Laravelのユニットテストを実行するためにターミナルからテストファイルを生成しようとした時にエラーが出てしまい、生成ができずに行き詰まる。
以下のコマンドでテストファイルの生成を実行しようとする。
$ php artisan make:test SampleTestBut!!
Database [mysql] not configured. と表示され、生成ができない状態。
原因
vender/laravel/framework/src/illminate/Database/DatabaseManager.php
の該当lineを覗いてみるが、問題なさそう。というかよくわからない。ここでさっきCirclCIを設定した時にconfig/database.phpを変更した事を思い出したので
そのファイルを確認したみると、一番下にこの記述をしている。database.php'connections' => [ 'circle_test' => [ 'driver' => 'mysql', 'host' => '127.0.0.1', 'port' => '3306', 'database' => 'circle_test', 'username' => 'ubuntu', 'password' => '', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ]CircleCI用に設定したコードですが、また新しく'connections'作って記述してました、、、
一旦このコードを全て消して、再度ターミナルからテストファイルを生成したら
普通にうまくいきました!!総括
今回は単純な記述ミスによるエラーでした。
ただ同じエラーが発生した場合はconfig/database.php内の記述を疑ってみてください。
ググっても答えが出てこなかったので、参考になればと思います。
- 投稿日:2020-10-19T03:08:31+09:00
Laravel 【初心者】 PHPフレームワーク Laravel入門 第2版 の内容を一部図式化してみた件 ⑥ビューコンポーザクラス
はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。PHPフレームワーク Laravel入門 第2版 について
Laravelを独学で学ぶにあたり、評判がよかったのでAmazon Kindleで購入しました。
内容も色々な方法が書いてあるので、Laravelをはじめて勉強される方にはおすすめの本です。Amazon リンク
https://www.amazon.co.jp/gp/product/B08625YD7H/ref=ppx_yo_dt_b_d_asin_image_o09?ie=UTF8&psc=1図式化について
学習中に、文字だけだとイメージが掴みづらかったので、自分の為に作成したものです。
また方法が色々あり過ぎて混乱したので、整理する意味もあります。
ディレクトリを覚えるのにも使いました。コードは必要なものだけ抜粋しているので、全てではありません。
これだけ見ても勉強にはならないので、PHPフレームワーク Laravel入門 第2版を是非購入してみて下さい。※ちなみに著者の方とは何の関係もありません。
素人が作成した物なので、参考程度に使ってください。
ビューコンポーザクラス
- 投稿日:2020-10-19T03:03:31+09:00
Laravel 【初心者】 PHPフレームワーク Laravel入門 第2版 の内容を一部図式化してみた件 ⑤コレクションビュー
はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。PHPフレームワーク Laravel入門 第2版 について
Laravelを独学で学ぶにあたり、評判がよかったのでAmazon Kindleで購入しました。
内容も色々な方法が書いてあるので、Laravelをはじめて勉強される方にはおすすめの本です。Amazon リンク
https://www.amazon.co.jp/gp/product/B08625YD7H/ref=ppx_yo_dt_b_d_asin_image_o09?ie=UTF8&psc=1図式化について
学習中に、文字だけだとイメージが掴みづらかったので、自分の為に作成したものです。
また方法が色々あり過ぎて混乱したので、整理する意味もあります。
ディレクトリを覚えるのにも使いました。コードは必要なものだけ抜粋しているので、全てではありません。
これだけ見ても勉強にはならないので、PHPフレームワーク Laravel入門 第2版を是非購入してみて下さい。※ちなみに著者の方とは何の関係もありません。
素人が作成した物なので、参考程度に使ってください。
コレクションビュー
- 投稿日:2020-10-19T02:57:19+09:00
Laravel 【初心者】 PHPフレームワーク Laravel入門 第2版 の内容を一部図式化してみた件 ④サービスとビューコンポーザ
はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。PHPフレームワーク Laravel入門 第2版 について
Laravelを独学で学ぶにあたり、評判がよかったのでAmazon Kindleで購入しました。
内容も色々な方法が書いてあるので、Laravelをはじめて勉強される方にはおすすめの本です。Amazon リンク
https://www.amazon.co.jp/gp/product/B08625YD7H/ref=ppx_yo_dt_b_d_asin_image_o09?ie=UTF8&psc=1図式化について
学習中に、文字だけだとイメージが掴みづらかったので、自分の為に作成したものです。
また方法が色々あり過ぎて混乱したので、整理する意味もあります。
ディレクトリを覚えるのにも使いました。コードは必要なものだけ抜粋しているので、全てではありません。
これだけ見ても勉強にはならないので、PHPフレームワーク Laravel入門 第2版を是非購入してみて下さい。※ちなみに著者の方とは何の関係もありません。
素人が作成した物なので、参考程度に使ってください。
サービスとビューコンポーザ
- 投稿日:2020-10-19T02:49:38+09:00
Laravel 【初心者】 PHPフレームワーク Laravel入門 第2版 の内容を一部図式化してみた件 ③サブビュー
はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。PHPフレームワーク Laravel入門 第2版 について
Laravelを独学で学ぶにあたり、評判がよかったのでAmazon Kindleで購入しました。
内容も色々な方法が書いてあるので、Laravelをはじめて勉強される方にはおすすめの本です。Amazon リンク
https://www.amazon.co.jp/gp/product/B08625YD7H/ref=ppx_yo_dt_b_d_asin_image_o09?ie=UTF8&psc=1図式化について
学習中に、文字だけだとイメージが掴みづらかったので、自分の為に作成したものです。
また方法が色々あり過ぎて混乱したので、整理する意味もあります。
ディレクトリを覚えるのにも使いました。コードは必要なものだけ抜粋しているので、全てではありません。
これだけ見ても勉強にはならないので、PHPフレームワーク Laravel入門 第2版を是非購入してみて下さい。※ちなみに著者の方とは何の関係もありません。
素人が作成した物なので、参考程度に使ってください。
サブビュー
- 投稿日:2020-10-19T02:45:04+09:00
Laravel 【初心者】 PHPフレームワーク Laravel入門 第2版 の内容を一部図式化してみた件 ②コンポーネント
はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。PHPフレームワーク Laravel入門 第2版 について
Laravelを独学で学ぶにあたり、評判がよかったのでAmazon Kindleで購入しました。
内容も色々な方法が書いてあるので、Laravelをはじめて勉強される方にはおすすめの本です。Amazon リンク
https://www.amazon.co.jp/gp/product/B08625YD7H/ref=ppx_yo_dt_b_d_asin_image_o09?ie=UTF8&psc=1図式化について
学習中に、文字だけだとイメージが掴みづらかったので、自分の為に作成したものです。
また方法が色々あり過ぎて混乱したので、整理する意味もあります。
ディレクトリを覚えるのにも使いました。コードは必要なものだけ抜粋しているので、全てではありません。
これだけ見ても勉強にはならないので、PHPフレームワーク Laravel入門 第2版を是非購入してみて下さい。※ちなみに著者の方とは何の関係もありません。
素人が作成した物なので、参考程度に使ってください。
コンポーネント
- 投稿日:2020-10-19T02:36:08+09:00
Laravel 【初心者】 PHPフレームワーク Laravel入門 第2版 の内容を一部図式化してみた件 ①セクション
はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。PHPフレームワーク Laravel入門 第2版 について
Laravelを独学で学ぶにあたり、評判がよかったのでAmazon Kindleで購入しました。
内容も色々な方法が書いてあるので、Laravelをはじめて勉強される方にはおすすめの本です。Amazon リンク
https://www.amazon.co.jp/gp/product/B08625YD7H/ref=ppx_yo_dt_b_d_asin_image_o09?ie=UTF8&psc=1図式化について
学習中に、文字だけだとイメージが掴みづらかったので、自分の為に作成したものです。
また方法が色々あり過ぎて混乱したので、整理する意味もあります。
ディレクトリを覚えるのにも使いました。コードは必要なものだけ抜粋しているので、全てではありません。
これだけ見ても勉強にはならないので、PHPフレームワーク Laravel入門 第2版を是非購入してみて下さい。※ちなみに著者の方とは何の関係もありません。
素人が作成した物なので、参考程度に使ってください。
セクション
- 投稿日:2020-10-19T01:30:05+09:00
Laravel 6.x Route::resource で追加されるルーティングとポリシーのメソッドとの対応をまとめてみた
はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。Route::resource( 'URI', 'コントローラ名' );
ルーティングをひとまとめにしたメソッド。
引数1 で割り当てるアドレスを指定する。
引数2 でそれによって呼び出される処理(コントローラー)を指定する。追加されるルーティングとポリシーとの対応
ルーティング 内容 ポリシーのメソッドとの対応 index 一覧表示 viewAny create 登録画面表示 create store 登録処理 create show 個別表示 view edit 更新画面表示 update update 更新処理 update destroy 削除処理 destroy
- 投稿日:2020-10-19T01:02:46+09:00
Windows環境上にLinuxを構築。laradockを導入してMigrationするまでの手順
開発環境
Laravel 7.20.0
PHP 7.4
MYSQL 8.0.21
Windows version 2004全体のおおまかな流れ
- Ubuntu導入
- WSL2に更新・導入
- dockerインストール
- laradock導入
本記事のゴール
本記事はWindows環境上にWSL2を用いてLinux環境を構築し、Laradockを導入して画面の表示+Migrationすることを目標としています。
まずはUbuntu導入準備から
Windowsを最新状態にアップデート(下記URLでダウンロード)
https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-update
PCの設定から開発者モードに変更
• 「設定(スタートボタンの歯車アイコン)」-「更新とセキュリティ」-「開発者向け」を選択
• 「開発者向け機能を使う」欄の「開発者モード」を選択して有効化追加機能でSubsystem for Linuxを有効化
• 「コントロールパネル」-「プログラム」-「Windowsの機能の有効化または無効化」を選択
• 一覧のなかから「Windows Subsystem for Linux(Beta)」にチェックを入れるwindows version2004の場合は表記が「Linux用Windowsサブシステム」に変更しているためそれを有効化してください。
PC再起動
Ubuntuのインストール
UbuntuとはLinuxディストリビューションの1つであり、フリーソフトウェアとして提供されている
Microsoft storeでubunntuをインストール。
コマンドプロンプトでbashと入力。(Ubuntuにログイン出来たら成功)
続いてUbuntuの状態を最新にします。
$ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo apt-get autoremove
GitとPHPを取得
普通にインストールすると古いバージョンのGitがインストールされるので、リポジトリを追加して最新のものを取得。
下記コマンドを実行。
$ sudo apt-get install build-essential $ sudo add-apt-repository ppa:git-core/ppa $ sudo apt-get update $ sudo apt-get install git $ git --version //最新になっていたらOK git version 2.28.0
PHP
※PHP--version 7.4を指定しています。
$sudo apt-get install php7.4 php7.4-fpm php7.4-mysql php7.4-mbstring php7.4-gd $ php -v //指定したバージョンがインストールされているかを確認 PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
WSL2の事前準備
WSL2とはLinuxカーネルが動作する「本物のLinux環境」
「Windows PowerShell」の中の「Windows PowerShell」を「管理者として実行」して下記コマンドを実行
PS C:\>dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
PS C:\>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
PCを再起動
バージョンの確認C:¥> ver Microsoft Windows [Version 10.0.19041.84]
バージョンが10.0.18917以上であることを確認
デフォルトをWSL2に設定するため、下記コマンドを実行。C:¥> wsl --set-version ubuntu 2WSL2に切り替わっているか確認。
C:¥> wsl -l -v NAME STATE VERSION * Ubuntu Stopped 2
WSL2を導入したのでDockerを構築するうえでの事前準備は完了
Dockerのインストール
DockerとはLinux コンテナの作成と使用を実現するオープンソースのコンテナ化技術
下記URLからDocker Desktop Edgeをインストール
https://docs.docker.com/docker-for-windows/wsl-tech-preview/
PC再起動
再起動後、タスクバーのdockerアイコンから「setting」を選択
「Enable the experimental WSL2 based engine」にチェックを入れ「Appli&Restart」をクリック再起動が終わってnotificationと表示されたらOK
続いて、ResourcesのWSLIntegration内の「Enable WSL Integration」をクリック
「Ubuntu」を選択して「Appli&Restart」をクリック
Dockerの動作確認
C:\Users\magic>wsl -d ubuntu $ docker -v Docker version 19.03.5, build 633a0ea838
####Hello Worldと表示されれば成功$ docker run hello-world To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details. Hello from Docker!Laradock導入
本番環境に必要なパッケージを提供してくれる。Homesteadをより細かく分割したようなもの
前提
Laradockも含めて1プロジェクト1リポジトリで管理したいので下記構成。
──project_dir ├ app //laravel ディレクトリ │ ├ app │ │ bootstrap │ └ .env │ └ Laradock
Laradockをgit clone
$git clone https://github.com/Laradock/laradock.git
設定ファイル(env-exampl)をコピーして.envを生成
$ cd laradock $ cp env-example .env
コピーしたenv(Laradock.env)ファイルの編集
指定したいプロジェクトを指定
APP_CODE_PATH_HOST=../ APP_CODE_PATH_HOST=../プロジェクト名/
データの保存ディレクトリを指定
DATA_PATH_HOST=~/.laradock/data + DATA_PATH_HOST=.laradock/data
プロジェクト名の設定
laradockを使ったプロジェクトを複数作る場合、プロジェクト名が同じ場合、過去に作った同じ名前のコンテナイメージが上書きされてしまいまうため、被らない名前を設定
COMPOSE_PROJECT_NAME=laradock + COMPOSE_PROJECT_NAME=
MYSQLの設定
MySQLは8系になってパスワードの生成方法が変わったらしくLaravelから操作できないため下記記述を追記。
/lardock/mysqmy.cnfに下記を追加
// [mysqld]のエリアに追記する(デフォルトの場合一番下) default_authentication_plugin=mysql_native_password
Laravel.envの設定
DBの設定を合わせて変更します
※DB_HOSTはdocker-compose.ymlに書かれているコンテナ内名を指定します。DB_CONNECTION=mysql DB_HOST=mysql(既存だと127.001になっていると思うのでmysqlに修正) DB_PORT=3306 DB_DATABASE=default DB_USERNAME=default DB_PASSWORD=secret
Laradockの起動
下記コマンドでlaradockを起動します。 引数には起動したいミドルウェアを指定
なお、projectが存在しない場合はroot権限で作成されてしまうため、必ず作成した状態で起動すること
$ docker-compose up -d nginx mysql workspace
起動確認
$ docker-compose ps
Dockerコンテナ内からLaravelをインストール
dockerコンテナ内からlaravelをインストールする方法と、設定。
下記コマンドでWorkspaceコンテナに入る。
※userオプションでユーザを指定してください。
$ docker-compose exec --user=laradock workspace /bin/bash
コンテナ内で下記を実行してLaravelをインストール。
/var/www$ composer create-project --prefer-dist laravel/laravel .
インストール完了したところで動作確認。
(※3306portを他に使用している場合はportが競合するためタスクマネージャーなどでportを終了させてください)Windows側のブラウザで、http://localhostにアクセスします。
画面が表示されればインストール完了
マイグレーションの確認
MySQLの設定が完了したか、マイグレーションで確認してみましょう。下記のようにDBにテーブルが作成されれば成功
/var/www$ php artisan migrate Migration table created successfully. Migrating: 2014_10_19000000_create_users_table Migrated: 2014_1019000000_create_users_table (0.36 seconds) Migrating: 2014_1019100000_create_password_resets_table Migrated: 2014_1019100000_create_password_resets_table (0.35 seconds) Migrating: 20191019_000000_create_failed_jobs_table Migrated: 201910_19_000000_create_failed_jobs_table (0.1 seconds)
終わりに
今回はWindows環境にLaradockを導入するまでの流れを記事として投稿しました
それと来月でプログラミングを始めてから一年経つこともあり、当初よりも知見が深まったこともあるので、これから少しずつ技術記事を上げていこうと思います。
どうかよろしくお願いいたしますm(._.)m
- 投稿日:2020-10-19T01:02:46+09:00
Windows環境上にLinuxを構築。Laradockを導入してMigrationするまでの手順
開発環境
Laravel 7.20.0
PHP 7.4
MYSQL 8.0.21
Windows version 2004全体のおおまかな流れ
- Ubuntu導入
- WSL2に更新・導入
- dockerインストール
- laradock導入
本記事のゴール
本記事はWindows環境上にWSL2を用いてLinux環境を構築し、Laradockを導入して画面の表示+Migrationすることを目標としています。
まずはUbuntu導入準備から
Windowsを最新状態にアップデート(下記URLでダウンロード)
https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-update
PCの設定から開発者モードに変更
• 「設定(スタートボタンの歯車アイコン)」-「更新とセキュリティ」-「開発者向け」を選択
• 「開発者向け機能を使う」欄の「開発者モード」を選択して有効化追加機能でSubsystem for Linuxを有効化
• 「コントロールパネル」-「プログラム」-「Windowsの機能の有効化または無効化」を選択
• 一覧のなかから「Windows Subsystem for Linux(Beta)」にチェックを入れるwindows version2004の場合は表記が「Linux用Windowsサブシステム」に変更しているためそれを有効化してください。
PC再起動
Ubuntuのインストール
UbuntuとはLinuxディストリビューションの1つであり、フリーソフトウェアとして提供されている
Microsoft storeでubunntuをインストール。
コマンドプロンプトでbashと入力。(Ubuntuにログイン出来たら成功)
続いてUbuntuの状態を最新にします。
$ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo apt-get autoremove
GitとPHPを取得
普通にインストールすると古いバージョンのGitがインストールされるので、リポジトリを追加して最新のものを取得。
下記コマンドを実行。
$ sudo apt-get install build-essential $ sudo add-apt-repository ppa:git-core/ppa $ sudo apt-get update $ sudo apt-get install git $ git --version //最新になっていたらOK git version 2.28.0
PHP
※PHP--version 7.4を指定しています。
$sudo apt-get install php7.4 php7.4-fpm php7.4-mysql php7.4-mbstring php7.4-gd $ php -v //指定したバージョンがインストールされているかを確認 PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
WSL2の事前準備
WSL2とはLinuxカーネルが動作する「本物のLinux環境」
「Windows PowerShell」の中の「Windows PowerShell」を「管理者として実行」して下記コマンドを実行
PS C:\>dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
PS C:\>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
PCを再起動
バージョンの確認C:¥> ver Microsoft Windows [Version 10.0.19041.84]
バージョンが10.0.18917以上であることを確認
デフォルトをWSL2に設定するため、下記コマンドを実行。C:¥> wsl --set-version ubuntu 2WSL2に切り替わっているか確認。
C:¥> wsl -l -v NAME STATE VERSION * Ubuntu Stopped 2
WSL2を導入したのでDockerを構築するうえでの事前準備は完了
Dockerのインストール
DockerとはLinux コンテナの作成と使用を実現するオープンソースのコンテナ化技術
下記URLからDocker Desktop Edgeをインストール
https://docs.docker.com/docker-for-windows/wsl-tech-preview/
PC再起動
再起動後、タスクバーのdockerアイコンから「setting」を選択
「Enable the experimental WSL2 based engine」にチェックを入れ「Appli&Restart」をクリック再起動が終わってnotificationと表示されたらOK
続いて、ResourcesのWSLIntegration内の「Enable WSL Integration」をクリック
「Ubuntu」を選択して「Appli&Restart」をクリック
Dockerの動作確認
C:\Users\magic>wsl -d ubuntu $ docker -v Docker version 19.03.5, build 633a0ea838
####Hello Worldと表示されれば成功$ docker run hello-world To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details. Hello from Docker!Laradock導入
本番環境に必要なパッケージを提供してくれる。Homesteadをより細かく分割したようなもの
前提
Laradockも含めて1プロジェクト1リポジトリで管理したいので下記構成。
──project_dir ├ app //laravel ディレクトリ │ ├ app │ │ bootstrap │ └ .env │ └ Laradock
Laradockをgit clone
$git clone https://github.com/Laradock/laradock.git
設定ファイル(env-exampl)をコピーして.envを生成
$ cd laradock $ cp env-example .env
コピーしたenv(Laradock.env)ファイルの編集
指定したいプロジェクトを指定
APP_CODE_PATH_HOST=../ APP_CODE_PATH_HOST=../プロジェクト名/
データの保存ディレクトリを指定
DATA_PATH_HOST=~/.laradock/data + DATA_PATH_HOST=.laradock/data
プロジェクト名の設定
laradockを使ったプロジェクトを複数作る場合、プロジェクト名が同じ場合、過去に作った同じ名前のコンテナイメージが上書きされてしまいまうため、被らない名前を設定
COMPOSE_PROJECT_NAME=laradock + COMPOSE_PROJECT_NAME=
MYSQLの設定
MySQLは8系になってパスワードの生成方法が変わったらしくLaravelから操作できないため下記記述を追記。
/lardock/mysqmy.cnfに下記を追加
// [mysqld]のエリアに追記する(デフォルトの場合一番下) default_authentication_plugin=mysql_native_password
Laravel.envの設定
DBの設定を合わせて変更します
※DB_HOSTはdocker-compose.ymlに書かれているコンテナ内名を指定します。DB_CONNECTION=mysql DB_HOST=mysql(既存だと127.001になっていると思うのでmysqlに修正) DB_PORT=3306 DB_DATABASE=default DB_USERNAME=default DB_PASSWORD=secret
Laradockの起動
下記コマンドでlaradockを起動します。 引数には起動したいミドルウェアを指定
なお、projectが存在しない場合はroot権限で作成されてしまうため、必ず作成した状態で起動すること
$ docker-compose up -d nginx mysql workspace
起動確認
$ docker-compose ps
Dockerコンテナ内からLaravelをインストール
dockerコンテナ内からlaravelをインストールする方法と、設定。
下記コマンドでWorkspaceコンテナに入る。
※userオプションでユーザを指定してください。
$ docker-compose exec --user=laradock workspace /bin/bash
コンテナ内で下記を実行してLaravelをインストール。
/var/www$ composer create-project --prefer-dist laravel/laravel .
インストール完了したところで動作確認。
(※3306portを他に使用している場合はportが競合するためタスクマネージャーなどでportを終了させてください)Windows側のブラウザで、http://localhostにアクセスします。
画面が表示されればインストール完了
マイグレーションの確認
MySQLの設定が完了したか、マイグレーションで確認してみましょう。下記のようにDBにテーブルが作成されれば成功
/var/www$ php artisan migrate Migration table created successfully. Migrating: 2014_10_19000000_create_users_table Migrated: 2014_1019000000_create_users_table (0.36 seconds) Migrating: 2014_1019100000_create_password_resets_table Migrated: 2014_1019100000_create_password_resets_table (0.35 seconds) Migrating: 20191019_000000_create_failed_jobs_table Migrated: 201910_19_000000_create_failed_jobs_table (0.1 seconds)
終わりに
今回はWindows環境にLaradockを導入するまでの流れを記事として投稿しました
それと来月でプログラミングを始めてから一年経つこともあり、当初よりも知見が深まったこともあるので、これから少しずつ技術記事を上げていこうと思います。
どうかよろしくお願いいたしますm(._.)m