PHP code example of jpmmartin / sylius-subscription-plugin

1. Go to this page and download the library: Download jpmmartin/sylius-subscription-plugin library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

jpmmartin / sylius-subscription-plugin example snippets


    // config/bundles.php
    return [
        // ...
        JpmMartin\SyliusSubscriptionPlugin\JpmMartinSyliusSubscriptionPlugin::class => ['all' => true],
    ];
    

    use JpmMartin\SyliusSubscriptionPlugin\Entity\SubscriptionPlanAwareInterface;
    use JpmMartin\SyliusSubscriptionPlugin\Entity\SubscriptionPlanAwareTrait;
    use Sylius\Component\Core\Model\OrderItem as BaseOrderItem;

    #[ORM\Entity]
    #[ORM\Table(name: 'sylius_order_item')]
    class OrderItem extends BaseOrderItem implements SubscriptionPlanAwareInterface
    {
        use SubscriptionPlanAwareTrait;
    }
    

use JpmMartin\SyliusSubscriptionPlugin\Entity\SubscriptionInterface;
use JpmMartin\SyliusSubscriptionPlugin\Payment\CardUpdateProviderInterface;

final class StripeCardUpdateProvider implements CardUpdateProviderInterface
{
    public function supports(SubscriptionInterface $subscription): bool
    {
        return 'STRIPE' === $subscription->getPaymentMethod()?->getCode();
    }

    public function getUrl(SubscriptionInterface $subscription): string
    {
        return '/account/stripe/cards'; // a page of your integration
    }
}

use JpmMartin\SyliusSubscriptionPlugin\Entity\SubscriptionCycleInterface;
use JpmMartin\SyliusSubscriptionPlugin\Gate\CycleGateInterface;
use JpmMartin\SyliusSubscriptionPlugin\Gate\GateDecision;
use Psr\Clock\ClockInterface;

final class PrescriptionGate implements CycleGateInterface
{
    public function __construct(private readonly ClockInterface $clock)
    {
    }

    public function check(SubscriptionCycleInterface $cycle): GateDecision
    {
        if ($this->isPrescriptionValidFor($cycle)) {
            return GateDecision::pass();
        }

        return GateDecision::wait($this->clock->now()->add(new \DateInterval('P5D')), 'Waiting for the prescriber.');
    }

    // ...
}

namespace App\Subscription;

use JpmMartin\SyliusSubscriptionPlugin\Entity\SubscriptionInterface;
use JpmMartin\SyliusSubscriptionPlugin\Event\RenewalUpcoming;
use JpmMartin\SyliusSubscriptionPlugin\Repository\SubscriptionRepositoryInterface;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;

#[AsMessageHandler(bus: 'sylius.event_bus')]
final class TellTheCustomerAboutTheRenewal
{
    /** @param SubscriptionRepositoryInterface<SubscriptionInterface> $subscriptions */
    public function __construct(private readonly SubscriptionRepositoryInterface $subscriptions)
    {
    }

    public function __invoke(RenewalUpcoming $event): void
    {
        $subscription = $this->subscriptions->find($event->subscriptionId);
        if (!$subscription instanceof SubscriptionInterface) {
            return;
        }

        // Email $subscription->getCustomer() that it renews on $event->scheduledAt, with your own sender.
    }
}