:::

11. 讀出所有測驗

一、流程

  1. 有了測驗,就要讓具備「建立測驗」的身份者來建立題庫
  2. 建立題庫時,要先列出所有測驗主題,指定某測驗後才能建立題庫
  3. 題目架構為:題目、四個選項、一個標準答案

二、整裡頁面流程及選單

  1. 列出所有測驗的路由為動詞為 GET,路由為/exam,控制器為 ExamController@index,所以,我們先開啟routes/web.php 確認有沒有以下這個路由。
    Route::get('/exam', 'ExamController@index')->name('exam.index');
  2. 若希望以後一登入就到此畫面,亦可將原本的//home路由修改一下,控制器均改為ExamController@index,這樣的意思就是凡是連到首頁或者/home(登入後頁面)都會連到測驗首頁。

    Route::get('/', 'ExamController@index')->name('index');
    Route::get('/home', 'ExamController@index')->name('home.index');
  3. 接著開啟控制器 /專案/app/Http/Controllers/ExamController.php,編輯裡面的index()函數,為了儘量符合預設,我們把index()的樣板改為exam.index,也就是直接用view()來執行/專案/resources/views/exam/index.bload.php樣版的意思

    public function index()
    {
        return view('exam.index');
    }
  4. 由於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
  5. 如此,不管登入登出,都會直接到此頁面,並在工具列上顯示適當的工具
  6. 接著將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>
  7. 然後,就可以把home.blade.php刪除(因為也用不到了)

三、列出所有測驗

  1. 接著開啟控制器 /專案/app/Http/Controllers/ExamController.php,編輯裡面的index()函數,並將所有測驗的資料陣列用compact('exams')傳至樣板

    public function index()
    {
        $exams = Exam::all();
        return view('exam.index',compact('exams'));
    }
  2. 至於Exam::all()則是Exam模型取得所有資料的用法(在上面有use App\Exam;才能這樣使用),更多方法可參考:https://laravel-china.org/docs/laravel/5.6/eloquent-collections/1405#26e4a9

  3. 接著開啟/專案/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
    
  4. $exam->created_at->format("Y年m月d日")是用Carbon 日期時間套件的功能,該套件已經內建於 Laravel 5 中,詳細用法可以參考:https://laravel-china.org/docs/laravel/5.6/eloquent-mutators/1335#7a3effhttp://laravel5-book.kejyun.com/package/tool/package-tool-carbon.html

  5. 預設情況下,Eloquent 會把 created_atupdated_at 字段轉換成 Carbon 實例, 它繼承了 PHP 原生的 DateTime 類,並提供了各種有用的方法。若有其他日期欄位想轉換成Carbon 實例,可以直接在Model中利用 $dates 屬性,自行定義哪些日期類型字段會被自動轉換:

    /**
    * 應被轉換為日期的屬性。
    *
    * @var array
    */
    protected $dates = ['birthday'];
  6. 至於日期格式,可以參考 PHP 手冊:http://php.net/manual/en/function.date.php

  7. 另外一種@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
    
  8. 大功告成!請直接在網址輸入:  http://localhost/examhttp://localhost(注意,後面不可以有 / ,否則路由以後會誤判)

  9. 其中每個測驗的連結均為:exam/編號,如此,符合顯示單一資料的路由寫法

到GitHub觀看此單元程式異動


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D37%26tbdsn%3D1172

計數器

今天: 3311331133113311
昨天: 4745474547454745
總計: 7713272771327277132727713272771327277132727713272