calliostro/spotify-web-api-bundle

Spotify Web API client for Symfony 6.4, Symfony 7 and Symfony 8

Installs: 1 613

Dependents: 0

Suggesters: 0

Security: 0

Stars: 12

Watchers: 1

Forks: 3

Open Issues: 1

Type:symfony-bundle

v1.2.0 2025-08-22 08:37 UTC

This package is auto-updated.

Last update: 2025-08-22 08:52:59 UTC


README

Build Status Version License

🚀 Easy integration of jwilsson/spotify-web-api-php into Symfony 6.4, 7 & 8!

✨ Features

  • Simple integration with Symfony 6.4, 7 & 8
  • Supports Client Credentials & Authorization Code flows
  • Autowire Spotify API services
  • Customizable token provider
  • Easy configuration

📦 Installation

Make sure Composer is installed globally, as explained in the installation chapter of the Composer documentation.

⚡ Applications that use Symfony Flex

Open a command console, enter your project directory and execute:

composer require calliostro/spotify-web-api-bundle

🛠️ Applications that don't use Symfony Flex

Step 1: Download the Bundle

Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:

composer require calliostro/spotify-web-api-bundle

Step 2: Enable the Bundle

Then, enable the bundle by adding it to the list of registered bundles in the config/bundles.php file of your project:

// config/bundles.php

return [
    // ...
    Calliostro\SpotifyWebApiBundle\CalliostroSpotifyWebApiBundle::class => ['all' => true],
];

Supports Symfony 6.4, 7.x and 8.x!

⚙️ Configuration

First, you must register your application at https://developer.spotify.com/dashboard/applications to obtain the client_id and client_secret.

If you want to access user-related endpoints, the user must grant access to your application. Spotify provides OAuth 2.0 for this purpose. You need to register the redirect_uri in the Spotify dashboard. For the following example, you would add https://127.0.0.1:8000/callback/ to the allowlist addresses.

For configuration, create a new config/packages/calliostro_spotify_web_api.yaml file. Here is an example:

# config/packages/calliostro_spotify_web_api.yaml
calliostro_spotify_web_api:

    # Your Client ID
    client_id:            '' # Required

    # Your Client Secret
    client_secret:        '' # Required

    # Options for SpotifyWebAPI client
    # https://github.com/jwilsson/spotify-web-api-php/blob/main/docs/examples/setting-options.md
    options:
        auto_refresh:     false
        auto_retry:       false
        return_assoc:     false

    # Address to redirect to after authentication success OR failure
    redirect_uri:         '' # Example: 'https://127.0.0.1:8000/callback/'

    # Service ID of the token provider that provides the user's access token
    token_provider:       calliostro_spotify_web_api.token_provider

🎬 Usage

This bundle provides a single service for communication with Spotify Web API, which you can autowire by using the SpotifyWebAPI and Session type-hint:

🔑 Client Credentials

This is the simpler option if no user-related endpoints are required.

// src/Controller/SomeController.php

use SpotifyWebAPI\SpotifyWebAPI;
// ...

class SomeController
{
    public function index(SpotifyWebAPI $api)
    {
        $search = $api->search('Thriller', 'album');

        var_dump($search);

        // ...
    }
}

🧑‍💻 Authorization Code

If you want to access a Spotify user's profile or data, you must first redirect the user to Spotify's approval page. Then you can start the session.

// src/Controller/SpotifyController.php

namespace App\Controller;

use SpotifyWebAPI\Session;
use SpotifyWebAPI\SpotifyWebAPI;
use SpotifyWebAPI\SpotifyWebAPIAuthException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class SpotifyController extends AbstractController
{
    public function __construct(
        private SpotifyWebAPI $api,
        private Session $session
    ) {}

    #[Route('/', name: 'home')]
    public function index(): Response
    {
        return new Response('
            <h1>Spotify Web API Demo</h1>
            <p>Welcome to the Spotify Web API Bundle demonstration!</p>
            <p><a href="/authorize">Click here to authorize with Spotify</a></p>
        ', 200, ['Content-Type' => 'text/html']);
    }

    #[Route('/callback')]
    public function callback(Request $request): Response
    {
        try {
            $this->session->requestAccessToken($request->query->getString('code'));
        } catch (SpotifyWebAPIAuthException) {
            return $this->redirectToRoute('authorize');
        }

        $this->api->setAccessToken($this->session->getAccessToken());
        $me = $this->api->me();

        return new Response('
            <h1>Spotify Authorization Successful!</h1>
            <p>Welcome, ' . htmlspecialchars($me->display_name ?? 'Spotify User') . '!</p>
            <pre>' . htmlspecialchars(var_export($me, true)) . '</pre>
            <p><a href="/">Back to Home</a></p>
        ', 200, ['Content-Type' => 'text/html']);
    }

    #[Route('/authorize', name: 'authorize')]
    public function authorize(): Response
    {
        $options = [
            'scope' => [
                'user-read-email',
            ],
        ];

        return $this->redirect($this->session->getAuthorizeUrl($options));
    }
}

⚠️ Remember to set redirect_uri in the configuration file and allowlist it on Spotify!

📚 Documentation

See jwilsson/spotify-web-api-php for documentation of the SpotifyWebAPI service.

See Spotify's Web API full API documentation.

⚡ Supported Symfony Versions

  • Symfony 6.4 (LTS)
  • Symfony 7.x
  • Symfony 8.x

🤝 Contributing

Implemented a missing feature? You can request it. And creating a pull request is an even better way to get things done.

🏁 Quick Start

  1. Install the bundle with Composer
  2. Configure your Spotify credentials
  3. Autowire the service and start using the API!

💬 Support

For questions or help, feel free to open an issue or reach out! 😊