Laravel Basic - 4 - 加入更多页面以及auth
2021-02-11 本文已影响0人
芒鞋儿
- Button 以及页面跳转设置
要在"add to Cart" button 上设置click后页面跳转并传data
- 在allproducts.blade.php的add to Cart 下设置如下:
<a href="{{route('AddToCartProduct',['id'=>$product->id])}}" class="btn btn-default add-to-cart"><i class="fa fa-shopping-cart"></i>Add to cart</a>
- Route设置如下:
Route::get('products/addToCart/{id}',['uses'=>'ProductsController@addProductToCart','as'=>'AddToCartProduct']);
设置格式:Route::get('<相对URI+id>',['uses'=>'<controller name>@<function name>','as'=>'<identified name in view php file>']);
- 添加Cart model:
Class Cart extends Model {
public $items; // ['id'=>,'quantity'=>,'data'=>$product]
public $totalQuantity;
public $totalPrice;
public function __construct($prevCart)
{
if($prevCart != null){
$this->items = $prevCart->items;
$this->totalQuantity = $prevCart->totalQuantity;
$this->totalPrice = $prevCart->totalPrice;
}else{
$this->items = [];
$this->totalQuantity = 0;
$this->totalPrice = 0;
}
}
public function addItem($id, $product)
{
$price = (int) str_replace("$","",$product->price);
if(array_key_exists($id,$this->items)){
$productToAdd = $this->items[$id];
$productToAdd['quantity']++;
}else {
$productToAdd = ['quantity'=>1, 'price'=> $price, 'data'=>$product];
}
$this->items[$id] = $productToAdd;
$this->totalQuantity++;
$this->totalPrice = $this->totalPrice + $price;
}
}
此处可以看到model 层可以做很多处理,model 层的数据是内存的数据,stateless 的,而DB所储存的是stateful的数据。model 层的作用是在展示到页面或者保存到DB中对数据做一些处理。
- 在controller中加入对应的function
public function addProductToCart(Request $req,$id)
{
$prevCart = $req->session()->get('cart');
$cart = new Cart($prevCart);
$product = Product::find($id);
$cart->addItem($id,$product);
$req->session()->put('cart',$cart);
//dump($cart);
return redirect()->route('allproducts');
}
如果要返回product页面,如下:
return redirect()->route('allproducts'); //'allproducts' 在route中定义。
- 添加EC的购物车页面和route
- 添加route:
//show cart items
Route::get('cart', ['uses'=>'ProductsController@showCart','as'=>'cartproducts']);
- 在controller中添加showCart function
public function showcart()
{
$cart = Session::get('cart');
if($cart) {
return view('cartproducts',['cartItems'=>$cart]);
}else{
return redirect()->route('allproducts');
}
}
- 关于view('xxx'): 在此处view指向的page名:cartProducts.blade.php,但显示正常,似乎在laravel7当中会自动修正大小写,但最好和view的文件名保持一致。
- Session::get('cart')和$req->session()->get('cart')是一样的。
- 添加购物车页面:
@foreach($cartItems->items as $item)
<td class="active">{{$item['data']['id']}}</td>
<td class="active"><img src="{{Storage::disk('local')->url('product_images/').$item['data']['image']}}" width="100" height="100"></td>
<td class="active">{{$item['data']['name']}}</td>
<td class="active">{{$item['data']['type']}}</td>
<td class="active">{{$item['data']['price']}}</td>
@endforeach
- Icon上跳转的修改
<li><a href="{{route('cartproducts')}}"><i class="fa fa-shopping-cart"></i> Cart</a></li>
讲模板中右上角cart icon的跳转静态Page改设成route的名
- Auth 功能的plugin
用artisan 命令可以生成auth
php artisan make:auth
自动生成route,以及对应的view, controller和认证的页面。
使用方式,在需要控制的页面加入如下例子的控制语句:
@if(Auth::check())
<li><a href="/home"><i class="fa fa-lock"></i> Profile</a></li>
@else
<li><a href="/home"><i class="fa fa-lock"></i> Login</a></li>
@endif