###### tags: `Laravel教學已拍` # [Laravel入門]部落格從零開始實作攻略 #by Voyager ![](https://i.imgur.com/v3BZ7f9.jpg) ## 課程介紹 你是正在入門的Laravel新手還是還是喜愛VUE開發的前端工程師? 你是否有實作後台功能的問題需要解決呢? 我準備了第二支實戰影片來解決你們的問題,同樣地一點都不難! 這影片將示範 如何建立文章分類 如何製作部落格總覽頁 如何生成假資料 如何製作文章呈現頁 如何自動生成後台介面 如何動態從後台管理選單 如何動態從後台管理設定 仍在Laravel入門的你,從此不再需要再為後台開發除錯而充滿挫折 喜歡專注於VUE開發的你,從此升級為全棧工程師,自己搞定後台 這支影片花了我大量的時間,希望能透過實作的每個環節來讓你了解如何善用Voyager在項目中,足以作為付費課程內容,一段時間之後可能就會下架,如果有需要的話,可要趕緊在下架前學起來唷! 我知道你擔心自己跟不上,這支影片是一步步的帶著你作出部落格,再加上觀念說明,所以長度超過90分鐘,就算不熟PHP的你都做得到! 想要學習嗎? 告訴你個好消息,影片已經上架,趕緊在下架前搶個好位置來學習自動生成後台技術吧! https://youtu.be/Jv7JPnWwxYg ## 腳本 ### 導言 各位小夥伴大家好 我是哥布林工程師 有不少小夥伴希望能夠有Voyager的實戰教學 所以我從去年就規劃了Voyager實戰的系列教學 之前的第一支從零開始實戰影片也得到不錯的迴響 因此今天這個單元將繼續分享如何使用Voyager 來快速建構出一個帶後台的部落格 從這個教學裡頭你將學到Voyager套件的核心架構 以及如何結合Laravel來作部落格極速開發 如果你對於後台自動生成技術感興趣的話 今天這個單元可千萬不要錯過 如果課程進行中有任何問題想詢問的話 歡迎透過Line官方帳號和我們聯繫 我們的官方帳號是@iax8678g 那麼就讓我們開始吧 --- ### 專案準備 首先我們先來準備專案資料夾 如果你已經很熟悉專案準備環節可以跳到實作章節 課程是假設大家都已經擁有Laravel的開發環境 如果還沒有開發環境的小夥伴也沒關係 你可以參考我放在資訊欄的環境建置筆記 第一步 先建立一個新的專案 開啟Terminal 輸入以下指令 `laravel new webs` webs 就是專案的名稱 > 建立新專案示範 第二步 要為專案建立資料庫 名稱同樣取為 webs 資料庫編碼請選擇utf8mb4 這樣才能支援表情符號 > 建立資料庫示範 第三步 確認專案的設定是否正確 第一個確認 config/app.php 第二個確認 .env 隱私設定檔 > 確認設定檔示範 第四步 下載 Voyager 套件 開啟Terminal 輸入以下指令 `composer require tcg/voyager` > 下載套件示範 第五步 安裝 Voyager 套件 輸入以下指令 `php artisan voyager:install` 這一步其實可以加上--with-dummy選項就能安裝假資料 但我今天的實作不會用到假資料 有需要的小夥伴你可以自己試試看 > 安裝Voyager套件示範影片 第六步 Voyager安裝完畢 代表後台已經生成了 但是我們還沒有帳號能夠登入 所以這一步 需要生成管理員帳號 輸入以下指令 `php artisan voyager:admin admin@admin.com --create` 這裡加上create選項是表示這個使用者還不存在需要新增 接著Terminal就會以互動的方式要求你輸入使用者相關的欄位資料 > 建立管理員帳號示範影片 最後完成管理者帳號的建立 第六步 最後我們確認看看後台能否正常登入與使用 開啟瀏覽器輸入專案網址並在後面加上/admin http://webs.test/admin 在登入頁面輸入剛才設定的帳號與密碼 如果一切順利你應該就能看到Voyager的後台 後台的文字也應該都是繁體中文才對 如果你看到的是英文版本 就代表第三步確認設定出了問題 請回去再看一次然後把資料庫清空再做一次 到這裡我們已經完成了部落格專案的前置準備 接下來是實作展示章節 我們只會直接用Laravel的機制示範如何實作 不會詳細說明每個機制 如果你想了解更多細節歡迎參考我在Hahow的課程 Laravel 5.8 從入門到實務 對了 如果你是第一次來到我們頻道的話 哥布林挨踢頻道是專注於電腦科學相關的課程 每週四下午6點都有新的影片上線 如果聽完今天的單元覺得對你有幫助的話 請幫忙給影片按讚訂閱我們的頻道 也別忘了開啟小鈴鐺唷 --- ### 前台套版導入 這次實作的前端是使用免費的前端版型Moderna 方便大家可以拿來練習 它的網址會列在下方資訊欄 實際上你可以替換成任何自己喜歡的版型 作法都一樣也不會有任何問題的 請放心 另外這次的實作展示的所有內容 都會放在筆記本當中 所有的程式碼也都可以到筆記本裡頭去複製 筆記本連結請參考底下資訊欄 這一小節 我們來示範前端套版的導入 > 前台套版導入示範影片   進到Moderna官網 點Free Download來把版型下載到電腦裡頭 我們選擇 Bootstrap v4的版本 下載並解壓縮後會看到一堆的html範例檔以及assets資料夾 請把assets資料夾放進public資料夾 而blog.html以及blog-single.html 就是我們這次要使用的模版 把這兩個檔案複製到resources/view資料夾內 blog.html更名為 blog.blade.php blog-single.html更名為 post.blade.php 新增一個控制器 名為SiteController 開啟Terminal,輸入以下指令 `php artisan make:controller SiteController` 開啟 SiteController.php 我們將要加入兩個新的方法來呈現部落格頁面 請輸入以下程式碼: ``` //app\Http\Controllers\SiteController.php public function renderBlogPage(){ return view('blog'); } public function renderPostPage(){ return view('post'); } ``` 接著要在路由檔去加入路由來將請求分配給新的控制器方法 為了簡化設定路由時避免每次都要寫控制器的命名空間 需要開啟RouteServiceProvider.php 把$namespace的註解打開來 這樣之後分配控制器就可以省略掉命名空間了 開啟 web.php 請輸入以下程式碼: ``` //routes\web.php Route::get('/blog','SiteController@renderBlogPage'); Route::get('/blog/{post}','SiteController@renderPostPage'); ``` 完成之後,開啟瀏覽器輸入專案網址以及blog路徑 看看網頁是否正常出現 到這裡我們已經完成前端框架的導入 是否很簡單呢 --- ### 示範 Blade重構 當你確認blog/1路徑時會發現整個佈局都亂掉了 代表樣式檔案的路徑出現了問題 所以這個章節將示範如何解決這個問題同時優化這兩支Blade檔案 > Blade重構示範影片 首先我們解決Post頁面佈局跑掉的問題 請開啟post.blade.php 你會發現目前所有資源路徑都是相對路徑 這將導致如果網址路徑有子目錄的話像是blog/1 就會導致資源路徑錯誤 那修改的方向也很簡單 就是將所有路徑都改為絕對路徑這樣就不會有這問題了 不過如果如果自己打絕對路徑又會有和網址耦合 導致放上正式環境時又會出現問題 因此這裡我們使用Laravel提供的幫助函式asset() 來代替我們生成資源的絕對路徑 改完之後再測看看,果然問題都解決了 不過如果每一頁都這樣改實在太麻煩 而且如果你仔細觀察的話會發現 blog和post這兩個頁面有很多的結構極為類似 應該要簡化才對 > >版型分割說明 我們在views資料夾新增一個layouts子資料夾 並在裡頭新增 site.blade.php 我們將在這檔案裡面移入重複的結構並挖一個名為content的洞 接著刪除原先兩個Blade檔案裡頭重複的內容,繼承site視圖 最後用剩下的內容來填入content這個洞,就完成囉 當兩個檔案都完成之後訪問看看兩個網址是否都能正常顯示 沒有意外的話都正常,也就完成了Blade檔案的重構環節 --- ### 示範 如何準備需要的表格 這一小節 我們要示範如何建立分類與文章這兩個表格 透過Laravel的Migration機制來達成 > Laravel的Migration示範 #### 示範腳本 一個簡單的部落格主要是透過分類Cgy以及文章Post來組成 為了簡化示範,我已經把Migration檔案內容準備好了 就像是這個樣子 大家可以直接到筆記本去複製下來改用 ``` <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateCategoriesTable extends Migration { public function up() { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->bigInteger('parent_id')->nullable()->unsigned()->index(); //父分類 $table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade'); $table->string('title',100); //分類名稱 $table->string('pic',255)->nullable(); //分類圖片 $table->string('desc',500)->nullable(); //分類描述 $table->boolean('enabled')->default(true);//是否啟動 $table->integer('sort'); //排序 $table->timestamps(); }); } public function down() { Schema::table('categories', function(Blueprint $table) { $table->dropForeign(['parent_id']); }); Schema::dropIfExists('categories'); } } <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePostsTable extends Migration { public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->bigInteger('category_id')->unsigned()->index(); //文章分類 $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); $table->string('title', 40); //標題 $table->string('content_small', 80)->nullable(); //部分內容 $table->text('content'); //內容 $table->integer('sort')->default(0); //排序 $table->string('status', 30)->default('pending'); //狀態 $table->string('pic', 255); //圖片 $table->timestamps(); }); } public function down() { Schema::table('posts', function (Blueprint $table) { $table->dropForeign(['category_id']); }); Schema::drop('posts'); } } ``` 我們就用它來建立Migration檔案 開啟Terminal 輸入以下指令 `php artisan make:migration create_categories_table` `php artisan make:migration create_posts_table` `php artisan migrate` 完成後確認一下表格是否正常生成 --- ### 假資料建立示範 有了表格接下來就是要填入假資料的環節了 接下來我將要示範的是如何利用Laravel的Seed機制來建立資料 首先開啟Terminal,輸入以下幾個指令 `php artisan make:model Category` 這個指令將會生成categories表格的模型,用來進行表格的互動 `php artisan make:seeder CategorySeeder` 這個指令將會生成CategorySeeder檔案,用來生成假資料 這裡要注意如果安裝Voyager1.4版本 會生成seeds資料夾,導致所有新生成的seeder檔案被放在這個資料夾 請將它們搬回seeders資料夾才會與namespace一致 `php artisan make:factory CategoryFactory` 這個指令將會生成CategoryFactory,用來定義假資料各欄位的內容 開啟 database/seeders/CategorySeeder.php 將以下程式碼貼入 ``` <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use App\Models\Category; class CategorySeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Category::truncate(); Category::factory(5)->create(); } } ``` 開啟 database/factories/CategoryFactory.php 將以下程式碼貼入 ``` <?php namespace Database\Factories; use App\Models\Category; use Illuminate\Database\Eloquent\Factories\Factory; class CategoryFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = Category::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'title' => $this->faker->realText(10), 'pic' => 'assets/img/recent-posts-'. rand(1,4) .'.jpg', 'desc' => $this->faker->realText(200), 'enabled' => true, 'sort' => rand(0,10) ]; } } ``` 開啟database/seeders/DatabaseSeeder.php 修改成以下程式碼: ``` <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use DB; use Eloquent; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { Eloquent::unguard(); DB::statement('SET FOREIGN_KEY_CHECKS=0'); $this->call([CategorySeeder::class]); DB::statement('SET FOREIGN_KEY_CHECKS=1'); Eloquent::reguard(); } } ``` 輸入以下指令,來新增假資料 `php artisan db:seed` 開啟資料庫管理工具,看看分類資料是否建立成功了勒 如果你發現假資料是英文和我的不一樣 那是因為我有修改 config/app.php檔案裡頭 `'faker_locale' => 'zh_TW',` 將Faker假資料的語系設定為繁體中文的關係 你修改設定之後再執行一次db:seed 就會是中文的了 接下來要處理posts表格了,一樣會有剛才的三個指令 再次開啟Terminal,輸入以下幾個指令 `php artisan make:model Post` 生成posts表格的模型 `php artisan make:seeder PostSeeder` 生成PostSeeder檔案 一樣把新生成的seeder檔案搬回seeders資料夾 `php artisan make:factory PostFactory` 生成posts的工廠 開啟 database/seeders/PostSeeder.php 將以下程式碼貼入 ``` <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use App\Models\Post; class PostSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Post::truncate(); Post::factory(100)->create(); } } ``` 開啟 database/factories/PostFactory.php 將以下程式碼貼入 ``` <?php namespace Database\Factories; use App\Models\Post; use Illuminate\Database\Eloquent\Factories\Factory; class PostFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = Post::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'category_id' => rand(1,5), 'title' => $this->faker->realText(20), 'content_small' => $this->faker->realText(50), 'content' => $this->faker->realText(200), 'sort' => rand(0,10), 'status' => $this->faker->randomElement(['draft','published']), 'featured' => $this->faker->boolean, 'pic' => 'assets/img/blog-post-' .rand(1,4).'.jpg' ]; } } ``` 開啟database/seeders/DatabaseSeeder.php 修改成以下程式碼: ``` <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use DB; use Eloquent; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { Eloquent::unguard(); DB::statement('SET FOREIGN_KEY_CHECKS=0'); $this->call([CategorySeeder::class,PostSeeder::class]); DB::statement('SET FOREIGN_KEY_CHECKS=1'); Eloquent::reguard(); } } ``` 輸入以下指令,來新增文章假資料 `php artisan db:seed` 開啟資料庫管理工具,看看文章資料是否建立成功了勒 最後,我們再來新增一個tags表格及其pivot表格 post_tag 用來儲存文章的標籤以及文章和標籤之間的關係 輸入以下指令來建立標籤的Migration檔案 `php artisan make:migration create_tags_table` 檔案的內容修改如下: ``` public function up() { Schema::create('tags', function (Blueprint $table) { $table->id(); $table->string('title',50); $table->string('url',255)->nullable(); $table->timestamps(); }); } public function down() { Schema::dropIfExists('tags'); } } ``` 輸入以下指令來建立標籤的模型 `php artisan make:model Tag` 輸入以下指令來建立pivot表格的Migration檔案 `php artisan make:migration create_post_tag_table` 檔案的內容修改如下: ``` public function up() { Schema::create('post_tag', function (Blueprint $table) { $table->id(); $table->bigInteger('post_id')->unsigned()->index(); $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade'); $table->bigInteger('tag_id')->unsigned()->index(); $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); $table->timestamps(); }); } public function down() { Schema::table('post_tag', function (Blueprint $table) { $table->dropForeign(['post_id']); $table->dropForeign(['tag_id']); }); Schema::dropIfExists('post_tag'); } ``` --- ### 示範 前台串接 現在有個資料,我們就可以把前台的資料改成由後台提供囉 等會我們將要修改SiteController.php 把資料拋進View視圖內 接著再修改View視圖去取用這些資料 就完成了前台的串接了 > 前台串接示範 #### 示範腳本 ##### 處理blog頁面 1.編輯AppServiceProvider.php ``` use View; ... View::composer(['blog','post'], function ($view) { $categories = Category::where('enabled',true)->orderBy('sort','asc')->get(); $view->with('categories',$categories); }); ``` 2.編輯SiteController.php ``` public function renderBlogPage() { $posts = Post::where('status','published')->orderBy('created_at','desc')->get(); return view('blog',compact('posts')); } ``` 3.編輯blog.blade.php ``` //重要程式 $post->created_at->toDateString() $post->created_at->toFormattedDateString() ``` ##### 處理分頁 1.輸入指令 `php artisan vendor:publish --tag=laravel-pagination` 2.再回去調整AppServiceProvider.php ``` //app\Providers\AppServiceProvider.php use Illuminate\Pagination\Paginator;= public function boot(){ ... Paginator::defaultView('pagination::bootstrap-4'); } ``` 3.修改vendor/pagination/bootstrap-4.blade.php 4.修改SiteController.php ``` //app/Http/Controllers/SiteController.php public function renderBlogPage() { $posts = Post::where('status','published')->orderBy('created_at','desc')->paginate(5); return view('blog',compact('posts')); } ``` 5.修改blog.blade.php ``` //resources/views/blog.blade.php //重要程式 {{ $posts->links() }} ``` ##### 處理分類清單 1.建立資料夾 resources/view/partials 2.建立並編輯視圖 resources/view/partials/categories.blade.php ``` \\resources/view/partials/categories.blade.php <div class="sidebar-item categories"> <ul> @foreach ($categories as $category) <li><a href="#">{{ $category->title }}<span>(25)</span></a></li> @endforeach </ul> </div><!-- End sidebar categories--> ``` 3.修改blog.blade.php ``` //resources/views/blog.blade.php //重要程式 @include('partials.categories') ``` ##### 加入分類的文章數 1.編輯App\Models\Category.php ``` //app\Models\Category.php use App\Models\Post; public function posts(){ return $this->hasMany(Post::class); } ``` 2.調整AppServiceProvider.php ``` //app\Providers\AppServiceProvider.php use Illuminate\Database\Eloquent\Builder; function(){ View::composer(['blog','post'], function ($view) { $categories = Category::where('enabled',true)->orderBy('sort','asc')->withCount(['posts' => function (Builder $query) { $query->where('status', 'published'); }])->get(); ... }); } ``` 3.修改視圖 resources/view/partials/categories.blade.php ``` //resources\view\partials\categories.blade.php <span>({{$category->posts_count}})</span> ``` ##### 處理post頁面 1.編輯App\Models\Post.php ``` //app\Models\Post.php use App\Models\Category; public function category(){ return $this->belongsTo(Category::class); } ``` 2.編輯post.blade.php --- ### 示範 Voyager 的BREAD 這一小節 我們要示範如何導入Voyager來實作CRUD 現在前端的資料都來自於Blade檔 還沒有與資料庫連結 所以接下來我將要示範如何改由Voyager來管理資料庫的資料 > Voyager的BREAD示範 接著就要開始Voyager的功能設定作業了 在進到BREAD的設定實作之前先簡單的說一下 在Voyager裡頭兩個很重要的表格 分別是 data_types 以及 data_rows 這邊說明一下DataType以及DataRow的關係 每個資料庫表格都會有一個DataType來紀錄該表格的BREAD設定 而每個DataType擁有多個DataRow來說明各欄位的BREAD設定 進到後台開啟 BREAD 功能 這時候 cgies 和 posts 的 BREAD 功能還沒建立 先來建立它們 接著開始設定這兩個表格的BREAD > BREAD 設定說明 完成設定之後,你就有個CRUD介面可以使用囉 我們就可以管理先前建立的分類和文章資料 > 示範編輯&刪除文章 > >這裏會出現Translate錯誤,需要編輯App/Models/Post.php ``` //app\Models\Post.php use TCG\Voyager\Traits\Translatable; class Post extends Model { use Translatable; ... ``` 完成之後,開啟瀏覽器輸入專案網址以及blog/1路徑 看看文章資訊是否有修改 --- 另外BREAD可以說是Voyager的核心 透過剛才的展示沒辦法把所有細節講完 建議大家可以去參考我整理的Voyager中文技術手冊 --- ### 示範讓前台的圖片顯示能夠支援Voyager 在剛才我們在編輯文章資料的時候有上傳一張新圖上去 但是圖片並沒有正常顯示在前台 這是為什麼呢? > 示範讓Voyagr圖片能顯示在前台 #### 示範腳本 因為一開始我們的圖片呈現處是使用從public資料夾來取檔 但是當利用Voyager來管理圖片檔案之後 所有圖片是被存在storage/app/public這裡的資料夾 導致路徑上出現了差異因而無法正常顯示 了解問題原因之後處理起來就很簡單 Voyager有提供一個幫助函式來幫助我們生成圖片絕對路徑 就是Voyager::image() 因此我們只要到圖片呈現的位置改成這樣即可 改完之後再回前台確認看看是否就正常囉 --- --- ### 示範 Voyager 的選單管理員 接下來這一小節 我們要示範如何利用Voyager來管理前端的選單 目前前端的選單結構都是寫死在Blade檔裡頭 但其實Voyager就有個選單管理員可以來幫助我們管理選單 接著我來展示該如何使用 > 主選單建立示範 #### 示範腳本 在開始之前我們需要做一點準備 假設我們需要有個選單能夠顯示不同分類的文章 因此我們就需要有個新路由 並且還有個SiteController的新方法來處理請求 因此開啟web.php,加入以下路由規則 ``` //routes\web.php Route::get('/blog/cateogry/{category}','SiteController@renderBlogPageByCategory'); ``` 開啟SiteController.php,加入以下程式 ``` //app\Http\Controllers\SiteController.php public function renderBlogPageByCategory($category_id) { $category = Category::findOrFail($category_id); $posts = $category->posts; return view('blog',compact('posts')); } ``` 成為之後就可以到後台的選單管理員來建立選單囉 完成了選單的建立接著就可以回到前台來叫用囉 這裡就可以先將選單的程式碼先註解掉改成以下的程式碼 `{{ menu('frontend')}}` frontend就是我們剛為選單所取的名字 完成之後,開啟瀏覽器輸入專案網址以及blog路徑 看看網頁上的主選單是否有出現內容 你會發現內容確實有出來但遺憾的是格式卻跑掉了 怎麼辦呢 你不用擔心 Voyager早就為你想到了 因為大部分套版都有自定義樣式類別 如果沒在標籤中加入這些樣式類別就無法正常出現 因此我們必須要新增一個選單視圖並告知menu()要使用它 請在views資料夾建立一個menu子資料夾 並在裡頭建立primary.blade.php 檔案 裡頭程式碼像這樣 ``` //resources/views/menu/primary.blade.php <nav class="nav-menu float-right d-none d-lg-block"> <ul> @foreach($items as $item) @php $sub2menu = $item->children; @endphp @if(isset($sub2menu) && count($sub2menu) > 0) <li class="drop-down"><a href="{{$item->link()}}">{{$item->title}} </a> <ul> @foreach($sub2menu as $sub2_item) <li><a href="{{$sub2_item->link()}}">{{$sub2_item->title}} </a></li> @endforeach </ul> @else <li><a href="{{$item->link()}}">{{$item->title}} </a> @endif </li> @endforeach </ul> </nav> ``` 再回到前台視圖 把menu()加入第二參數 也就是選單視圖改用menu資料夾的primary `{{ menu('frontend','menu.primary') }}` 完成之後,再開啟瀏覽器輸入專案網址以及blog路徑 看看這次網頁上的選單是否格式就正確了 --- 這個技巧除了可以用來製作上方的主選單 實際上還有很多地方都可以利用選單管理員來進行管理唷 想到的夥伴歡迎到底下留言來討論唷 --- ### 示範 Voyager 設定管理員 最後這一小節 我們要示範如何利用Voyager來管理前端的參數 比如每一頁要呈現的筆數 > 設定管理員示範 #### 示範腳本 目前每一頁要呈現的筆數是寫死在SiteController內 修改較為不便 我們將透過Voyager的設定管理員來幫我們管理分頁數設定 將分頁顯示文章數設定移到後台去 進到Voyager後台的設定管理員 在admin這個群組加上posts_per_page這組設定 > 在設定管理員加入設定 完成之後預設你會看到旁邊有程式碼提示 告訴你可以怎麼去取得設定 因此你可以把這段複製起來 貼到SiteController.php替換掉原本的內容 當我們把這些內容全都替換完畢後儲存 再開啟瀏覽器輸入專案網址以及blog路徑 看看現在每一頁的文章數目是否發生變化了呢? --- 透過這次的部落格網頁實作 我們展示了Voyager的BREAD 選單管理員以及設定管理員的使用 並簡單示範如何與Laravel結合 如果這個單元的示範 你覺得意猶未盡 不用擔心 我為大家準備好了EzLaravel套件 裡頭的demo/articles頁有今天這個示範的完整程式碼供你參考 關於EzLaravel套件的使用說明 請參考資訊卡或底下資訊欄 更棒的是這個套件不只是作為範例 你可以用它來快速建置你的網站 裡頭已經為網頁元素以及文章等表格建立了完整的BREAD設定了 連CRUD視圖都客製好 方便你提包入住 之後我仍將利用Voyager來為你示範更多應用 如果有你想知道而我沒展示的 請在底下留言 也許下個單元我就會製作你要的應用囉 如果今天的示範教學你覺得有幫助的話 希望你能夠訂閱我們頻道並開啟小鈴鐺 以免錯過我為你製作的下一支教學影片 我是哥布林工程師,我們下次再見,掰掰 ## 影片時間軸 影片開始 00:00 專案準備 01:24  前台套版導入 08:27 示範視圖優化 12:28 示範資料建立 24:13 示範前台串接 35:41  示範Voyager的BREAD 01:08:23 動態選單製作 01:19:36 動態設定製作 01:27:33 課後總結 01:29:29 ## 參考網址 [Laravel5.8 從入門到實戰](https://hahow.in/cr/goblinlab-laravel58) [一頁式網站從零開始](https://youtu.be/wXg0ZdH9Kl0) [Moderna前台套版](https://bootstrapmade.com/free-bootstrap-template-corporate-moderna/download/) [課程筆記](https://hackmd.io/@goblinlab/HkfOPdR1d) [Laravel環境建置](https://hackmd.io/@javck/H1nqUaNh8) [EzLaravel套件介紹影片](https://youtu.be/J5SjwZ2aY6c) [Voyager套件簡介影片](https://youtu.be/ZW4RLDDUuFQ)