0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

投稿機能 (実務未経験状態でLaravelを使用した共同開発 タスク4)

Posted at

0.背景

本記事は、記事「実務未経験状態でLaravelを使用した共同開発」で取り組んだタスクのうち、投稿機能についてまとめたもの

1.仕様内容

・トップページに投稿フォーム作成
・テキストエリアへ入力、投稿ボタンでpostsテーブルへ保存
・空欄では投稿不可(バリデーション)
・ユーザがログイン状態のみ投稿フォーム表示

UI ※デプロイしたもの

top1.png

2.タスクの見積もり

期間

・7日

理由

・メンバーのタスクがマージによるコンフリクト解消期間を考慮
・他メンバーの作業によるコンフリクト発生の可能性を想定
・実装中のエラー対応やレビュー対応時間も含めて算出

実績

・仕様作成完了 4日
・PR完了 4日
・PRレビュー後修正 5日
・マージ完了 7日

3.実装

①routing
・web.php
・PostControllerのstoreメソッドを使用
・ログインユーザーのみが利用できるよう、auth ミドルウェアを適用
・投稿関連のルーティングを /posts にまとめるため prefix を使用

Route::group(['middleware' => 'auth'], function(){
    Route::prefix('/posts')->group(function(){
        Route::post('/','PostsController@store')->name('post.store'); // 新規登録処理
    });
});

②Model
・Post.php
・保存対象カラムの指定($fillable)
・User モデルとのリレーション設定(1対多)

    protected $fillable = ['user_id', 'content'];
    public function user()
    {
        return $this->belongsTo(User::class);
    }

・User.php
・Post モデルとのリレーション設定(1対多)

    public function posts()
    {
        return $this->hasMany(Post::class);
    }

③Controller
・PostsControllerを作成
・storeメソッドを記述
・PostRequest を使ってバリデーション処理を行う
・投稿保存処理を store メソッドに記述
・トップページへ戻る

    public function store(PostRequest $request)
    {
        Post::create([
            'user_id' => auth()->id(),
            'content' => $request->validated()['content'],
        ]);

        return redirect('/');
    }

④FormRequest
・PostRequestを作成
・空投稿、141字以上の投稿を弾くバリデーション設定

public function authorize()
    {
        return true;
    }
    
    public function rules()
    {
        return [
            'content' => ['required', 'max:140'],
        ];
    }

    public function messages()
    {
        return [
            'content.required' => '内容は必須です。',
            'content.max' => '投稿は140文字以内で入力してください。',
        ];
    }

⑤view
・posts/add_post.blade.phpを作成しトップページの該当箇所へinclude
@csrf を使用してCSRF対策
・route('post.store') で投稿処理へ接続

<div class="text-center mb-3">
    <form method="POST" action="{{ route('post.store') }}" class="d-inline-block w-75">
        @csrf
        <div class="form-group">
            <textarea class="form-control" name="content">{{ old('content') }}</textarea>
            <div class="text-left mt-3">
                <button type="submit" class="btn btn-primary">投稿する</button>
            </div>
        </div>
    </form>
</div>

4.テスト実施

・ログイン状態でのみ投稿画面表示を確認
・投稿機能の確認
・空欄投稿や140文字超の投稿時にエラーメッセージが表示されることを確認

5.PRレビュー

・他メンバーのPRと一部内容が重複・矛盾していたため、自分のコードを修正
・該当PRの仕様・影響範囲も確認しながら対応を実施

6.本実装に関して

・再利用性:投稿フォームを部分テンプレートとしてカプセル化したことで、他画面でも再利用可能な設計にできた
・他メンバーのタスクとの連携・影響確認や、コンフリクト解消のプロセスを通じて、チーム開発における調整の重要性を学んだ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?