laravel5.7で簡単なSNSを作ってみた。その1
1, アカウントのメール認証はしない。認証しないメアドとパスワードだけ(無限にアカウントが作れる)
2, twitterみたいに文字だけの投稿
3, 他ユーザをフォローできる
4, DMが送れる。
これだけあれば、とりあえずSNSっぽいだろ。たぶん…。
1, laravel標準のユーザ認証を使う。
1 |
php artisan make:auth |
2, これだけでログイン画面や新規アカウント登録画面が生成される(/login)
routes/web.php
1 2 3 4 5 6 7 8 9 10 11 |
// make:authで自動的に追加される。 // ログイン画面や新規登録画面などは、php artisan route:listで確認。 Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); // ログインしないと見れないページは、このミドルウェア以下にルーティングする。 Route::group(['middleware' => ['auth']], function() { Route::get('/', function () { return redirect('/home'); }); }); |
ログイン画面や新規登録画面などは、php artisan route:listで確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
php artisan route:list +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | | GET|HEAD | / | | Closure | web,auth | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest | | | POST | password/reset | password.update | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | |
3, laravel標準の認証だと、emailの本人確認が入っていないけど、テスト用なのでこのまま使う(適当なメアドを入れてアカウント作り放題)
※実際には、本人確認やSNSログイン機能が必要
4, ホーム画面(resources/views/home.blade.php)に、twitterのような投稿フォームとタイムラインを生成する
とりあえず、必要そうなモデルを作る
Model生成時に-allオプションで、Model/Controller/Migration(テーブル設計)/factory(fakerでダミーデータ生成)も一緒に作ってくれる。いつの間にこんなに便利になった?!
1 2 3 4 5 6 |
# 投稿テーブル php artisan make:model Post --all # いいねテーブル php artisan make:model Like --all # フォローテーブル php artisan make:model Follow --all |
投稿テーブル定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id')->unsigned()->comment('どのユーザの投稿か?'); $table->integer('post_id')->unsigned()->nullable()->comment('親投稿ID'); $table->string('content')->comment('投稿内容'); // 作成日時と更新日時が、自動で入るようにしておく $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP')); // 誰の投稿か? $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade');// 参照先の親レコードが削除されたら、同時に子レコードも削除する }); |
5, 実際の投稿画面とタイムラインを作る(resources\views\home.blade.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">タイムライン</div> <div class="card-body"> @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif <form method="POST" action="{{ route('post.store') }}"> @csrf <div class="form-group row"> <div class="col-md-10"> <input id="content" type="text" class="form-control{{ $errors->has('content') ? ' is-invalid' : '' }}" name="content" value="{{ old('content') }}" required autofocus> @if ($errors->has('content')) <span class="invalid-feedback" role="alert"> <strong>{{ $errors->first('content') }}</strong> </span> @endif </div> <div class="col-md-2"> <button type="submit" class="btn btn-primary"> 投稿 </button> </div> </div> </form> @foreach($posts as $post) <hr> <div> <p> {{$post->post_user->name}} {{$post->created_at->format('Y/m/d H:i:s')}} </p> {{$post->content}} </div> @endforeach </div> </div> </div> </div> </div> @endsection |
PostController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class PostController extends Controller { // トップ画面 public function index() { // とりあえず投稿の全件表示 $posts = Post::orderBy('created_at', 'desc')->get(); return view('home', compact('posts')); } // 投稿ボタンを押された時の処理を作る public function store(Request $request) { $data = $request->all(); $data['user_id'] = Auth::id(); Post::create($data); return redirect()->route('home'); } |
7, routes/web.phpで、各種コントローラーを生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// ログインしないと見れないページは、このミドルウェア以下にルーティングする。 Route::group(['middleware' => ['auth']], function() { # ログイン後のトップ画面は、投稿画面 Route::get('/', function () { return redirect('/post'); }); # 投稿 Route::resource('/post', 'PostController'); # いいね Route::resource('/like', 'LikeController'); # フォロー Route::resource('/follow', 'FollowController'); }); |
8, 各モデルにprotected $guarded = [‘id’];を追加。投稿者リレーションを張る
1 2 3 4 5 6 7 8 9 10 11 |
class Post extends Model { // id以外のカラムは、読み書きできるようにする(ブラックリスト形式) protected $guarded = ['id']; // 発言者 function post_user() { return $this->belongsTo ('App\User', 'user_id', 'id'); } } |
8, migrate(テーブル生成) & factory(レコード生成)
1 |
php artisan migrate:fresh --seed |
とりあえず、ログイン機能付きの掲示板みたいな感じになった。
後は、いいねボタン、各個人ページ、フォロー、DM辺りを作れば完成か?
長くなってきたので、本日はココまで!