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.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 类 (traits, extends, etc)..
谢谢!
拉斐尔
我正在将 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.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 类 (traits, extends, etc)..
谢谢!
拉斐尔