Laravel 學習筆記(7) - Controller

Controller

一般在 route 中如果會有資料處理的程式邏輯,我們並不會寫在 route 中,一來這本來就不是 route 本身的職責,二來是整個 route 會混雜多個任務,造成日後維護的困難。Controller 是專門用來處理程式邏輯的單元,Route 只要知道將任務轉交給哪個 Controller 處理即可。
首先,在 app/controllers 目錄下新增一個 HomeController.php。在這個目錄下會有一個 Controller 的基礎類別 BaseController.php ,我們建立的 HomeController.php 就要繼承這個類別,程式碼如下:
<?php

class HomeController extends BaseController {

    public function index()
    {
        return View::make('home')
            ->with('title', '首頁')
            ->with('hello', '大家好~~');
    }

}
在這個類別中,我們建立了一個 index() 方法,並把原本在 route 中的內容移動到這裡。現在由 HomeController 來回傳 view。

接著修改原本的 route :
Route::get('/', 'HomeController@index');
原本的 route 變成只有一行了,非常簡潔。第二個參數從原本的 function 換成 Controller 的名稱 @ 方法名稱。

現在的整個流程是:Route -> Controller -> View

這裡另外介紹一個 Controller 常用的功能。有時候我們會以 id 去查詢資料庫中的資料然後顯示。因為我們還沒有說明資料庫的部份,所以只介紹顯示使用者輸入的 id。

1.首先在原本的 route 下新增一行新的 route:
Route::get('post/{id}', 'HomeController@show');
2.在 HomeController 中新增相對應的方法 show():
public function show($id)
{
    return View::make('home')
            ->with('title', '首頁')
            ->with('hello', '大家好~~'.$id);
}
注意到和 index() 不同的地方,show() 有一個傳入參數 $id,我們簡單的把它串接在 hello 字串後面顯示。

現在在網址中輸入 http://localhost:8000/post/123 就會顯示
大家好~~123
記得網址最後面不能有斜線。後面接的 123 就是變數 $id 的值,輸入任何值,controller 就會收到這個值,這時候就可以去資料庫中查詢,這個範例只是單純顯示它。
本文網址:http://blog.tonycube.com/2014/12/laravel-7-controller.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

22 則留言

  1. 請問出現以下這個錯誤訊息是什麼原因? 謝謝
    FatalErrorException in HomeController.php line 3:
    Class 'BaseController' not found

    回覆刪除
    回覆
    1. 你的 BaseController.php 有在同一個目錄裡嗎?它找不到

      刪除
    2. 5.2好像有做變更!路徑變成App\Http\Controllers
      裡面是Controller.php!
      HomeController.php最上頭還要加一段
      namespace App\Http\Controllers;
      才能繼承Controller
      class HomeController extends Controller
      不然會找不到

      刪除
    3. 5.2好像有做變更!路徑變成App\Http\Controllers
      裡面是Controller.php!
      HomeController.php最上頭還要加一段
      namespace App\Http\Controllers;
      才能繼承Controller
      class HomeController extends Controller
      不然會找不到

      刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 您好
    我使用5.3
    我照著樓上5.2的方法打
    卻出現這句
    Class 'App\Http\Controllers\View' not foundnnn

    回覆刪除
    回覆
    1. 確認你的 controller 檔案和 Controller.php 在同一個目錄,
      並且有 use App\Http\Controllers\Controller;

      參考文件:https://laravel.tw/docs/5.2/controllers

      刪除
    2. 你好 我出現同樣問題 但不知改哪
      FatalErrorException in HomeController.php line 3:
      Class 'App\Http\Controllers\BaseController' not found

      刪除
    3. 我假設你是用 5.3 版,
      那 app/Http/Controllers 目錄下應該有 Controller.php
      如果有的話,繼承它,就會像這樣
      ====================================
      <?php

      namespace App\Http\Controllers;

      use Illuminate\Http\Request;

      class xxxController extends Controller
      {
      //...
      }
      ====================================
      xxxController 是你自訂的名稱。

      刪除
    4. namespace App\Http\Controllers;
      use View;----我是加這行就成功了

      刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 我是5.4.15的LARAVEL 以下是可以執行的內容
    ==================
    <?php

    namespace App\Http\Controllers;
    use View;


    class HomeController extends Controller {
    public function index()
    {
    return View::make('test')
    ->with('title', '首頁')
    ->with('hello', '大家好~~');
    }
    }
    ====================

    回覆刪除
  6. 執行完卻跑出Namespace declaration statement has to be the very first statement or after any declare call in the script,但我的確有把namespace放在第一行,還有哪邊可能會出問題呢?感謝賜教!

    回覆刪除
    回覆
    1. 確認檔案的第一行是 <?php 開頭,並且前面沒有任何空白。
      確認有在命令列執行 composer dump-autoload,當你有新增 controller 時,最好都執行一次。

      刪除
    2. 作者已經移除這則留言。

      刪除
    3. 作者已經移除這則留言。

      刪除
  7. 我的網頁無法正常顯示,但將此兩行程式的中文變數值更改為英文便可以正常顯示出,請問版主此狀況如何修正,感謝!!
    ->with('title', '首頁')
    ->with('hello', '大家好~~');

    回覆刪除
    回覆
    1. 在 .env 檔中加入

      APP_LOCALE=zh-Hant-TW
      APP_FALLBACK_LOCALE=zh-Hant-TW

      還有網頁(*.html)的檔頭必須是

      <!DOCTYPE html>
      <html lang="zh-Hant-TW">

      刪除
    2. 另外要檢查一下你的檔案是否儲存為 Unicode 格式,
      例如這張圖片 http://svc.luckstar.com.tw/ShareAll/KM/How/Windows/20170917-graph/NotepadSaveAs.jpg

      刪除
  8. laravel 8
    請使用
    Route::get('/', 'App\Http\Controllers\HomeController@index');
    或是將路徑下此檔\app\Providers\RouteServiceProvider.php
    加入一行
    protected $namespace = 'App\Http\Controllers';
    於class
    即可使用
    Route::get('/', 'HomeController@index');
    不然會呼叫不到自訂的class name

    回覆刪除

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。