Laravel Spark расширяет класс вендора Laravel \ Cashier для переопределения функции - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу переопределить значение Кассира 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(), и это тоже не ударил.

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

1 Ответ

1 голос
/ 09 ноября 2019

Разобрался! Спасибо @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(), он использует CustomBillable newSubscription(), который, в свою очередь, использует CustomSubscriptionBuilder.

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

...