12.
讀出單一測驗
- 點進去某個測驗,路由是連到
exam/{{$exam->id}}
,所以,在/routes/web.php
新增一筆路由資料
Route::get('/exam/{id}', 'ExamController@show')->name('exam.show');
- 路徑中的
{id}
可以直接在控制器中變成變數$id
使用,所以,無須自己帶參數過去。不過路由的參數和控制器的變數是以先後位置來對應的,無關名稱,換言之,控制器中不命名為 $id
也是可以的。
- 如果該參數可有可無,那麼可以寫成
{id?}
這樣的方式。
- 如果路由有參數,且確定其格式,那麼可以用
->where()
限制參數格式(否則exam/create
中的 create
也可能會被當成id),例如:限制id 只允許 0~9 的數字,如此可以降低路由被誤判的機會
Route::get('/exam/{id}', 'ExamController@show')->name('exam.show')->where('id', '[0-9]+');
- 如果同一個參數要限制格式,且有好幾個 Route 要用,則可用
Route::pattern()
方式來統一宣告(記得放最上面):
Route::pattern('id' , '[0-9]+');
-
接著在 /專案/app/Http/Controllers/ExamController.php
控制器中,修改 show
的方法,其中 $id
便是從路由過來的:
public function show($id)
{
$exam = Exam::find($id);
return view('exam.show', compact('exam'));
}
-
find()
是 Eloquent 根據主鍵用來取出該筆資料用的。詳情請看:https://laravel-china.org/docs/laravel/5.6/eloquent/1332#retrieving-single-models
-
最後,只要製作好樣板,讓資料顯示出來即可,請建立 /專案/resources/views/exam/show.blade.php
:
@extends('layouts.app')
@section('content')
<h1 class="text-center">{{$exam->title}}</h1>
<div class="text-center">
發佈於 {{$exam->created_at->format("Y年m月d日 H:i:s")}} / 最後更新: {{$exam->updated_at->format("Y年m月d日 H:i:s")}}
</div>
@endsection