1. 程式人生 > >swoft速學:載入bean、屬性注入;案例:商品引數過濾

swoft速學:載入bean、屬性注入;案例:商品引數過濾

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()) ;