①認証機能設定
composer require laravel/ui
php artisan ui bootstrap --auth
②Bootstrapの公式ページにて、Compiled CSS and JS ファイルをダウンロード
https://getbootstrap.jp/docs/4.4/getting-started/download/
JSフォルダの中のbootstrap.min.js 、CSSフォルダの中のbootstrap.min.cssを取り出し、プロジェクトのpublicフォルダの中にjsフォルダ、cssフォルダをそれぞれ作り、この中にいれる
③resources/layouts/app.blade.phpファイルを開き以下追加
{{-- 追加する --}} <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet"> <script src="{{ asset('js/bootstrap.min.js') }}" defer></script>
④タイムゾーンと言語の変更
config内のapp.phpファイルを開き70行目あたりに ‘timezone’を ‘Asia/Tokyo’ とし83行目あたりの ‘locale’ を ‘ja’ とする
⑤プロジェクトの日本語化
https://github.com/Laravel-Lang/lang 【Code】からDownload ZIPを実行
locales/ja/ja.jsonファイルを取り出しresource/langの中にいれる。
⑥警告メッセージの日本語化
下記を順番に実行
php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
⑦ルート設定の変更
app/Providersの中のRouteServiceProvider.phpファイルを開く
29行目の// protected の//を外して有効にする
⑧モデルとDB作成
下記を実行
php artisan make:model Post -m
コマンド実施後、databaseフォルダの中の【本日の日付_create_posts_table.php】ファイルを開き下記のように入力
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->text('image')->nullable();
$table->timestamps();
});
}
マイグレートを実行
php artisan migrate
実行したマイグレーションの操作をやり直したい時は、ロールバックコマンド
php artisan migrate:rollback
⑨リレーションの設定
app/Models から Post.php ファイルを開き
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
を入れる
12行目あたりに、次のコードを入れる
【Post.php】
class Post extends Model
{
use HasFactory;
public function user() {
return $this->belongsTo('App\Models\User');
}
}
次に app/ModelsからUser.phpファイルを開き、下記を入れる
【User.php】
public function posts() {
return $this->hasMany('App\Models\Post');
}
⑩作成したテーブルの中にカラムを追加する
php artisan make:migration add_column_user_id_to_posts_table --table=posts
実行後、databaseフォルダの中に【本日の日付 add_column_user_table_to_posts_table.php】ファイルができるのでファイルを開き、17行目あたりに、新たなuser_idカラムを追加
【日付 add_column_user_table_to_posts_table.php】
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id')->after('image');
});
}
ファイル下部の public function down に、取り消した場合の処理を入れる
【日付 add_column_user_table_to_users_table.php】
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('user_id');
});
}
準備ができたら、
php artisan migrate
phpMyAdminにログインして、postsテーブルにuser_idカラムが追加されてるか確認
11 Laravelのビューファイルの作成
resources/viewsのなかに、【post】フォルダを作りこの中に 【create.blade.php】ファイルを作る
【create.blade.php】
@extends('layouts.app') @section('content') <div class="row"> <div class="col-md-10 mt-6"> <div class="card-body"> <h1 class="mt-4">新規投稿</h1> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach @if(empty($errors->first('image'))) <li>画像ファイルがあれば、再度、選択してください。</li> @endif </ul> </div> @endif @if(session('message')) <div class="alert alert-success">{{session('message')}}</div> @endif <form method="post" action="{{route('post.store')}}" enctype="multipart/form-data"> @csrf <div class="form-group"> <label for="title">件名</label> <input type="text" name="title" class="form-control" id="title" value="{{old('title')}}" placeholder="Enter Title"> </div> <div class="form-group"> <label for="body">本文</label> <textarea name="body" class="form-control" id="body" cols="30" rows="10">{{old('body')}}</textarea> </div> <div class="form-group"> <label for="image">画像(1MBまで)</label> <div class="col-md-6"> <input id="image" type="file" name="image"> </div> </div> <button type="submit" class="btn btn-success">送信する</button> </form> </div> </div> </div> @endsection
12. リソースコントローラー作成
php artisan make:controller PostController --resource
コマンド実行後、app/Http/Controller の中に PostController.php ファイルができる
PostController.phpファイルを開きuse文の下にもう一つ、下記のuse宣言を入れておく
use Illuminate\Http\Request;
use App\Models\Post;
createメソッドに、次のように入力
【PostController.php】
class PostController extends Controller
{
public function create()
{
return view('post.create');
}
}
13. ルート設定
routes の中のweb.phpファイルをひらきファイルの一番下に、下記を追加
【web.php】
Route::resource('/post', 'PostController');
14. 投稿データを保存するためのコントローラーの処理
app/modelsの中のPost.phpファイルを開き、use HasFactory;のすぐ下に下記を入力
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title',
'body',
'user_id',
'image',
];
app/Http/Controllersの中のPostControllerを開く
storeメソッドの一番最初に、下記を入れる
public function store(Request $request)
{
$inputs=$request->validate([
'title'=>'required|max:255',
'body'=>'required|max:255',
'image'=>'image|max:1024'
]);
$post=new Post();
$post->title=$inputs['title'];
$post->body=$inputs['body'];
$post->user_id=auth()->user()->id;
$post->save();
return back()->with('message', '投稿を作成しました');
}
15 画像の保存
storageフォルダに保存した画像をpublicフォルダを通じてアクセスするために、publicフォルダにstorageフォルダのシンボリックリンクが必要
プロジェクトフォルダ内で
php artisan storage:link
実行
コマンド実行後、publicフォルダを開くとstorageフォルダへのリンクが貼られます。
16 画像保存処理を追加
app/Http/Controllersの中のPostControllerを開き
public function store(Request $request)
{
$inputs=request()->validate([
'title'=>'required|max:255',
'body'=>'required|max:255',
'image'=>'image|max:1024'
]);
$post=new Post();
$post->title=$inputs['title'];
$post->body=$inputs['body'];
$post->user_id=auth()->user()->id;
if (request('image')){
$original = request()->file('image')->getClientOriginalName();
// 日時追加
$name = date('Ymd_His').'_'.$original;
request()->file('image')->move('storage/images', $name);
$post->image = $name;
}
$post->save();
return back()->with('message', '投稿を作成しました');
}
① 元々のファイル名を取得し、これを$nameに代入する
② $nameの名前で画像ファイルを指定した場所に保存する
③ $nameの名前で画像ファイルのファイル名をデータベースに保存する
画像の送信テストをおこないアップロード後、データベースをチェックpostsテーブルを確認
元々のファイル名で画像ファイルが登録されていれば、成功
publicフォルダの中のstorageへのリンクをクリックし
imageフォルダが出来ており、imageフォルダの中に投稿した画像が保存されていれば成功
17 一覧画面の作成
home画面を使って、一覧画面を表示する
routesの中のweb.phpファイル
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
設定の最後に、上記のように ->name(‘home’)を付けておく
次に、app/Http/Controllersの中の HomeController.php を開く
下記のuse宣言を加える
use App\Models\Post;
HomeController内のindexメソッドを編集
【HomeController.php】
public function index(){ $posts=Post::all(); $user=auth()->user(); return view('home', compact('posts', 'user')); }
18 一覧画面表示ファイルを作成
resources/viewsの中の home.blade.phpファイルを開き次のコードを入れる
@extends('layouts.app') @section('content') {{$user->name}}さん、こんにちは! @foreach ($posts as $post) <div class="container-fluid mt-20" style="margin-left:-10px;"> <div class="row"> <div class="col-md-12"> <div class="card mb-4"> <div class="card-header"> <div class="media flex-wrap w-100 align-items-center"> <div class="media-body ml-3"> {{ $post->title }} <div class="text-muted small"> {{ $post->user->name }}</div> </div> <div class="text-muted small ml-3"> <div>投稿日</div> <div><strong>{{$post->created_at->diffForHumans()}}</strong></div> </div> </div> </div> <div class="card-body"> <p>{{$post->body}} </p> </div> </div> </div> </div> </div> @endforeach @endsection
19 データの並び順を変える
【HomeController.php】
public function index(){ $posts=Post::orderBy('created_at','desc')->get(); $user=auth()->user(); return view('home', compact('posts', 'user')); }
20 CSSの適用
テンプレートを取得
BBBootstrap Forum discussion:
https://bbbootstrap.com/snippets/forum-discussion-template-65198141
上記サイトを開き、CSSタブのコードをコピー
Laravelのプロジェクト内のpublic/css フォルダの中にforum.cssファイルを作成
作成したforum.cssファイルに、先ほどコピーしたCSSコードを貼り付け
forum.cssファイルをプロジェクトに紐づけ
resources/views/layouts の中の app.blade.phpファイルを開き
タグの前あたり
【app.blade.php】
<!-- Styles --> <link href="{{ asset('css/app.css') }}" rel="stylesheet"> <link href="{{ asset('css/forum.css') }}" rel="stylesheet"> </head> <body>
21 サイドバー用のビューページを作成
resources/views/layoutsの中に、sidebar.blade.phpファイルを新規作成
【sidebar.blade.php】
<div class="list-group"> <a href="{{route('home')}}" class='list-group-item'> <i class="fas fa-home pr-2"></i><span>一覧表示</span> </a> <a href="{{route('post.create')}}" class='list-group-item'> <i class="fas fa-pen-nib pr-2"></i><span>新規投稿</span> </a> </div>
22 サイドバーをテンプレートページに入れ込む
resouces/reviews/layouts の中のapp.blade.phpを開き
ファイル下のほうのmainタグのあたりを下記のように変更
【app.blade.php】
<main class="py-4"> <div class="container"> <div class="row"> <div class="col-12 col-md-4 col-lg-3"> @include('layouts.sidebar') </div> <div class="col-12 col-md-8 col-lg-9"> @yield('content') </div> </div> </div> </main>
現在地のメニューの色を変える方法
今いるメニューの色を変えたりしたい場合には、sidebar.blade.phpファイルを次のように変えましょう。
【sidebar.blade.php】
<div class="list-group"> <a href="{{route('home')}}" class="list-group-item {{url()->current()==route('home')? 'active' : ''}}"> <i class="fas fa-home pr-2"></i><span>一覧表示</span> </a> <a href="{{route('post.create')}}" class="list-group-item {{url()->current()==route('post.create')? 'active' : ''}}"> <i class="fas fa-pen-nib pr-2"></i><span>新規投稿</span> </a> </div>
23. 投稿を個別表示
投稿の一覧表示のタイトルにリンクを付けておき、タイトルをクリックすると個別ページに飛ぶようにする
resources/viewsの中の home.blade.phpファイルを開く
【home.blade.php】
<a href="{{route('post.show', $post)}}">{{ $post->title }}</a>
個別表示ページのコントローラ作成
app/Http/Controllersの中のPostController.phpを開く
【PostController.php】
public function show(Post $post) { return view('post.show', compact('post')); }
個別ページのビュー作成
resources/views/post の中に show.blade.phpファイルを作成
【show.blade.php】
@extends('layouts.app') @section('content') <div class="card mb-4"> <div class="card-header"> <div class="text-muted small mr-3"> {{$post->user->name}} </div> <h4>{{$post->title}}</h4> </div> <div class="card-body"> <p class="card-text"> {{$post->body}} </p> @if ($post->image) <div> (画像ファイル:{{$post->image}}) </div> <img src="{{asset('storage/images/'.$post->image)}}" class="img-fluid mx-auto d-block" style="height:300px;"> @endif </div> <div class="card-footer"> <span class="mr-2 float-right"> 投稿日時 {{$post->created_at->diffForHumans()}} </span> </div> </div> @endsection
24 投稿の編集
個別ページにボタンを付け、ボタンをクリックしたら編集ページが表示されるようにする
resources/views/post の中の show.blade.phpファイルを開く
{{$post->title}} の下に、下記のコードを追加
【show.blade.php】
<h4>{{ $post->title }}</h4> <span class="ml-auto"> <a href="{{route('post.edit', $post)}}"><button class="btn btn-primary">編集</button></a> </span>
編集用のコントローラーを作成
app/Http/Controllersの中の PostController.phpを開き、editメソッドを次のように編集
public function edit(Post $post) { return view('post.edit', compact('post')); }
編集ページの作成
resources/views/postの中に、edit.blade.phpファイルを作成
以前作成した create.blade.phpファイルをそのままコピーして貼り付け
件名部分に、現在データベースに保存されている内容が表示されるようにする。
inputタグ内のvalue属性の中にあるold()関数の第2引数に、次のように $post->title を加える
old関数を使うことで、バリデーションエラーが起こったときには、エラー前に入力した値が表示され、それ以外のときには、第2引数の値が表示されるようになる
@extends('layouts.app') @section('content') <div class="row"> <div class="col-md-10 mt-6"> <div class="card-body"> <h1 class="mt4">投稿編集</h1> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach @if(empty($errors->first('image'))) <li>画像ファイルがあれば、再度、選択してください。</li> @endif </ul> </div> @endif @if(session('message')) <div class="alert alert-success">{{session('message')}}</div> @endif <form method="post" action="{{route('post.store')}}" enctype="multipart/form-data"> @csrf <div class="form-group"> <label for="title">件名</label> <input type="text" name="title" class="form-control" value="{{old('title', $post->title)}}" id="title" placeholder="Enter Title"> </div> <div class="form-group"> <label for="body">本文</label> <textarea name="body" class="form-control" id="body" cols="30" rows="10">{{old('body', $post->body)}} </textarea> </div> <div class="form-group"> <div> @if($post->image) <img src="{{ asset('storage/images/'.$post->image)}}" class="img-fluid rmx-auto d-block" style="height:200px;"> @endif </div> <label for="image">画像(1MBまで)</label> <div class="col-md-6"> <input id="image" type="file" name="image"> </div> </div> <button type="submit" class="btn btn-success">送信する</button> </form> </div> </div> </div> @endsection
25 投稿の更新
上記のedit.blade.phpファイルのフォームタグを次のように修正
<form method="post" action="{{route('post.update', $post)}}" enctype="multipart/form-data"> @csrf @method('put')
コントローラーの編集
app/Http/Controllersの中のPostController.phpを開く
【PostController.php】
public function update(Request $request, Post $post) { $inputs=$request->validate([ 'title'=>'required|max:255', 'body'=>'required|max:255', 'image'=>'image|max:1024' ]); $post->title=$inputs['title']; $post->body=$inputs['body']; if(request('image')){ $original=request()->file('image')->getClientOriginalName(); $name=date('Ymd_His').'_'.$original; $file=request()->file('image')->move('storage/images', $name); $post->image=$name; } $post->save(); return back()->with('message', '投稿を更新しました'); }
26 投稿の削除
resources/views/postの中の show.blade.phpファイルに削除ボタンを追加
【show.blade.php】
<span class="ml-auto"> <a href="{{route('post.edit', $post)}}"><button class="btn btn-primary">編集</button></a> </span> <span class="ml-2"> <form method="post" action="{{route('post.destroy', $post)}}"> @csrf @method('delete') <button type="submit" class="btn btn-danger" onClick="return confirm('本当に削除しますか?');">削除</button> </form> </span>
formタグのmethod属性にはpost を指定して、form開始タグの下に @method(‘delete’) を入れる
またルート設定の中に $post パラメータを設置
コントローラーの編集
app/Http/Controllersの中のPostController.phpを開く
destroyメソッドに、次のようにコードを加える
【PostController.php】
public function destroy(Post $post) { $post->delete(); return redirect()->route('home')->with('message', '投稿を削除しました'); }
処理が終わった後はredirectを使って、投稿一覧画面に戻る
resources/views の中の home.blade.php ファイルの上部に、メッセージを表示するためのコードを入れる
【home.blade.php】
@extends('layouts.app') @section('content') @if(session('message')) <div class="alert alert-success">{{session('message')}}</div> @endif <div class="ml-2 mb-3"> home </div>
コメント