Laravel Spark расширяет класс поставщика Laravel\Cashier, чтобы переопределить функцию

Я хочу переопределить SubscriptionBuilder::buildPayload() кассира. Что выглядит так:

    protected function buildPayload()
    {
        return array_filter([
            'billing_cycle_anchor' => $this->billingCycleAnchor,
            'coupon' => $this->coupon,
            'expand' => ['latest_invoice.payment_intent'],
            'metadata' => $this->metadata,
            'plan' => $this->plan,
            'quantity' => $this->quantity,
            'tax_percent' => $this->getTaxPercentageForPayload(),
            'trial_end' => $this->getTrialEndForPayload(),
            'off_session' => true,
        ]);
    }

Я хочу добавить к этому 1 параметр, который равен 'collection_method': 'invoice'

Поэтому я пытаюсь переопределить эту функцию, чтобы изменить ее.

Я попробовал несколько вещей, а именно следующие ответы:

Стратегия переопределения класса в библиотеке установлен с Composer

Laravel 5.7 Переопределить класс поставщика и расширить старый

Я добавил свой CustomSubscriptionBuilder в App\SparkOverrides\

<?php

namespace Laravel\Cashier;

class CustomSubscriptionBuilder extends SubscriptionBuilder
{
    protected function buildPayload()
    {
        dd('here');
    }
}

Затем в composer.json я добавил:

"autoload": {
        ...
        "files": [
            "app/SparkOverrides/CustomSubscriptionBuilder.php"
        ]
    },

Затем я запустил composer dump-autoload. Но затем, когда я пытаюсь создать подписку, dd() никогда не попадает. Чтобы сделать ситуацию еще более запутанной, я добавил дамп и штамп к vendor buildPayload(), и это тоже не срабатывает.

Я чувствую, что я близок, но чего-то не хватает. Спасибо за любую помощь.


person brandonbanks    schedule 09.11.2019    source источник
comment
только потому, что вы создали класс, который расширяет другой класс, не означает, что кто-либо знает, что ваш новый класс существует... там, где этот SubscriptionBuilder необходим, он жестко запрограммирован в Billable @newSubscription   -  person lagbox    schedule 09.11.2019
comment
Это имеет смысл, но не приближает меня к выяснению того, как решить эту проблему.   -  person brandonbanks    schedule 09.11.2019
comment
ну, это жестко запрограммировано в черте, поэтому расширьте черту и переопределите метод и используйте новую расширенную черту в своей модели или в модели переопределите метод   -  person lagbox    schedule 09.11.2019
comment
Спасибо за советы @lagbox! Я смог получить его.   -  person brandonbanks    schedule 10.11.2019
comment
здорово, рад, что у вас получилось :)   -  person lagbox    schedule 10.11.2019


Ответы (2)


Догадаться! Спасибо @lagbox за то, что указали мне правильное направление.

Я создал класс CustomBillable и класс CustomSubscriptionBuilder.

Оба этих класса находятся в app/SparkOverrides/

<?php

namespace App\SparkOverrides;

use Laravel\Spark\Billable;

trait CustomBillable
{
    use Billable;

    /**
     * Overriding Cashier's newSubscription to use
     * my CustomSubscriptionBuilder
     */
    public function newSubscription($subscription, $plan)
    {
        return new CustomSubscriptionBuilder($this, $subscription, $plan);
    }
}
<?php

namespace App\SparkOverrides;

use Laravel\Cashier\SubscriptionBuilder;

class CustomSubscriptionBuilder extends SubscriptionBuilder
{
    protected function buildPayload()
    {
        return array_filter([
            'billing_cycle_anchor' => $this->billingCycleAnchor,
            'coupon' => $this->coupon,
            'expand' => ['latest_invoice.payment_intent'],
            'metadata' => $this->metadata,
            'plan' => $this->plan,
            'quantity' => $this->quantity,
            'tax_percent' => $this->getTaxPercentageForPayload(),
            'trial_end' => $this->getTrialEndForPayload(),
            'off_session' => true,
            'collection_method' => 'send_invoice',
            'days_until_due' => 30,
        ]);
    }
}

Затем я заменил черту Billable на свою черту CustomBillable в Spark\User.

<?php

namespace Laravel\Spark;

use App\SparkOverrides\CustomBillable;
use Illuminate\Support\Str;
use Illuminate\Notifications\RoutesNotifications;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use CustomBillable, HasApiTokens, RoutesNotifications;
    ...
}

User Приложения расширяет Spark\User. Итак, теперь, когда вызывается newSubscription(), он использует newSubscription() CustomBillable, который, в свою очередь, использует CustomSubscriptionBuilder.

Я надеюсь, что это поможет кому-то. Некоторое время возился с этим.

person brandonbanks    schedule 09.11.2019
comment
Правильный способ сделать это — написать класс, реализующий интерфейс Laravel\Spark\Contracts\Interactions\Subscribe, и внедрить его в контейнер с помощью метода register класса SparkServiceProvider. Взгляните на Laravel\Spark\Providers\SparkServiceProvider::registerServices() - person impeto; 19.08.2020

Я опаздываю, но вы можете просто переопределить метод newSubscription в классе App\User, который наследует его от класса Laravel\Spark\User. Просто мысль...

person impeto    schedule 19.08.2020