GET'ting a collection of Albums [Raw Symfony 4]


We have covered how to GET a single Album by ID. We saw that we would need to have injected the AlbumRepository, and that we could use the Symfony routing annotations to ensure we only got ID's that were numerical.

With that numerical value we could ask the repository for the Album entity matching the given ID, and then return that as JSON, with a little detour through the jsonSerialize method.

As it turned out, GETting just a single Album wasn't that hard.

And Good News Everybody! Getting a collection of Albums is really straightforward. We've done all the hard work.

There's two things we need to do:

  1. Make sure we use a slightly different name for our route.
  2. Switch the AlbumRepository method call from find to findAll.

Honestly, both of these are super straightforward - it's basically a case of copy / paste the existing get method, and make some small adjustments:

    /**
     * @Route(
     *     "/album",
     *     name="cget_album",
     *     methods={"GET"}
     * )
     *
     * @return JsonResponse
     */
    public function cget()
    {
        return new JsonResponse(
            $this->albumRepository->findAll(),
            JsonResponse::HTTP_OK
        );
    }

I'm using the method name of cget. 'c' here means Collection. Use any naming format you like. I've borrowed this from FOSRESTBundle.

Likewise, if you copy / paste from the existing get method then make sure your @Route name is updated. If you have two routes with the same name, Symfony will get confused and take the last route it finds with the given name. It won't tell you it's done this, either, which is frustrating.

Anyway, that's basically us done.

php vendor/bin/behat --tags=t

Feature: Provide a consistent standard JSON API endpoint

  In order to build interchangeable front ends
  As a JSON API developer
  I need to allow Create, Read, Update, and Delete functionality

  Background:                                          # features/album.feature:7
    Given there are Albums with the following details: # FeatureContext::thereAreAlbumsWithTheFollowingDetails()
      | title                              | track_count | release_date              |
      | some fake album name               | 12          | 2020-01-08T00:00:00+00:00 |
      | another great album                | 9           | 2019-01-07T23:22:21+00:00 |
      | now that's what I call Album vol 2 | 23          | 2018-02-06T11:10:09+00:00 |

  @t
  Scenario: Can get a collection of Albums  # features/album.feature:28
    Given I request "/album" using HTTP GET # Imbo\BehatApiExtension\Context\ApiContext::requestPath()
    Then the response code is 200           # Imbo\BehatApiExtension\Context\ApiContext::assertResponseCodeIs()
    And the response body contains JSON:    # Imbo\BehatApiExtension\Context\ApiContext::assertResponseBodyContainsJson()
      """
      [
        {
          "id": 1,
          "title": "some fake album name",
          "track_count": 12,
          "release_date": "2020-01-08T00:00:00+00:00"
        },
        {
          "id": 2,
          "title": "another great album",
          "track_count": 9,
          "release_date": "2019-01-07T23:22:21+00:00"
        },
        {
          "id": 3,
          "title": "now that's what I call Album vol 2",
          "track_count": 23,
          "release_date": "2018-02-06T11:10:09+00:00"
        }
      ]
      """

1 scenario (1 passed)
4 steps (4 passed)
0m0.27s (9.71Mb)

Nice and easy, right?

Episodes

# Title Duration
1 What will our JSON API actually do? 08:46
2 What needs to be in our Database for our Tests to work? 12:32
3 Cleaning up after each Test Run 02:40
4 Docker makes for Easy Databases 09:01
5 Healthcheck [Raw Symfony 4] 07:53
6 Send in JSON data using POST [Raw Symfony 4] 05:33
7 Keep your data nice and tidy using Symfony's Form [Raw Symfony 4] 10:48
8 Validating incoming JSON [Raw Symfony 4] 08:26
9 Nicer error messages [Raw Symfony 4] 06:23
10 GET'ting data from our Symfony 4 API [Raw Symfony 4] 08:11
11 GET'ting a collection of Albums [Raw Symfony 4] 01:50
12 Update existing Albums with PUT [Raw Symfony 4] 05:00
13 Upsetting Purists with PATCH [Raw Symfony 4] 02:39
14 Hitting DELETE [Raw Symfony 4] 02:11
15 How to open your API to the outside world with CORS [Raw Symfony 4] 07:48
16 Getting Setup with Symfony 4 and FOSRESTBundle [FOSRESTBundle] 09:11
17 Healthcheck [FOSRESTBundle] 06:14
18 Handling POST requests [FOSRESTBundle] 08:31
19 Saving POST data to the database [FOSRESTBundle] 09:44
20 Work with XML, or JSON, or Both [FOSRESTBundle] 04:31
21 Going far, then Too Far with the ViewResponseListener [FOSRESTBundle] 03:19
22 GET'ting data from your Symfony 4 API [FOSRESTBundle] 05:58
23 GET'ting a Collection of data from your Symfony 4 API [FOSRESTBundle] 01:27
24 Updating with PUT [FOSRESTBundle] 02:58
25 Partially Updating with PATCH [FOSRESTBundle] 02:15
26 DELETE'ing Albums [FOSRESTBundle] 01:27
27 Handling Errors [FOSRESTBundle] 08:58
28 Introducing the API Platform [API Platform] 08:19
29 The Entry Point [API Platform] 04:30
30 The Context [API Platform] 05:52
31 Healthcheck - Custom Endpoint [API Platform] 05:17
32 Starting with POST [API Platform] 07:08
33 Creating Entities with the Schema Generator [API Platform] 07:38
34 Defining A Custom POST Route [API Platform] 07:31
35 Finishing POST [API Platform] 06:29
36 GET'ting One Resource [API Platform] 02:50
37 GET'ting Multiple Resources [API Platform] 02:59
38 PUT to Update Existing Data [API Platform] 02:19
39 DELETE to Remove Data [API Platform] 01:15
40 No One Likes Errors [API Platform] 03:28