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

浏览器访问 http://localhost/product/2 或者 http://localhost/product/1 ,页面响应商品1或商品2的数据。
这里写图片描述

需求来了

要对商品统一打个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。

获取Bean的方法很多,其他参考官网:https://doc.swoft.org/master/zh-CN/core/container.html

使用@Inject 属性注入的方式 加载Bean

在控制里:

    /**
     * @Inject(name="ProductFilter")
     */
    public $product_filter;

product_filter属性打上了@Inject注解。

然后使用:

$product = $this->product_filter->filter(Product::findById($id)->getResult()) ;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值