/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/編號
,如此,符合顯示單一資料的路由寫法