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