11. 讀出所有測驗
一、流程
- 有了測驗,就要讓具備「建立測驗」的身份者來建立題庫
- 建立題庫時,要先列出所有測驗主題,指定某測驗後才能建立題庫
- 題目架構為:題目、四個選項、一個標準答案
二、整裡頁面流程及選單
- 列出所有測驗的路由為動詞為 GET,路由為
/exam,控制器為ExamController@index,所以,我們先開啟routes/web.php確認有沒有以下這個路由。Route::get('/exam', 'ExamController@index')->name('exam.index'); -
若希望以後一登入就到此畫面,亦可將原本的
/及/home路由修改一下,控制器均改為ExamController@index,這樣的意思就是凡是連到首頁或者/home(登入後頁面)都會連到測驗首頁。Route::get('/', 'ExamController@index')->name('index'); Route::get('/home', 'ExamController@index')->name('home.index'); -
接著開啟控制器
/專案/app/Http/Controllers/ExamController.php,編輯裡面的index()函數,為了儘量符合預設,我們把index()的樣板改為exam.index,也就是直接用view()來執行/專案/resources/views/exam/index.bload.php樣版的意思public function index() { return view('exam.index'); } -
由於
index.bload.php樣板還不存在,所以,可以直接把/專案/resources/views/welcome.blade.php另存為/專案/resources/views/exam/index.blade.php樣板。mv resources/views/welcome.blade.php resources/views/exam/index.blade.php - 如此,不管登入登出,都會直接到此頁面,並在工具列上顯示適當的工具

-
接著將
home.blade.php裡面的顯示轉向訊息,複製到/專案/resources/views/layouts/app.blade.php中,如此,日後若有轉向訊息便可呈現出來(不管在什麼功能中)。詳情請參考:https://laravel-china.org/docs/laravel/5.6/responses/1368#1bca7f<div class="container"> @yield('content') @if(session('status')) @component('bs::alert', ['type' => 'info']) {{ session('status') }} @endcomponent @endif </div> - 然後,就可以把
home.blade.php刪除(因為也用不到了)
三、列出所有測驗
-
接著開啟控制器
/專案/app/Http/Controllers/ExamController.php,編輯裡面的index()函數,並將所有測驗的資料陣列用compact('exams')傳至樣板public function index() { $exams = Exam::all(); return view('exam.index',compact('exams')); } -
至於
Exam::all()則是Exam模型取得所有資料的用法(在上面有use App\Exam;才能這樣使用),更多方法可參考:https://laravel-china.org/docs/laravel/5.6/eloquent-collections/1405#26e4a9 -
接著開啟
/專案/resources/views/exam/index.blade.php利用@foreach及@endforeach寫法來產生迴圈:@extends('layouts.app') @section('content') <h1>測驗一覽</h1> <ul class="list-group"> @foreach($exams as $exam) <li class="list-group-item"> {{ $exam->created_at->format("Y年m月d日") }} - <a href="exam/{{ $exam->id }}"> {{ $exam->title }} </a> </li> @endforeach </ul> @endsection -
$exam->created_at->format("Y年m月d日")是用Carbon 日期時間套件的功能,該套件已經內建於 Laravel 5 中,詳細用法可以參考:https://laravel-china.org/docs/laravel/5.6/eloquent-mutators/1335#7a3eff或 http://laravel5-book.kejyun.com/package/tool/package-tool-carbon.html -
預設情況下,Eloquent 會把
created_at和updated_at字段轉換成 Carbon 實例, 它繼承了 PHP 原生的DateTime類,並提供了各種有用的方法。若有其他日期欄位想轉換成Carbon 實例,可以直接在Model中利用$dates屬性,自行定義哪些日期類型字段會被自動轉換:/** * 應被轉換為日期的屬性。 * * @var array */ protected $dates = ['birthday']; -
至於日期格式,可以參考 PHP 手冊:http://php.net/manual/en/function.date.php
-
另外一種
@forelse搭配@empty及@endforelse寫法,可以在沒有資料的情形顯示自訂內容:@extends('layouts.app') @section('content') <h1>測驗一覽</h1> <ul class="list-group"> @forelse($exams as $exam) <li class="list-group-item"> {{ $exam->created_at->format("Y年m月d日") }} - <a href="exam/{{ $exam->id }}"> {{ $exam->title }} </a> </li> @empty <li class="list-group-item">尚無任何測驗</li> @endforelse </ul> @endsection -
大功告成!請直接在網址輸入: http://localhost/exam或 http://localhost(注意,後面不可以有 / ,否則路由以後會誤判)
-
其中每個測驗的連結均為:
exam/編號,如此,符合顯示單一資料的路由寫法
10-1 建立Request來統一驗證
