L4.2 Расширить / переопределить Кассу, чтобы добавить функцию налога

Я использую 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.

2

Решение

Вы могли бы добавить 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 метод каждый раз.

0

Другие решения

Мне удалось найти, как это сделать самостоятельно, я впервые делаю такие вещи … Пожалуйста, поправьте меня, если мой метод неверен!

Первый:

Я создал папку с именем 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-классы (черты, расширения и т. Д.) Сам …

Спасибо!

Рафаэль

0

По вопросам рекламы [email protected]