目的
- laravel8にて超絶簡単なCRUD処理を含んだWebアプリを作る方法をまとめる
環境
- ハードウェア環境
項目 | 情報 |
---|---|
OS | macOS Big Sur(11.6) |
ハードウェア | 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.11 | Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする |
Laravel バージョン | 8.X | commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う |
MySQLバージョン | 8.0.21 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする |
概要
- 投稿型SNSの超絶簡易版的なものを作ってWebアプリの基礎であるCRUDを学ぶ。
- 認証機能無し
- 画像アップロード無し
- とにかく文字だけ投稿できるようにする。
- ただ、依存注入、サービスクラス、リポジトリクラスなどを用いて実装を行う。
- そのため作り的には超絶簡単ではあるが、もしかすると初心者向けじゃないかもしれません。
- 他にももっと良い実装方法があるはずなので、参考の一部としていただきたい。
- Macに直接laravel・MySQLローカル環境を構築してアプリを作成した。
- 本laravel8アプリのソース
方法
-
アプリの作成
-
任意のディレクトリで下記コマンドを実行してlaravel8のプロジェクトを作成する。
$ composer create-project "laravel/laravel=8.*" laravel8_easy_crud -vvv
-
-
MySQLにてテーブルの作成と.envの紹介
-
MySQLにて
laravel8_easy_crud
テーブルを作成する。 -
下記のように.envファイルに記載する。(MySQLの情報の部分は皆さんの環境に合っている情報を記載してください。)
laravel8_easy_curd/.envAPP_NAME=Laravel8_easy_crud APP_ENV=local APP_KEY=base64:JAeeSV6U8967eYtwwcKLjS/kXjEKBZECcfXVPLXG834= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel8_easy_crud DB_USERNAME=皆さんのMySQLの読み書き権限のあるユーザー名 DB_PASSWORD=皆さんのMySQLの読み書き権限のあるユーザーのパスワード BROADCAST_DRIVER=log CACHE_DRIVER=file FILESYSTEM_DRIVER=local QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 MEMCACHED_HOST=127.0.0.1 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
-
-
ルーティングの記入
-
ルーティング情報を下記のように記載する。
laravel8_easy_crud/routes/web.php<?php use App\Http\Controllers\ContentController; use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | 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'); }); Route::prefix('contents')->group(function() { Route::get('/list', [ContentController::class, 'list'])->name('contents.list'); Route::get('/create', [ContentController::class, 'create'])->name('contents.create'); Route::get('/update/{content_id}', [ContentController::class, 'update'])->name('contents.update'); Route::get('/delete/{content_id}', [ContentController::class, 'delete'])->name('contents.delete'); Route::post('/save', [ContentController::class, 'save'])->name('contents.save'); });
-
-
コントローラーの記載
-
ContentController.php
を作成して下記のように記載する。laravel8_easy_crud/app/Http/Controllers/ContentController.php<?php namespace App\Http\Controllers; use App\Services\ContentService; use Facade\FlareClient\View; use Illuminate\Http\Request; use App\Http\Requests\ContentRequest; class ContentController extends Controller { public function __construct( ContentService $contentService ) { $this->contentService = $contentService; } /** * 投稿一覧ページの表示 * * @return view */ public function list() { $content_infos = $this->contentService->getAllContentList(); return view('contents.list', ['content_infos' => $content_infos]); } /** * 新規投稿作成 * * @return view */ public function create() { return view('contents.create'); } /** * 投稿編集 * * @param integer $content_id * @return view */ public function update(int $content_id) { $content_info = $this->contentService->getContentInfoByContentId($content_id); return view('contents.update', ['content_info' => $content_info]); } /** * 投稿削除 * * @param integer $content_id * @return view */ public function delete(int $content_id) { $this->contentService->delete($content_id); return redirect(route('contents.list')); } /** * 新規作成・投稿編集の情報保存 * * @param ContentRequest $post_data * @return view */ public function save(ContentRequest $post_data) { $this->contentService->save($post_data); return redirect(route('contents.list')); } }
-
-
サービスクラスの記載
-
ContentService.php
を作成して下記のように記載する。laravel8_easy_crud/app/Services/ContentService.php
-
新規投稿
@csrf @error('content') {{ $message }}@enderror ``` 1. `list.blade.php`を作成して下記のように記載する。 ```laravel8_easy_crud/resource/views/contents/list.blade.php 投稿一覧
投稿内容
@foreach ($content_infos as $content_info){{ $content_info->content }}
{{ $content_info->updated_at }}
編集
削除
@endforeach ``` 1. `update.blade.php`を作成して下記のように記載する。 ```laravel8_easy_crud/resource/views/contents/update.blade.php 編集
編集
@csrf @error('content') {{ $message }}@enderror {{ $content_info->content }} ``` 1. リクエストの記載 1. `ContentRequest.php`を作成して下記のように記載する。 ```laravel8_easy_crud/app/Http/Requests/ContentRequest.php ['required'], ]; } } ``` 1. マイグレーションファイルの記載 1. contentsテーブルを作成するためのマイグレーションファイルを用意する。 1. 下記のように記載する。 ```laravel8_easy_crud/database/migrations/YYYY_MM_DD_XXXXXX_create_contents_table.php id(); $table->text('content')->comment('投稿内容'); $table->unsignedTinyInteger('deleted_flag')->default(0)->comment('削除フラグ デフォルト:0 削除:1'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('contents'); } } ``` 1. 下記コマンドをlaravel8_easy_crudディレクトリで実行してマイグレーションを実行する。 ```terminal $ php artisan migrate ``` 1. シーダーの記載 1. `ContentSeeder.php`を作成して下記のように記載する。 ```laravel8_easy_crud/database/seeders/ContentSeeder.php $content, 'deleted_flag' => 0, 'created_at' => $now, 'updated_at' => $now, ]; DB::table('contents')->insert($info); } } } ``` 1. `DatabaseSeeder.php`を開いて下記のように記載する。 ```laravel8_easy_crud/database/seeders/DatabaseSeeder.php create(); $this->call(ContentSeeder::class); } } ``` 1. 下記コマンドをlaravel8_easy_crudディレクトリで実行してシーダーを作動させる。 ```terminal $ php artisan db:seed ``` 1. 確認 1. `$ php artisan serve`コマンドにてローカルサーバーを起動する。 1. [http://127.0.0.1:8000/contents/list](http://127.0.0.1:8000/contents/list)にアクセスする 。 1. 下記の様に表示されることを確認する。 ![投稿一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/5cc4b1b3-8d34-2e3b-85a8-90e06fcf7b12.png) 1. 「新規投稿」 をクリックする。 ![投稿一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/bb0ff137-01e7-2b82-92ee-d2ff3f09c79b.png) 1. テキストエリアになにか入力して「投稿」をクリックする。 ![新規投稿.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/bd14db19-95a8-b071-d6cf-68f83855e965.png) 1. 投稿一覧ページの最下部に今投稿した内容が追加される。 ![投稿一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/351f7f70-d83c-3b7b-6bec-537863cd0292.png) 1. 任意の投稿の「編集」をクリックする。 ![投稿一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7fa3db1c-8b8e-0169-2508-2416bc43280e.png) 1. テキストエリアにすでに投稿されている内容が初期値として格納されている。何かしらの編集をして「保存」をクリックする。 ![編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8d879d62-9b02-b207-9743-1f7f2e49135b.png) 1. 投稿一覧ページで確認すると編集内容が反映されている。 ![スクリーンショット_2021_11_30_9_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/95e79302-a2fa-54fc-c728-e102eed94ccb.png) 1. 「削除」をクリックすると当該の投稿が投稿一覧ページに表示されなくなる。 ![スクリーンショット_2021_11_30_9_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/149d1fda-0ac8-d898-ab85-e8401efaac11.png)