課題2020-09
ログイン機能を有した掲示板システムを開発します。
ログイン機能はLaravelが提供する標準ログイン機能を使います。
テーブル定義
記事テーブル
- ID
- ユーザID
- タイトル
- 内容
- 登録日時
- 更新日時
ユーザテーブル (Laravel標準のusersテーブルを利用)
- ID
- 名前
- メールアドレス
- パスワード
画面設計


解答例
マイグレーション
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateArticlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('user_id');
$table->string('title', 100);
$table->string('contents', 1000);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('articles');
}
}
ルーティング
Route::get('/articles', 'ArticlesController@index');
Route::get('/articles/create', 'ArticlesController@create');
Route::post('/articles', 'ArticlesController@store');コントローラ
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\ArticleRequest;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
class ArticlesController extends Controller
{
function __construct() {
$this->middleware('auth');
}
public function index() {
$articles = DB::select('select id, title, user_id, created_at from articles;');
$users = [];
foreach($articles as $index => $article) {
$user = DB::select('select name from users where id = ?;', [
$article->user_id
]);
$users[$index] = $user[0];
}
return view('articles.index', [
'articles' => $articles,
'users' => $users
]);
}
public function create() {
return view('articles.create');
}
public function store(ArticleRequest $request) {
DB::insert('insert into articles(user_id, title, contents, created_at, updated_at) values(?, ?, ?, ?, ?);', [
Auth::user()->id,
$request->title,
$request->contents,
now(),
now()
]);
return redirect('/articles');
}
}
リクエスト
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ArticleRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|max:100',
'contents' => 'required|max:1000'
];
}
}
ビュー
<html>
<body>
<a href="/articles">戻る</a>
@if($errors->any())
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<form method="POST" action="/articles">
@csrf
<p>
タイトル<br>
<input type="text" name="title">
</p>
<p>
内容<br>
<textarea cols="50" rows="7" name="contents"></textarea>
</p>
<p>
<input type="submit" value="投稿">
</p>
</form>
</body>
</html>
<html>
<body>
<a href="/articles/create">新規投稿</a>
<table>
<thead>
<tr>
<th>ID</th>
<th>タイトル</th>
<th>投稿者名</th>
<th>投稿日時</th>
</tr>
</thead>
<tbody>
@foreach($articles as $index => $article)
<tr>
<td>{{ $article->id }}</td>
<td>{{ $article->title }}</td>
<td>{{ $users[$index]->name }}</td>
<td>{{ $article->created_at }}</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>