20201019のlaravelに関する記事は21件です。

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バージョンで構築します

まずは認証系を作っていきましょう

下記参考記事をなぞりながら認証機能を導入していきます

参考:Laravel 6.x laravel/uiを利用してbootstrap 4を適用する

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サービス。メール関係の実装のテストなんかに気軽に使えて便利です。

参考:2020-09-05 yps学習記録その6

簡単にできてしまった方は追加機能開発をしてみるのがおススメです。(結構沼れます)
- タスクのソート機能
- 期限を過ぎたタスクの色変更
- メールでの期限通知
- 検索機能
- ユーザーにタスクを紐づけ
- その他モロモロ

参考:Laravel-Todoアプリに一週間機能追加チャレンジ

私は
- ソート機能(ライブラリ使用)
- 表示色変更
- ユーザーに紐づけ(自分の物しか見られない)
上記に加えて下記参考リンクのカレンダー機能をガッチャンコしてみました(これがかなりの沼だった…)

参考:Laravelの教科書:カレンダーアプリを作ろう

具体的には上記参考リンクの臨時休業の設定に当たる部分を流用して簡易的なシフトの入力(日勤、夜勤、休み)を入力できるようにしました。
もう少し発展させて管理者画面から操作できるようにしてあげればシフト管理アプリとしても使えそうですね…今後の課題として作り込みをゆっくりやっていきたいと思います。

Task6は結構カスタマイズのしがいもあると思うので、是非色々自分好みのカスタマイズを行ってみましょう!

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

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にはポート番号も含めた値を指定します。

.env
SANCTUM_STATEFUL_DOMAINS=localhost:8000
SESSION_DOMAIN=localhost

Dusk環境

次にDuskテスト時の設定になります。私の開発環境では、以下の設定で正しく動作するようになりました。

.env
APP_URL=http://web

SANCTUM_STATEFUL_DOMAINS=web
SESSION_DOMAIN=web

私の場合は、開発環境にDockerを用いており、nginxとchromedriverは別のコンテナで起動しています。そのため、localhostのままでは認証されず、認証時にエラーが発生しました。
これに関しては、APP_URLのドメイン名と同じドメイン名にしておけば、問題はないように思います。

どこでこれらの設定が使われているのか

SANCTUM_STATEFUL_DOMAINSEnsureFrontendRequestsAreStatefulクラスの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の理由が分かりました。また、$requestrefererと同じドメイン名にする必要があることが理解できました。

Note: ポート(127.0.0.1:8000)を含むURLによりアプリケーションにアクセスする場合は、ドメインにポート番号を含める必要があります。

まとめ

SANCTUM_STATEFUL_DOMAINSEnsureFrontendRequestsAreStatefulクラスのfromFrontend()で使用されており、$requestrefererと同じドメイン名にする必要があることが分かりました。
SESSION_DOMAINに関してはまだ調査中ですので、内容が理解できたら後ほど追記したいと思います。

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

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にはポート番号も含めた値を指定します。

.env
SANCTUM_STATEFUL_DOMAINS=localhost:8000
SESSION_DOMAIN=localhost

次にDuskテスト時の設定になります。私の開発環境では、以下の設定で正しく動作するようになりました。

.env
APP_URL=http://web

SANCTUM_STATEFUL_DOMAINS=web
SESSION_DOMAIN=web

私の場合は、開発環境にDockerを用いており、nginxとchromedriverは別のコンテナで起動しています。そのため、localhostのままでは認証されず、認証時にエラーが発生しました。
これに関しては、APP_URLのドメイン名と同じドメイン名にしておけば、問題はないように思います。

どこでこれらの設定が使われているのか

SANCTUM_STATEFUL_DOMAINSEnsureFrontendRequestsAreStatefulクラスの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の理由が分かりました。また、$requestrefererと同じドメイン名にする必要があることが理解できました。

Note: ポート(127.0.0.1:8000)を含むURLによりアプリケーションにアクセスする場合は、ドメインにポート番号を含める必要があります。

まとめ

SANCTUM_STATEFUL_DOMAINSEnsureFrontendRequestsAreStatefulクラスのfromFrontent()で使用されており、$requestrefererと同じドメイン名にする必要があることが分かりました。
SESSION_DOMAINに関してはまだ調査中ですので、内容が理解できたら後ほど追記したいと思います。

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

[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');
    );

もっと他に良い書き方あるはずなんだろうけどとりあえず解決。

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

Laravelの日本語化ファイルを編集し、バリデーションメッセージの:valueや:dateなどのプレースホルダーを日本語化する

Laravelを日本語化し、言語ファイルのvalidation.phpを編集することで、バリデーションメッセージを日本語化することができます。

attributesメソッドを編集することで英語の属性名も日本語化できるので、例えば年齢入力欄の属性名をageにしていても、

ageには、数字を指定してください。

ではなく、

年齢には、数字を指定してください。

と表示することが可能です。

問題

ただ、attributesメソッドを追加しても、:dateなどのプレースホルダーは日本語化されないため、一部日本語化されない箇所があります。

例えば、以下のような例です。

まず、日本化していない場合はLaravelの言語を日本語に変更の記事に沿って日本語しておきます(インストーラのダウンロードでは対応したバージョンを指定します)。

次に、make:requestコマンドでフォームリクエストクラスを作成します。

CLI
php artisan make:request ExampleRequest

バリデーションルールを追加します。

app/Http/Request/ExampleRequest.php
public 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' => '本日',
    ],
],

これによって、

締切日には、本日以降の日付を指定してください。

と表示されるようになります。

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

View 疑問 備忘録

基礎

参考 https://wemo.tech/79

<!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/53b7367b04ed0b066bb

card

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/2819

nav

https://style.potepan.com/articles/21440.html

container

コンテナ、範囲を定め利用しやすくするため

csrf

https://qiita.com/wanko5296/items/142b5b82485b0196a2da

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

php artisan コマンド 備忘録

コントローラー作成

php artisan make:controller XxxControllerでも十分だが、

php artisan make:controller XxxController --resource

の方が、登録・更新・参照・削除など必要なメソッドを用意してくれるため作業速度が上がるぞ。

Migration・Modelの作成

個別に作成しても問題ないが、名前をつける手間・ミスなどをなくすためにもなるぞ。

php artisan make:model Xxx --migration
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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とする。

概要

  1. ルーティング情報の記載
  2. コントローラファイルの記載
  3. モデルファイルの作成
  4. テーブルの作成
  5. ビューファイルの修正
  6. 確認

詳細

  1. ルーティング情報の記載

    1. laravel8_crudディレクトリで下記コマンドを実行してルーティングファイルを開く。

      $ vi routes/web.php 
      
    2. 開いたファイルに下記の行を追記する。

      laravel8_crud/routes/web.php
      Route::post('/save', [ContentController::class, 'save'])->name('save');
      
    3. 追記後のルーティングファイルの内容を下記に記載する。

      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');
      
  2. コントローラファイルの記載

    1. laravel8_crudディレクトリで下記コマンドを実行して作成したコントローラファイルを開く。

      $ vi app/Http/Controllers/ContentController.php 
      
    2. 下記の内容をクラス内に追記する。

      laravel8_crud/app/Http/Controllers/ContentController.php
      use App\Models\Content;
      // -----------省略-----------
      public function save(Request $request)
      {
          $input_content = new Content();
          $input_content->content = $request['content'];
          $input_content->save();
      
          return redirect(route('input'));
      }
      
    3. 追記後のコントローラファイルの内容を下記に記載する。

      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'));
          }
          // 上記までを追記する
      }
      
  3. モデルファイルとマイグレーションファイルの作成

    1. laravel8_crudディレクトリで下記コマンドを実行してモデルファイルとマイグレーションファイルを作成する。

      $ php artisan make:model Content --migration
      
  4. テーブルの作成

    1. laravel8_crudディレクトリで下記コマンドを実行して作成したマイグレーションファイルを開く。(YYYY-MM-DDにはマイグレーションファイル作成日が、XXXXXXにはランダムな数字が入る。)

      $ vi database/migrations/YYYY_MM_DD_XXXXXX_create_contents_table.php
      
    2. 下記の様に記載を行う。記載後のマイグレーションファイルの内容を下記に記載する。

      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');
          }
      }
      
    3. laravel8_crudディレクトリで下記コマンドを実行してマイグレーションを行い、テーブルを作成する。

      $ php artisan migrate
      
  5. ビューファイルの修正

    1. laravel8_crudディレクトリで下記コマンドを実行してビューファイルを開く。

      vi resources/views/contents/input.blade.php
      
    2. 作成して開いたビューファイルを下記の様に修正する。

      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>
      
  6. 確認

    1. laravel8_crudディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    2. ブラウザで下記にアクセスする。

    3. テキストボックスに何かしらの文字列を入力して「送信」をクリックする。

      127_0_0_1_8000_input.png

    4. リダイレクト処理が実行されて今一度http://127.0.0.1:8000/inputのページが表示される。

      127_0_0_1_8000_input.png

    5. 下記コマンドを実行してMySQLにログインする。(MySQLのrootユーザのパスワードを忘れてしまった方はこちら→Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法)

      $ mysql -u root -p
      
    6. 下記SQLを実行する。

      select * from laravel_crud_DB.contents;
      
    7. 下記の様に出力されれば本記事の作業は完了である。(contentの内容は皆さんがブラウザのテキストボックスに入力した内容)

      +----+--------------------------+---------------------+---------------------+
      | id | content                  | created_at          | updated_at          |
      +----+--------------------------+---------------------+---------------------+
      |  1 | これはテストです             | 2020-07-14 07:50:16 | 2020-07-14 07:50:16 |
      +----+--------------------------+---------------------+---------------------+
      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel]ファサード is 何

はじめに

初投稿です。

掌田 津耶乃さん著「PHPフレームワークLaravel入門」を学習中、しばしば意味の分からないワードが出てきていました。

「ファサード」

ワイ「なんだお前(思考停止)」

調べてみると、どうもLaravelに限った用語ではないそうなので、自分なりにまとめてみます。
記事を書く練習にもなるし。

ファサードの語源

語源というかそもそもの意味ですが、建築用語で「建築物の正面部分(デザイン)」を意味するフランス語だそうです。

建物の顔、入り口部分といった感じのイメージですかね。

確かに、フランスの古い建築物をググって調べてみると、正面からの見栄えが重視されてる気がします。

ITにおいてのファサード

正確には「ファサードパターン(Facade pattern)」と呼ばれており、コンピュータソフトウェアのデザインパターンの一つとのこと。

デザインパターンとは、wikiに乗ってる情報をまとめると、経験則に基づく典型的なパターンに名前を付け、再利用しやすいようにカタログ化した物、という理解で良いと思います。

話を戻すと、ファサード・パターンとは、単純な操作だけを持ったFacadeクラスを実装し、(メインシステムと異なる)サブシステムを結びつける事を言います。

建物(サブシステム)に対し正面玄関(ファサード)を実装するイメージですね。

これにより、サブシステムの詳細を知らなくてもファサードからサブシステムの機能を呼び出せます。

ファサードパターンのメリット

ファサードを用いることで、ユーザーが必要な機能のみに絞ってサブクラスから呼び出すことができます。
また、ユーザーはサブクラスの詳細を知る必要がないため、サブクラスの実装から解放されます。

要はサブクラスの中身は知らないけど、ファサードがあるから簡単に使えるよねって所でしょうか。
この辺は感覚としては分かりますが、言語化するのが難しいです。

ユーザー毎に使用するクラスを絞れるというのは明確なメリットだと思います。
ファサードクラスを見るだけでよく使う機能が分かりますし。

ちなみに、ファサードパターンはサブクラスの機能を直接呼び出すことを特に制限はしていません。
これは少し意外でした。

必要ならファサードで定義されていない機能も使っていいよってことですね。

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

【備忘録】LaravelでAuthを導入

Laravelのバージョンを確認

ターミナル
$ php artisan -v

Laravel 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

参考記事

【公式】Laravel 7.x 認証

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

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 = 'テーブル名';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ユニットテストのファイルを生成した時 にDatabase [mysql] not configured. が出た時の対処法

エラー状況

Laravelのユニットテストを実行するためにターミナルからテストファイルを生成しようとした時にエラーが出てしまい、生成ができずに行き詰まる。

以下のコマンドでテストファイルの生成を実行しようとする。

$ php artisan make:test SampleTest

But!!

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内の記述を疑ってみてください。
ググっても答えが出てこなかったので、参考になればと思います。

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

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版を是非購入してみて下さい。

※ちなみに著者の方とは何の関係もありません。

素人が作成した物なので、参考程度に使ってください。

ビューコンポーザクラス

viewcom.jpg

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

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版を是非購入してみて下さい。

※ちなみに著者の方とは何の関係もありません。

素人が作成した物なので、参考程度に使ってください。

コレクションビュー

collection.jpg

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

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版を是非購入してみて下さい。

※ちなみに著者の方とは何の関係もありません。

素人が作成した物なので、参考程度に使ってください。

サービスとビューコンポーザ

service.jpg

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

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版を是非購入してみて下さい。

※ちなみに著者の方とは何の関係もありません。

素人が作成した物なので、参考程度に使ってください。

サブビュー

sub.jpg

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

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版を是非購入してみて下さい。

※ちなみに著者の方とは何の関係もありません。

素人が作成した物なので、参考程度に使ってください。

コンポーネント

component.jpg

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

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版を是非購入してみて下さい。

※ちなみに著者の方とは何の関係もありません。

素人が作成した物なので、参考程度に使ってください。

セクション

section.jpg

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

Laravel 6.x Route::resource で追加されるルーティングとポリシーのメソッドとの対応をまとめてみた

はじめに

この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。

Route::resource( 'URI', 'コントローラ名' );

ルーティングをひとまとめにしたメソッド。
引数1 で割り当てるアドレスを指定する。
引数2 でそれによって呼び出される処理(コントローラー)を指定する。

追加されるルーティングとポリシーとの対応

ルーティング 内容 ポリシーのメソッドとの対応
index 一覧表示 viewAny
create 登録画面表示 create
store 登録処理 create
show 個別表示 view
edit 更新画面表示 update
update 更新処理 update
destroy 削除処理 destroy
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 2

WSL2に切り替わっているか確認。

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

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

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 2

WSL2に切り替わっているか確認。

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

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