gpt4 book ai didi

laravel-5 - Laravel5 对模型的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-04 02:47:34 24 4
gpt4 key购买 nike

我有一个名为 Surface 的 Eloquent 模型,它依赖于 ZipCodeRepository 对象:

class Surface extends Model{
public function __construct(ZipCodeRepositoryInterface $zipCode){...}

和一个具有许多表面的地址对象。
class Address extends Model{
public surfaces() { return $this->hasMany('App/Surface'); }
}

我的问题是当我调用 $address->surfaces我收到以下错误:
Argument 1 passed to App\Surface::__construct() must be an instance of App\Repositories\ZipCodeRepositoryInterface, none given

我认为 IoC 会自动注入(inject)它。

最佳答案

但是,通过构造函数或方法注入(inject)将服务注入(inject)模型可能不是一个好习惯,请考虑以不需要这样做的方式设计系统,而是将模型注入(inject)服务。
让我们看一个例子(只是一个虚拟的例子来说明问题!)。

  • 假设我们有 Basket 和 Order 模型,我们想将订单添加到购物篮
  • 我们有一个折扣服务,根据订单计算折扣
  • 每次用户将订单添加到购物篮时,我们都需要计算新的折扣并将其设置在购物篮

  • 一种方法是:
    class OrderController
    {
    function store(User $user, Order $order)
    {
    $basket = $user->getBasket();
    $basket->addOrder($order);
    }
    }

    class Basket
    {
    private $discountService;

    public function __construct(DiscountService $discountService)
    {
    $this->discountService = $discountService;
    }

    function addOrder(Order $order)
    {
    $this->orders[] = $order;
    $discount = $this->discountService->calculateFor($this->orders);
    $this->discount = $discount;
    }
    }

    class DiscountService
    {
    function calculateFor(array $orders) {
    // code for calculating discount;
    return $discount;
    }
    }
    在这种方法中,我们将折扣服务注入(inject)到篮子模型中
    另一种更好的方法是这样的:
    class OrderController
    {
    private $discountService;

    public function __construct(DiscountService $discountService)
    {
    $this->discountService = $discountService;
    }

    function store(User $user, Order $order)
    {
    $basket = $user->getBasket();
    $basket->addOrder($order);
    $this->discountService->setDiscount($basket);
    }
    }

    class Basket
    {
    function addOrder(Order $order)
    {
    $this->orders[] = $order;
    }

    function getOrders()
    {
    return $this->orders;
    }

    function setDiscount(int $discount)
    {
    $this->discount = $discount;
    }
    }

    class DiscountService
    {
    function setDiscount(Basket $basket) {
    $discount = $this->calculateFor($basket->getOrders());
    $basket->setDiscount($discount);
    }

    private function calculateFor(array $orders)
    {
    // code for calculating discount
    return $discount;
    }
    }
  • 在第一种方法中,篮子正在决定是否有折扣,但这不是篮子关心的
  • 在第一种方法中,购物篮取决于折扣服务,但在现实世界中,您不需要折扣服务即可拥有购物篮
  • 关于laravel-5 - Laravel5 对模型的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33636880/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com