iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

學框架永不嫌晚,從現在開始學Laravel你也可以系列 第 5

Day 5 Laravel基礎功 - 控制器Controller

  • 分享至 

  • xImage
  •  

我們在進行頁面跳轉的時候,不是網址加參數互傳就沒事了
以資料查詢為例,我們會先把查詢所需的參數丟給特定頁面,接著特定頁面再藉由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'
  ]]);

?>

上一篇
Day 3 Laravel基礎功 - CSRF Protection跨領域攻擊的防護機制
下一篇
Day 6 Laravel基礎功 - MiddleWare中介層
系列文
學框架永不嫌晚,從現在開始學Laravel你也可以14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言