3分鐘短文:Laravel控制器用法光速入門

程式設計師小助手發表於2020-10-21

引言

上一章我們介紹了laravel路由註冊中的“花拳繡腿”,樣樣都是那麼優雅而實用。路由傳遞過來的引數,在經過中介軟體驗證和導向之後,應該去控制器接受處理了。

img

本文用最簡單的示例,讓你明白laravel中控制器是幹什麼的,以及怎麼用。

程式碼時間

在開始介紹之前,我們先看一下MVC設計模式的一個概要圖:

pic

Model就是模型,是資料庫互動部分;View就是檢視,是渲染資料的頁面。我們本期介紹的就是中間的連線部分—— controller 控制器。

首先使用命令列腳手架建立一個控制器檔案:

php artisan make:controller TasksController

預設的控制器檔案放置在 app/Http/Controllers 目錄下。我們看生成的檔案預設程式碼:

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
class TasksController extends Controller
{
}

僅僅是繼承了框架的 Controller 類。沒有什麼可寫的,我們就寫個 hello world 練練手吧:

public function home()
{
    return 'Hello, World!';
}

我們宣告瞭 home 方法,並直接返回了字串。接下來,為了這個方法可以被訪問到,需要路由的配合,在 routes/web.php 檔案內新增一條路由地址:

Route::get('/', 'TasksController@home');

編輯完成並儲存後,在瀏覽器直接訪問根目錄,如果配置正確,那麼瀏覽器會直接返回 hello world 文字。

如果要在控制器裡把資料準備好,併傳送給檢視檔案,比如 index 方法內返回一個檢視:

public function index()
{
    return view('tasks.index')->with('tasks', Task::all());
}

其中 Task::all() 是模型檔案 Task 查詢所有資料庫內的資料,並賦值給 tasks 變數,傳送到 tasks.index 檢視檔案內。

仿照restfulapi風格的路由,再定義兩條路由地址,用於開啟表單,和接收表單提交的資料:

Route::get('tasks/create', 'TasksController@create');
Route::post('tasks', 'TasksController@store');

表單怎麼寫不在本文的介紹範圍,後面我們有專門章節詳細闡述檢視模板。我們且說一說接收使用者表單提交資料的POST方法:

public function store()
{
    $task = new Task;
    $task->title = Input::get('title');
    $task->description = Input::get('description');
    $task->save();
    return redirect('tasks');
}

其中 Input 類來自 Illuminate\Support\Facades\Input。laravel貼心地把輸入資料整合到 Request 類內了。所以我們可以方便地使用依賴注入的方式,這樣改寫 store 方法:

public function store(\Illuminate\Http\Request $request)
{
    $task = new Task;
    $task->title = $request->input('title');
    $task->description = $request->input('description');
    $task->save();
    return redirect('tasks');
}

上面講的這些個路由,其實都包含在了laravel提供的資源路由之內,我們建立一個資源路由相關的控制器,並初始化框架程式碼,可以使用命令實現:

php artisan make:controller TaskController --resource

大家可以自行嘗試,我們就不再貼出骨架程式碼了。其預設生成的路由有下面這些:

img

這就是restful風格。這麼多路由和請求方法,每次都要重寫一次豈不要命。還好laravel提供了一個方法,預設給我們做了這些重複工作,所以只要用 resource 方法註冊就可以了:

Route::resource('tasks', 'TasksController');

要檢視系統內所有已註冊的路由,可以使用下面的指令:

php artisan route:list

寫在最後

本文淺顯地介紹了laravel中控制器的使用,最重要的是,resource路由方法預設的骨架程式碼,為我們統一寫作api介面提供了標準,在團隊協作中尤其重要。

Happy coding :-)

我是@程式設計師小助手,專注程式設計知識,圈子動態的IT領域原創作者

本作品採用《CC 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章