Я использую Laravel 4.2 с Cashier, и мне нужно изменить его защищенную функцию buildPayload (), но я не хочу делать это непосредственно в файле вендора, поскольку я могу нарушить код при обновлении композитора … Как мне перейти к переопределить эту функцию моей собственной логикой?
В настоящее время я использую Кассу в одном из моих контроллеров, выполнив:
$user->subscription('testplan')
->create(Input::get('stripeToken'), [
'email' => '[email protected],
]);
Но я хочу добавить параметры withTax () …
Вот так:
$user->subscription('testplan')
->withTax(10)
->create(Input::get('stripeToken'), [
'email' => '[email protected],
]);
Я уже знаю, как это сделать прямо в 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.
Вы могли бы добавить 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
метод каждый раз.
Мне удалось найти, как это сделать самостоятельно, я впервые делаю такие вещи … Пожалуйста, поправьте меня, если мой метод неверен!
Первый:
Я создал папку с именем Lib \ кассир вот так: Laravel / приложение / Lib / Кассир
Затем я создал 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;
}
}
А потом я отредактировал свою модель, в которой используется кассир, примерно так (только изменил блок USE):
use Lib\Cashier\BillableTrait;
use Laravel\Cashier\BillableInterface;
Теперь я могу сделать это напрямую, чтобы установить налог на подписку:
$user->subscription('testplan')
->withTax(10)
->create(Input::get('stripeToken'), [
'email' => '[email protected]',
]);
Работает отлично !! Если есть что-то, что я сделал не так, пожалуйста, обратите внимание на изменения, я впервые копаю PHP-классы (черты, расширения и т. Д.) Сам …
Спасибо!
Рафаэль