swoft速學:載入bean、屬性注入;案例:商品引數過濾
阿新 • • 發佈:2019-01-02
1、我們有一個ProductController.php
,程式碼如下:
<?php
namespace App\Controllers\Api;
use App\Models\Entity\Product;
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
/**
* @Controller(prefix="/product")
*/
class ProductController{
/**
* @RequestMapping(route="{id}", method=RequestMethod::GET)
* @param int $id
* @return mixed
*/
public function detail(int $id)
{
return Product::findById($id)->getResult();
}
}
需求來了
要對商品統一打個8折
Product::findById($id)-> getResult();
#方法一 獲取到商品資料之後,把價格欄位 * 0.8
但聰明的你,可能會想到專門寫個類來處理這種情況。
比如,如下類ProductFilter.php
:
<?php
namespace App\Filter;
use App\Models\Entity\Product;
class ProductFilter
{
// 折扣率
public $discount_rate = 0.8;
public function filter(Product $product)
{
if (!$product){
return null;
}
// 重新計算商品價格
$price = $product->getPrice() * $this->discount_rate;
// 設定新的價格
$product->setPrice($price);
return $product;
}
}
然後在控制器中,呼叫上類的filter()
方法來處理:
// 把商品物件交給ProductFilter處理一下
$filter = new ProductFilter();
$product = $filter->filter(Product::findById($id)->getResult()) ;
return $product;
使用@Bean
<?php
namespace App\Filter;
use App\Models\Entity\Product;
use \Swoft\Bean\Annotation\Bean;
/**
* @Bean("ProductFilter")
*/
class ProductFilter
{
// 折扣率
public $discount_rate = 0.8;
public function filter(Product $product)
{
if (!$product){
return null;
}
// 重新計算商品價格
$price = $product->getPrice() * $this->discount_rate;
// 設定新的價格
$product->setPrice($price);
return $product;
}
}
給剛才ProductFilter
類打上了@Bean("ProductFilter")
註解。
打上了這個註解之後,在我們控制器裡使用的時候就不必例項化這個類了,那怎麼搞呢?
$filter = BeanFactory::getBean('ProductFilter');
$product = $filter->filter(Product::findById($id)->getResult()) ;
使用BeanFactory::getBean('xxx')
來載入Bean。
使用@Inject 屬性注入的方式 載入Bean
在控制裡:
/**
* @Inject(name="ProductFilter")
*/
public $product_filter;
給product_filter
屬性打上了@Inject
註解。
然後使用:
$product = $this->product_filter->filter(Product::findById($id)->getResult()) ;