我們在進行頁面跳轉的時候,不是網址加參數互傳就沒事了
以資料查詢為例,我們會先把查詢所需的參數丟給特定頁面,接著特定頁面再藉由Controller的方法,得到我們想要的資料再包給畫面後在瀏覽器呈現
基礎的控制器Controller
Controller.php
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class UserController extends Controller
{
public function show($id)
{
return view('user.profile', [
'user' => User::findOrFail($id)
// User::findOrFail($id) 有可能是找到的資料有可能是拋出的錯誤
]);
}
}
?>
route.php
<?php
use App\Http\Controllers\UserController;
Route::get('/user/{id}', [UserController::class, 'show']);
?>
在這裡裡我們看到了
1.我們先藉由路由傳入一個id參數給UserController的show方法
2.show方法又出叫user中的FindorFail,將結果回傳回來打包丟給user.profile了
如果我們的Controller只有單一個功能的話,我們可以定義 __invoke 方法來使用,這樣就不用特定在route呼叫方法了
Controller.php
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class ShowProfile extends Controller
{
public function __invoke($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
?>
Route.php
<?php
Route::get('user/{id}', 'ShowProfile');
?>
我們也可以藉由路由傳送資源給控制器,同時使用多個控制器內的方法
<?php
Route::resource('photos', 'PhotoController');
Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
?>
若一開始預設載入六個函式,我們也可以設定有執行那些或不執行那些
<?php
Route::resource('photo', 'PhotoController', ['only' => [
'index', 'show'
]]);
Route::resource('photo', 'PhotoController', ['except' => [
'create', 'store', 'update', 'destroy'
]]);
?>