iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
4
Modern Web

Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!系列 第 7

[Day 7] 需要用到 Controller 了!淺聊一下網頁 MVC 框架的概念

畫面顯示的差不多了,也能根據我們輸出的資料改變畫面上的內容了。

所以我們應該也學得差不多了吧!

當然沒有!作為一個網站服務,當然還要能傳遞資料,或者和使用者進行互動呀!

這次我們來做一個簡單的功能網頁!

名言機器人

首先,我們先來做一個簡單的機器人。這個機器人會隨機回傳以下一句激勵的名言給使用者。

  • 「失敗為成功之母。」- 愛迪生
  • 「簡潔是最終的精密。」– 李奧納多‧達文西
  • 「好的開始是成功的一半」- 荷拉斯

Controllers

我們設定 /inspiring 這個路徑,來滿足上面所說的需求

Route::get('/inspire');

接著,我們不在這裡宣告函式,而是給一段文字,標記應該使用的函式位置:

Route::get('/inspire', 'InspiringController@inspire');

這代表我們

然後,我們利用 artisan 來建立這個 Controller

$ php artisan make:controller InspiringController
Controller created successfully.

看起來成功囉!我們趕緊去 app/Http/Controllers 裡面看看有沒有成功建立

inspire controller

看起來成功囉!

接著,我們改寫 app/Http/Controllers/InspiringController.php,加入我們在 routes 裡面宣告的函式:

class InspiringController extends Controller
{
    /**
     * @return string
     */
    public function inspire()
    {
        return 'inspire';
    }
}

接著,我們到 http://127.0.0.1/inspire 看看我們的結果

如果可以看到「inspire」這段文字,恭喜!我們成功的將routes 和控制器綁定在一起了!

邏輯寫在哪裏呢

現在我們遇到了一個小難題:這個需求勢必有一段程式要處理「從三句話中隨機選一句話給使用者看」的邏輯。

但是,這段邏輯要放在哪裡呢?哪邊才是最能適應需求改變的位置呢?

針對這個問題,相關討論很多,有點眾說紛紜。

筆者自己的習慣是將邏輯寫在 Services 裡面。然後由 Controllers 進行控制。筆者自己的經驗是,這樣可以最大程度的讓每個元件的職責拆分出來,並讓未來需求變更變得更簡單。

所以,我們來建立對應的 Service 物件,處理產生名言的邏輯吧!

Services

首先,我們建立 app/Services 資料夾,並建立 app/Services/InspiringService.php

我們先從簡單開始,只回傳第一句激勵的名言:

<?php

namespace App\Services;

/**
 * Class InspiringService
 */
class InspiringService
{
    /**
     * @return string
     */
    public function inspire()
    {
        return '「失敗為成功之母。」- 愛迪生';
    }
}

然後,我們修改一下原本的 InspiringController,讓他使用 InspiringService 取得名言:

<?php

namespace App\Http\Controllers;

use App\Services\InspiringService;
use Illuminate\Http\Request;

class InspiringController extends Controller
{
    /**
     * @return string
     */
    public function inspire()
    {
        return (new InspiringService())->inspire();
    }
}

接著,我們重新回到 http://127.0.0.1/inspire ,看看我們的結果

如果所有步驟都正常,我們應該看到 「失敗為成功之母。」- 愛迪生 這句話

改寫 Services

雖然成功了,但是我們沒有完成我們最原本的需求:隨機從三句名言裡面回傳一句激勵的名言。

沒關係,既然們已經把邏輯拉出來,要改哪隻檔案才能符合我們的需求就很明顯了:InspiringService

我們改寫一下原本的 inspire()

/**
 * @return string
 */
public function inspire()
{
    $quotes = [
        '「失敗為成功之母。」- 愛迪生',
        '「簡潔是最終的精密。」– 李奧納多‧達文西',
        '「好的開始是成功的一半」- 荷拉斯',
    ];
    $key = rand(0, 2);
    return $quotes[$key];
}

好囉!現在我們重新整理一下畫面,應該可以時不時看到新的內容了!


小小總結一下我們這篇文章學習到了什麼

我們學到怎麼在 route 裡面宣告對應的控制器行為,還學到了怎麼撰寫對應的 Service 物件,讓商業邏輯能更加清楚。

希望各位覺得這篇文章有幫助,我們明天見!


上一篇
[Day 6] 優化網頁外觀!淺聊 blade 樣板
下一篇
[Day 8] 再聊自動測試!怎麼為我們的新網頁加上單元測試
系列文
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
jkl99
iT邦新手 5 級 ‧ 2019-09-10 00:43:10
ReccaChao iT邦新手 1 級 ‧ 2019-09-10 01:43:40 檢舉

感謝!馬上修正

0
ckp6250
iT邦好手 1 級 ‧ 2019-11-27 11:04:42

深入淺出,
/images/emoticon/emoticon34.gif

0
Ray
iT邦新手 4 級 ‧ 2020-09-23 11:53:03

Laravel 8 的話
語法要改為
Route::get('/inspire', [InspiringController::class, 'inspire']);

ReccaChao iT邦新手 1 級 ‧ 2020-09-23 14:08:12 檢舉

對的!感謝補充
之後考慮寫一系列 Laravel 8 的教學

0
舜~
iT邦高手 1 級 ‧ 2020-10-30 14:19:12

補充 allen903405

laravel 8.0 route 沒有prefix namespace
因此需要自己設定namespace

所以有兩種做法

Route::get('/inspire', 'App\Http\Controllers\InspiringController@inspire');

或是

use App\Http\Controllers;
Route::get('/inspire', [InspiringController::class, 'inspire']);

來源
Target class controller does not exist - Laravel 8

我要留言

立即登入留言