我正在使用带收银台的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文件中。
答案 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类(特征,扩展等)。
谢谢!
圣拉斐尔