2

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

我目前在我的一个控制器中使用 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 Original 文件中添加此代码。

4

2 回答 2

1

我自己设法找到了如何做,这是我第一次做这种事情......如果我的方法有误,请纠正我!

第一的:

我创建了一个名为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 类(特征、扩展等)。

谢谢!

拉斐尔

于 2015-08-30T23:07:14.537 回答
0

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

遗憾的是,没有选项可以扩展StripeGateway类,因为它硬编码在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中,这里的问题是您永远无法知道 .BillableStripeGateway

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

于 2015-08-30T17:38:55.980 回答