iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Modern Web

跳脫MVC,Laravel + React 建立電商網站系列 第 23

Day 23 Laravel + React 實戰之路 -6商品詳細頁(後端)

  • 分享至 

  • xImage
  •  

今天的目標是把商品詳細頁的後端寫完,因為商品詳細頁只會有單一商品,因此這裡我只取id = 1的商品來撰寫
因為商品詳細頁還沒有做入口的連結,因此我這邊就直接打網址進入畫面
首先,一樣要在router註冊一個路徑出來:
web.php

Route::get('product/{product_id}' , [\App\Http\Controllers\homeController::class,'product'])
        ->name('product');

這裡我補充一下,因為router接收到的商品id是一個變數,所以我們要用大括號把變數刮起來,這樣HomeController的product這個function就可以接收到路經傳送的變數
如果這個變數可有可無,可以在後面加個問號變成{product?}

我們實際到畫面試試看,我們在網址列指輸入網址到 /product/
可以發現,在{product}的情況下會被丟到404(因為沒有符合的註冊路徑);反之在{product?} 的情況下會被判定成符合路徑,而丟到HomeController的product function之中。

接下來我們一樣讓Controller 去 Service拿資料
product function

public function product($product_id) 
{ 
    $product = $this->product_service->getSingleProduct('id' , $product_id)->first(); 
}

注意:我這裡寫first不是寫get
兩者差別,可以將拿回來的資料dd看一下就知道

first回傳回來的結購:
https://ithelp.ithome.com.tw/upload/images/20220927/20145703rX3ErYPEOS.png

get回傳回來的結購:
https://ithelp.ithome.com.tw/upload/images/20220927/20145703bARMWAjkBM.png

first 是直接回傳Product
而get 會把他包成一個collect

getSingleProduct function

public function getSingleProduct($column , $value) 
{ 
    return Product::with('prices' , 'images')->where($column , $value); 
}

因為畫面上的東西其實跟商品列表那邊一樣,所以我一樣把回來的資料丟進ProductVariable

 public function product($product_id) 
    { 
        $user_type = 'NORMAL'; 
        if(Auth::check()){ 
            $user = Auth::user(); 
            $user_type = $user->type; 
        } 
         
        $product = $this->product_service->getSingleProduct('id' , $product_id)->first(); 
        $new_product = new ProductVariable($product); 
        $new_product->setProductPrice($product->prices->where('user_type',$user_type)
                    ->first()->price); 
        return Inertia::render('ProductDetail' , [ 
            'product' => $new_product, 
        ]);
    }

然後我就發現 拿user_type的code好像一模一樣ㄟ
所以就來做一些更改來簡化程式碼~

__construct

public function __construct(ProductService $product_service) 
{ 
    $this->product_service = $product_service; 
    $user_type = 'NORMAL'; 
    $this->middleware(function($request , $next){ 
        if (Auth::check()){ 
            $user = Auth::user(); 
            $this->user = $user; 
            $user_type = $user->type; 
        } 
        return $next($request); 
    }); 
    $this->user_type = $user_type; 
}

注意:這裡一定要透過middleware來拿到Auth

然後再回到前端修改資料,因為做法跟商品列表頁一樣,我就不浪費寶貴的閱讀時間了~

明天來個番外篇,做一個切換頁籤的小功能~


上一篇
Day 22 Laravel + React 實戰之路 -6商品詳細頁(前端)
下一篇
Day 24 番外篇 - 試試看刻一個元件
系列文
跳脫MVC,Laravel + React 建立電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言