L4.2扩展/覆盖收银员以添加税务功能

时间:2015-08-30 16:27:53

标签: php laravel laravel-4 laravel-cashier

我正在使用带收银台的Laravel 4.2,我需要修改其受保护的功能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文件中。

2 个答案:

答案 0 :(得分:0)

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

遗憾的是,没有选项可以将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课程中,问题在于您永远无法知道Billable会发生什么变化,他们可能会更改功能的名称,并添加更多使用StripeGateway和您的功能在错误到来之前不会知道。

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

答案 1 :(得分:0)

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

首先:

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

然后我创建了2个文件: BillableTrait.php NewStripeGateway.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类(特征,扩展等)。

谢谢!

圣拉斐尔