Skip to content

Commit aed50a8

Browse files
Laravel 11.x Compatibility (#49)
* Bump dependencies for Laravel 11 * Update GitHub Actions for Laravel 11 * Allow PHP 8.3 * Bump collections * formatting * formatting * formatting * Fix tests * Update upgrade guide * Linting * Fix build * Fix version constraint * Fix compatibility issue * Fix migrations * Fix conflict * lint --------- Co-authored-by: Tim MacDonald <[email protected]>
1 parent 32e7a0c commit aed50a8

12 files changed

+185
-269
lines changed

.github/workflows/main.yml

+132-123
Original file line numberDiff line numberDiff line change
@@ -1,128 +1,137 @@
11
name: CI
22

33
on:
4-
push:
5-
branches: [ main ]
6-
pull_request:
7-
branches: [ main ]
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
branches:
9+
- main
810

911
jobs:
10-
lint:
11-
runs-on: ubuntu-latest
12-
name: 'Lint'
13-
steps:
14-
- name: Checkout code
15-
uses: actions/checkout@v3
16-
17-
- name: Get composer cache directory
18-
id: composer-cache
19-
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
20-
21-
- name: Cache dependencies
22-
uses: actions/cache@v3
23-
with:
24-
path: ${{ steps.composer-cache.outputs.dir }}
25-
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
26-
restore-keys: ${{ runner.os }}-composer-
27-
28-
- name: Setup PHP
29-
uses: shivammathur/setup-php@v2
30-
with:
31-
php-version: '8.1'
32-
coverage: pcov
33-
34-
- name: Install dependencies
35-
run: composer update
36-
37-
- name: Check platform requirements
38-
run: composer check-platform-reqs
39-
40-
- name: PHP-CS-Fixer
41-
run: composer fix -- --dry-run
42-
43-
# - name: composer normalize
44-
# run: composer normalize --dry-run --no-interaction --verbose
45-
46-
# - name: test coverage
47-
# run: |
48-
# ./vendor/bin/phpunit --coverage-clover=coverage.xml --debug --verbose
49-
# bash <(curl -s https://codecov.io/bash)
50-
# env:
51-
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
52-
53-
# - name: Infection
54-
# run: ./vendor/bin/infection --show-mutations --min-covered-msi=100 --no-progress --no-interaction --verbose
55-
# env:
56-
# INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }}
57-
58-
# - name: Psalm
59-
# run: ./vendor/bin/psalm --shepherd --no-progress
60-
61-
# - name: PHPStan
62-
# run: ./vendor/bin/phpstan --no-interaction --verbose
63-
#
64-
# composer-require-checker
65-
# composer-unused
66-
67-
tests:
68-
runs-on: ubuntu-latest
69-
name: 'PHP: ${{ matrix.php }}; Laravel: ${{ matrix.laravel }}; Prefer: ${{ matrix.prefer }}'
70-
strategy:
71-
matrix:
72-
php: ['8.1', '8.2']
73-
laravel: ['^9.0', '^10.0']
74-
prefer: ['prefer-lowest', 'prefer-stable']
75-
include:
76-
- testbench: '^7.0'
77-
laravel: '^9.0'
78-
- testbench: '^8.0'
79-
laravel: '^10.0'
80-
81-
steps:
82-
- name: checkout code
83-
uses: actions/checkout@v3
84-
85-
- name: Get composer cache directory
86-
id: composer-cache
87-
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
88-
89-
- name: Cache dependencies
90-
uses: actions/cache@v3
91-
with:
92-
path: ${{ steps.composer-cache.outputs.dir }}
93-
key: ${{ runner.os }}-php-${{ matrix.php }}-laravel-${{ matrix.laravel }}-prefer-${{ matrix.prefer }}-composer-${{ hashFiles('**/composer.json') }}
94-
restore-keys: ${{ runner.os }}-php-${{ matrix.php }}-laravel-{{ matrix.laravel }}-prefer-${{ matrix.prefer}}-composer-
95-
96-
- name: Setup PHP
97-
uses: shivammathur/setup-php@v2
98-
with:
99-
php-version: ${{ matrix.php }}
100-
coverage: none
101-
102-
- name: Remove dev packages
103-
run: |
104-
composer remove --dev --no-update \
105-
friendsofphp/php-cs-fixer \
106-
infection/infection \
107-
nunomaduro/larastan \
108-
phpstan/phpstan-strict-rules
109-
110-
- name: Require Laravel and Testbench version
111-
run: composer require --no-update laravel/framework:"${{ matrix.laravel }}" illuminate/collections:"${{ matrix.laravel }}" illuminate/database:"${{ matrix.laravel }}" illuminate/http:"${{ matrix.laravel }}" illuminate/support:"${{ matrix.laravel }}" orchestra/testbench:"${{ matrix.testbench }}"
112-
113-
- name: Support prefer-lowest in PHP 8.1
114-
if: ${{ matrix.php == 8.1 && matrix.prefer == 'prefer-lowest' }}
115-
run: composer require --no-update nesbot/carbon:"^2.62.1"
116-
117-
- name: Support prefer-lowest in PHP 8.2
118-
if: ${{ matrix.php == 8.2 && matrix.prefer == 'prefer-lowest' }}
119-
run: composer require --no-update nesbot/carbon:"^2.62.1"
120-
121-
- name: Install dependencies
122-
run: composer update --${{ matrix.prefer }}
123-
124-
- name: Check platform requirements
125-
run: composer check-platform-reqs --verbose
126-
127-
- name: Run tests
128-
run: composer test
12+
lint:
13+
runs-on: ubuntu-latest
14+
name: Lint
15+
steps:
16+
- name: Checkout code
17+
uses: actions/checkout@v3
18+
19+
- name: Get composer cache directory
20+
id: composer-cache
21+
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
22+
23+
- name: Cache dependencies
24+
uses: actions/cache@v3
25+
with:
26+
path: ${{ steps.composer-cache.outputs.dir }}
27+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
28+
restore-keys: ${{ runner.os }}-composer-
29+
30+
- name: Setup PHP
31+
uses: shivammathur/setup-php@v2
32+
with:
33+
php-version: '8.1'
34+
coverage: pcov
35+
36+
- name: Install dependencies
37+
run: composer update
38+
39+
- name: Check platform requirements
40+
run: composer check-platform-reqs
41+
42+
- name: PHP-CS-Fixer
43+
run: composer fix -- --dry-run
44+
45+
# - name: composer normalize
46+
# run: composer normalize --dry-run --no-interaction --verbose
47+
48+
# - name: test coverage
49+
# run: "./vendor/bin/phpunit --coverage-clover=coverage.xml --debug --verbose && bash <(curl -s https://codecov.io/bash)"
50+
# env:
51+
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
52+
53+
# - name: Infection
54+
# run: "./vendor/bin/infection --show-mutations --min-covered-msi=100 --no-progress --no-interaction --verbose"
55+
# env:
56+
# INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }}
57+
58+
# - name: Psalm
59+
# run: ./vendor/bin/psalm --shepherd --no-progress
60+
61+
# - name: PHPStan
62+
# run: ./vendor/bin/phpstan --no-interaction --verbose
63+
64+
# composer-require-checker
65+
# composer-unused
66+
67+
tests:
68+
runs-on: ubuntu-latest
69+
name: "PHP: ${{ matrix.php }}; Laravel: ${{ matrix.laravel }}; Prefer: ${{ matrix.prefer }}"
70+
strategy:
71+
matrix:
72+
php: ['8.1', '8.2', '8.3']
73+
laravel: [^9.0, ^10.0, ^11.0]
74+
prefer: [prefer-lowest, prefer-stable]
75+
include:
76+
- testbench: ^7.0
77+
laravel: ^9.0
78+
- testbench: ^8.0
79+
laravel: ^10.0
80+
- testbench: ^9.0
81+
laravel: ^11.0
82+
exclude:
83+
- laravel: ^11.0
84+
php: '8.1'
85+
86+
steps:
87+
- name: checkout code
88+
uses: actions/checkout@v3
89+
90+
- name: Get composer cache directory
91+
id: composer-cache
92+
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
93+
94+
- name: Cache dependencies
95+
uses: actions/cache@v3
96+
with:
97+
path: ${{ steps.composer-cache.outputs.dir }}
98+
key: ${{ runner.os }}-php-${{ matrix.php }}-laravel-${{ matrix.laravel }}-prefer-${{ matrix.prefer }}-composer-${{ hashFiles('**/composer.json') }}
99+
restore-keys: ${{ runner.os }}-php-${{ matrix.php }}-laravel-{{ matrix.laravel }}-prefer-${{ matrix.prefer}}-composer-
100+
101+
- name: Setup PHP
102+
uses: shivammathur/setup-php@v2
103+
with:
104+
php-version: ${{ matrix.php }}
105+
coverage: none
106+
107+
- name: Remove dev packages
108+
run: |
109+
composer remove --dev --no-update \
110+
friendsofphp/php-cs-fixer \
111+
infection/infection \
112+
nunomaduro/larastan \
113+
phpstan/phpstan-strict-rules
114+
115+
- name: Require Laravel and Testbench version
116+
run: composer require --no-update laravel/framework:"${{ matrix.laravel }}" illuminate/collections:"${{ matrix.laravel }}" illuminate/database:"${{ matrix.laravel }}" illuminate/http:"${{ matrix.laravel }}" illuminate/support:"${{ matrix.laravel }}" orchestra/testbench:"${{ matrix.testbench }}"
117+
118+
- name: Support prefer-lowest in PHP 8.1
119+
if: ${{ matrix.php == 8.1 && matrix.prefer == 'prefer-lowest' }}
120+
run: composer require --no-update nesbot/carbon:"^2.62.1"
121+
122+
- name: Support prefer-lowest in PHP 8.2
123+
if: ${{ matrix.php == 8.2 && matrix.prefer == 'prefer-lowest' }}
124+
run: composer require --no-update nesbot/carbon:"^2.62.1"
125+
126+
- name: Support prefer-lowest in PHP 8.3
127+
if: ${{ matrix.php == 8.3 && matrix.prefer == 'prefer-lowest' }}
128+
run: composer require --no-update nesbot/carbon:"^2.62.1"
129+
130+
- name: Install dependencies
131+
run: composer update --${{ matrix.prefer }}
132+
133+
- name: Check platform requirements
134+
run: composer check-platform-reqs --verbose
135+
136+
- name: Run tests
137+
run: composer test

UPGRADE.md

+27
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,30 @@ Now collections are formatted correctly. The `posts` value is now an object and
103103
}
104104
}
105105
```
106+
107+
## Server implementation no longer included by default
108+
109+
Previously, the top level `jsonapi` property was included in every response...
110+
111+
```json5
112+
{
113+
// ...
114+
"jsonapi": {
115+
"version": "1.0"
116+
}
117+
}
118+
```
119+
120+
This is no longer the case. If you would like to include a server implementation in your API responses you may call the `JsonApiResource::resolveServerImplementationUsing` method in a service provider or middleware:
121+
122+
```php
123+
use TiMacDonald\JsonApi\JsonApiResource;
124+
use TiMacDonald\JsonApi\ServerImplementation;
125+
126+
127+
JsonApiResource::resolveServerImplementationUsing(function () {
128+
return new ServerImplementation(version: '1.4.3', meta: [
129+
'secure' => true,
130+
]);
131+
});
132+
```

composer.json

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@
1717
}
1818
],
1919
"require": {
20-
"php": "~8.1.0 || ~8.2.0",
21-
"illuminate/collections": "^9.0 || ^10.0",
22-
"illuminate/database": "^9.0 || ^10.0",
23-
"illuminate/http": "^9.0 || ^10.0",
24-
"illuminate/support": "^9.0 || ^10.0",
25-
"symfony/http-kernel": "^6.0"
20+
"php": "~8.1.0 || ~8.2.0 || ~8.3.0",
21+
"illuminate/collections": "^9.0 || ^10.0 || ^11.0",
22+
"illuminate/database": "^9.0 || ^10.0 || ^11.0",
23+
"illuminate/http": "^9.0 || ^10.0 || ^11.0",
24+
"illuminate/support": "^9.0 || ^10.0 || ^11.0",
25+
"symfony/http-kernel": "^6.0 || ^7.0"
2626
},
2727
"require-dev": {
2828
"friendsofphp/php-cs-fixer": "^3.13",
29-
"laravel/framework": "^9.0 || ^10.0",
29+
"laravel/framework": "^9.0 || ^10.0 || ^11.0",
3030
"opis/json-schema": "^2.3",
31-
"orchestra/testbench": "^7.0 || ^8.0",
32-
"phpunit/phpunit": "^9.0"
31+
"orchestra/testbench": "^7.0 || ^8.0 || ^9.0",
32+
"phpunit/phpunit": "^9.0 || ^10.5"
3333
},
3434
"config": {
3535
"preferred-install": "dist",

src/Concerns/Implementation.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ trait Implementation
1313
/**
1414
* @api
1515
*
16-
* @param (callable(): JsonApiServerImplementation) $callback
16+
* @param (callable(): ServerImplementation) $callback
1717
* @return void
1818
*/
1919
public static function resolveServerImplementationUsing(callable $callback)
@@ -24,7 +24,7 @@ public static function resolveServerImplementationUsing(callable $callback)
2424
/**
2525
* @internal
2626
*
27-
* @return (callable(Request): (JsonApiServerImplementation|null))
27+
* @return (callable(Request): (ServerImplementation|null))
2828
*/
2929
public static function serverImplementationResolver()
3030
{

src/JsonApiResource.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public function toResourceIdentifier(Request $request)
9999
}
100100

101101
/**
102-
* @return JsonApiServerImplementation|null
102+
* @return ServerImplementation|null
103103
*/
104104
public static function toServerImplementation(Request $request)
105105
{
@@ -124,9 +124,10 @@ public function toArray($request)
124124
}
125125

126126
/**
127-
* @return array{included?: array<int, JsonApiResource>, jsonapi: JsonApiServerImplementation}
127+
* @param Request $request
128+
* @return array{included?: array<int, JsonApiResource>, jsonapi: ServerImplementation}
128129
*/
129-
public function with(Request $request)
130+
public function with($request)
130131
{
131132
return [
132133
...($included = $this->included($request)

src/JsonApiResourceCollection.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,10 @@ private function resolveResourceIdentifiers(Request $request)
4242
}
4343

4444
/**
45-
* @return array{included?: array<int, JsonApiResource>, jsonapi?: JsonApiServerImplementation}
45+
* @param Request $request
46+
* @return array{included?: array<int, JsonApiResource>, jsonapi?: ServerImplementation}
4647
*/
47-
public function with(Request $request)
48+
public function with($request)
4849
{
4950
return [
5051
...($included = $this->collection

0 commit comments

Comments
 (0)