L4.2 Extend/override收银员添加税务功能

L4.2 Extend/override Cashier to add Tax feature

我正在将 Laravel 4.2 与 Cashier 一起使用,我需要修改其受保护的函数 buildPayload() 但我不想直接在供应商文件中执行此操作,因为我在编写 Update 时可能会破坏代码...我应该如何继续使用我自己的逻辑覆盖此功能?

我目前通过以下方式在我的控制器之一中使用 Cashier:

$user->subscription('testplan')
                    ->create(Input::get('stripeToken'), [
                        'email' => 'email@email.com,
                    ]);

但是我想添加一个 withTax() 参数... 像这样:

$user->subscription('testplan')
                        ->withTax(10)
                        ->create(Input::get('stripeToken'), [
                            'email' => 'email@email.com,
                        ]);

我已经知道如何直接在 StripeGateway.php 文件中执行此操作,但这是不好的做法...

我知道我需要补充:

protected $taxPercent = 0;

    public function withTax($tax)
    {
        $this->taxPercent = $tax;

        return $this;
    }

    protected function buildPayload()
    {
        $payload = [
            'plan' => $this->plan, 'prorate' => $this->prorate,
            'quantity' => $this->quantity, 'trial_end' => $this->getTrialEndForUpdate(),
            'tax_percent' => $this->taxPercent,
        ];

        return $payload;
    }

我不知道如何不直接在 Cashier 原始文件中添加此代码。

您可以在 user 模型中添加 getTaxPercent 方法,它也会计算税金。Laravel docs

遗憾的是,没有扩展 StripeGateway class 的选项,因为它硬编码在 Billable 特征中,您可以做的是更改这些功能 -

public function charge($amount, array $options = []) { return (new StripeGateway($this))->charge($amount, $options); } public function subscription($plan = null) { return new StripeGateway($this, $plan); } 在你的 user class 中,这里的问题是你永远不知道 Billable 中会发生什么变化,它们可能会更改函数的名称并添加更多使用 StripeGateway 直到错误到来你才会知道。

第一个选项可能会好得多,因为您不需要每次都提及 withTax 方法。

我自己找到了方法,第一次做这种事情...如果方法不对请大家指正!

第一个:

我创建了一个名为 Lib\Cashier 的文件夹,如下所示:laravel/app/Lib/Cashier

然后我创建了 2 个文件:BillableTrait.phpNewStripeGateway.php

BillableTrait.php代码:

<?php namespace Lib\Cashier;

use Laravel\Cashier;
use Lib\Cashier\NewStripeGateway as StripeGateway;

trait BillableTrait {
    use Cashier\BillableTrait;

    /**
     * Get a new billing gateway instance for the given plan.
     *
     * @param  \Laravel\Cashier\PlanInterface|string|null  $plan
     * @return \Laravel\Cashier\StripeGateway
     */
    public function subscription($plan = null)
    {
        if ($plan instanceof PlanInterface) $plan = $plan->getStripeId();

        return new StripeGateway($this, $plan);
    }


}

对于NewStripeGateway.php:

<?php namespace Lib\Cashier;

use Laravel\Cashier\StripeGateway;

class NewStripeGateway extends StripeGateway {

    protected $taxPercent = 0;

    public function withTax($tax)
    {
        $this->taxPercent = $tax;

        return $this;
    }

    protected function buildPayload()
    {
        $payload = [
            'plan' => $this->plan, 'prorate' => $this->prorate,
            'quantity' => $this->quantity, 'trial_end' => $this->getTrialEndForUpdate(),
            'tax_percent' => $this->taxPercent,
        ];

        return $payload;
    }
}

然后我像这样编辑使用 Cashier 的模型(只更改了 USE 块):

use Lib\Cashier\BillableTrait;
use Laravel\Cashier\BillableInterface;

我现在可以直接执行此操作来设置订阅税:

$user->subscription('testplan')
                        ->withTax(10)
                        ->create(Input::get('stripeToken'), [
                            'email' => 'email@email.com',
                        ]);

一切正常!!如果我做错了什么,请注意我的变化,这是我第一次自己挖掘 PHP 类 (traits, extends, etc)..

谢谢!

拉斐尔