developer's diary

最近はc#のエントリが多いです

gitに記録しながらlaravel8.xプロジェクト作成の記録 (7)

mitsugeek.net

の続き

コントローラの作成

make:controllerコマンドで、コントローラを作成します。

php artisan make:controller TaskController

結果、以下のようなメッセージがコンソールに出力されます。

Controller created successfully.

作成されたファイルを確認

以下のような空っぽのコントローラが作成されました。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TaskController extends Controller
{
    //
}

githubに反映

githubへの反映の流れは、(1)ステージング、(2)コミット、(3)プッシュ。この流れの操作は省略します。

画像は、githubに反映された様子。

f:id:mitsugi-bb:20210322003800p:plain

ルーティングの作成

以下のルーティングを作成します。

method ルーティング コントローラクラス メソッド ルート名
Get /task/list TaskController list task_list
Get /task/add TaskController add task_add
Get /task/edit/{id} TaskController edit task_edit
Get /task/delete/{id} TaskController confirm task_confirm
Post /task/update TaskController update task_update
Post /task/delete TaskController delete task_delete
<?php

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\TaskController;
/*
|--------------------------------------------------------------------------
| 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('top');
})->name('top');

//一覧表示
Route::get('/task/list', [TaskController::class, 'list'])->name("task_list");

//追加用フォーム
Route::get('/task/add', [TaskController::class, 'add'])->name("task_add");

//編集用フォーム
Route::get('/task/edit/{id}', [TaskController::class, 'edit'])->name("task_edit");

//削除確認用フォーム
Route::get('/task/delete/{id}', [TaskController::class, 'confirm'])->name("task_confirm");

//更新処理
Route::post('/task/update', [TaskController::class, 'update'])->name("task_update");

//削除処理
Route::post('/task/delete', [TaskController::class, 'delete'])->name("task_delete");

コントローラにメソッド追加

ルーティングにマッチするクラスを作成 それぞれ処理を記述

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Task;

class TaskController extends Controller
{
    /**
     * 一覧表示
     *
     * @param Request $request
     * @return void
     */
    public function list(Request $request)
    {
        $tasks = Task::all();
        return view("task.list", compact("tasks"));
    }

    /**
     * 新規作成用フォーム
     *
     * @param Request $request
     * @return void
     */
    public function add(Request $request)
    {
        $task = new Task();
        return view("task.edit", compact("task"));
    }

    /**
     * 更新用フォーム
     *
     * @param Request $request
     * @param [type] $id
     * @return void
     */
    public function edit(Request $request, $id)
    {
        $id = decrypt($id);
        $task = Task::find($id);
        return view("task.edit", compact("task"));
    }

    /**
     * 追加処理・更新処理
     *
     * @param Request $request
     * @return void
     */
    public function update(Request $request)
    {
        $validatedData = $request->validate([
            "name" => "required|min:3|max:100",
        ], [
            "name.required" => "タスク名を入力してください。",
            "name.min" => "タスク名には3文字以上を入力してください。",
            "name.max" => "タスク名は100文字以内で入力してください。"
        ]);

        $id = $request->input("id");
        $id = decrypt($id);
        $task = empty($id) ? new Task() : Task::find($id);
        $task->name = $validatedData["name"];
        $task->save();

        return redirect(route("task_list"));
    }

    /**
     * 削除確認画面
     *
     * @param Request $request
     * @param [type] $id
     * @return void
     */
    public function confirm(Request $request, $id)
    {
        $id = decrypt($id);
        $task = Task::find($id);
        return view("task.confirm", compact("task"));
    }

    /**
     * 削除処理
     *
     * @param Request $request
     * @return void
     */
    public function delete(Request $request)
    {
        $id = $request->input("id");
        $id = decrypt($id);
        $task = Task::find($id);
        $task->delete();
        return redirect(route("task_list"));
    }
}

viewの追加(list.blade.php)

一覧表示用のビューを作成

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>タスク一覧</title>
    <style>
    table {border-collapse:  collapse;}
    th,td {border: solid 1px;}
    th {background-color:lightgray;}
    </style>
</head>
<body>
    <div>
        <a href="{{route("top")}}">トップページ</a>
    </div>

    <div>
        <a href="{{route("task_add")}}">[新規作成]</a>
    </div>

    <table style="width:500px;">
        <tr>
            <th style="width:50px;">id</th>
            <th>タスク名</th>
            <th style="width:100px;">操作</th>
        </tr>
    @if($tasks->isEmpty())
        <tr>
            <td colspan="3">登録されていません。</td>
        </tr>
    @else
        @foreach($tasks as $task)
            <tr>
                <td style="text-align:center;">{{$task->id}}</td>
                <td style="text-align:left;">{{$task->name}}</td>
                <td style="text-align:center;">
                    <a href="{{route("task_edit", encrypt($task->id))}}">[編集]</a>
                    <a href="{{route("task_confirm", encrypt($task->id))}}">[削除]</a>
                </td>
            </tr>
        @endforeach
    @endif
    </table>
</body>
</html>

viewの追加(edit.blade.php)

新規追加、編集用のビューを作成

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>{{ empty($task->id) ? "タスク追加": "タスク編集" }}</title>
    <style>
    table {border-collapse:  collapse;}
    th,td {border: solid 1px;}
    th {background-color:lightgray;}
    </style>
</head>
<body>
    <div>
        <a href="{{route('task_list')}}">[戻る]</a>
    </div>
    <form action="{{route("task_update")}}" method="post">
        @csrf
        <input type="hidden" name="id" value="{{old("id", encrypt($task->id ?? ""))}}" />

        <table style="width:500px;">
            <tr>
                <th style="width:100px;">タスク名</th>
                <td>
                    <input type="text" name="name" value="{{old("name", $task->name)}}" style="width:98%;" />
                </td>
            </tr>
            @error("name")
                <tr>
                    <td colspan="2">
                        <span style="color:red;">{{$message}}</span>
                    </td>
                </tr> 
            @enderror
        </table>


        <p><input type="submit" value="登録" /></p>

    </form>
</body>
</html>

viewの追加(confirm.blade.php)

削除確認用のビューを作成

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>delete confirm Task</title>
    <style>
    table {border-collapse:  collapse;}
    th,td {border: solid 1px;}
    th {background-color:lightgray;}
    </style>
</head>
<body>
    <div>
        <a href="{{route('task_list')}}">[戻る]</a>
    </div>
    <form action="{{route("task_delete")}}" method="post">
        @csrf
        <input type="hidden" name="id" value="{{encrypt($task->id)}}" />
        <table style="width:500px;">
            <tr>
                <th style="width:100px;">タスク名</th>
                <td>
                    {{$task->name}}
                </td>
            </tr>
        </table>
        <p><input type="submit" value="削除" /></p>
    </form>
</body>
</html>

トップページにリンク追加

トップページにタスク一覧のリンクを追加する

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>トップページ</title>
</head>
<body>

    <h1>トップページ</h1>

    <ul>
        <li><a href="{{route("top")}}">トップページ</a></li>
        <li><a href="{{route("task_list")}}">タスク一覧</a></li>
    </ul>
</body>
</html>

githubに反映

上記内容を(1) ステージング、(2)コミット、(3) プッシュの流れで、githubに反映

f:id:mitsugi-bb:20210322021154p:plain

pullリクエスト作成

修正中のブランチを、mainブランチに取り込む準備

f:id:mitsugi-bb:20210322021337p:plain

f:id:mitsugi-bb:20210322021648p:plain

プルリクを作成した時に、issueの番号を含めると、issueにプルリクが紐づく

f:id:mitsugi-bb:20210322022036p:plain

pullリクエストを取り込む

f:id:mitsugi-bb:20210322022250p:plain

f:id:mitsugi-bb:20210322022347p:plain

ブランチを削除する

f:id:mitsugi-bb:20210322022447p:plain

メインブランチ確認

mainブランチのコミット数が増えていることを確認

f:id:mitsugi-bb:20210322022607p:plain

ブランチのコミットの内容がそのまま、mainブランチのコミットとして取り込まれている。

f:id:mitsugi-bb:20210322022651p:plain

issueをクローズする

f:id:mitsugi-bb:20210322023029p:plain

visual Studio Codeのブランチをmainに戻してみる。

f:id:mitsugi-bb:20210322024502p:plain

f:id:mitsugi-bb:20210322025154p:plain

git pull するとエラーになる

f:id:mitsugi-bb:20210322025424p:plain

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> main

エラーを解決する(ブランチを合わせる)

git branch --set-upstream-to=origin/main main

pullする。

git pull

以上で終了。

リポジトリはこちら

github.com