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辺りを作れば完成か?
長くなってきたので、本日はココまで!