Skip to content

Commit 23a6882

Browse files
authored
feat: Add Laravel 13 support (#724)
* feat: Add Laravel 13 support - Update composer.json constraints for laravel/framework, illuminate/contracts, laravel/mcp, orchestra/testbench, and openai-php/laravel - Add Laravel 13 + testbench 11 to CI test matrix - Fix HasActionLogs trait to avoid calling Model::observe() during boot, which triggers recursive model instantiation in Laravel 13 * Fix styling * fix: merge --------- Co-authored-by: binaryk <6833714+binaryk@users.noreply.github.com>
1 parent bf025b5 commit 23a6882

60 files changed

Lines changed: 445 additions & 352 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/tests.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ jobs:
1111
matrix:
1212
os: [ubuntu-latest, windows-latest]
1313
php: [8.5, 8.4, 8.3]
14-
laravel: [12.*, 11.*]
14+
laravel: [13.*, 12.*, 11.*]
1515
stability: [prefer-stable]
1616
exclude:
1717
- php: 8.5
1818
laravel: 11.*
1919
include:
20+
- laravel: 13.*
21+
testbench: 11.*
2022
- laravel: 12.*
2123
testbench: 10.*
2224
- laravel: 11.*

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ docs/.vuepress/dist
1212
.phpunit.result.cache
1313
.php-cs-fixer.cache
1414
phpstan.neon
15-
.github/instructions
15+
.github/instructions
16+
# Local Netlify folder
17+
.netlify

composer.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
],
2020
"require": {
2121
"php": "^8.3",
22-
"illuminate/contracts": "^11.0|^12.0",
23-
"laravel/framework": "^11.0|^12.0",
24-
"laravel/mcp": "^0.4.1|^0.5",
22+
"illuminate/contracts": "^11.0|^12.0|^13.0",
23+
"laravel/framework": "^11.0|^12.0|^13.0",
24+
"laravel/mcp": "^0.4.1|^0.5|^0.6",
2525
"laravel/pint": "^1.25.1",
2626
"spatie/laravel-data": "^4.4",
2727
"spatie/laravel-package-tools": "^1.12",
@@ -31,8 +31,8 @@
3131
"brianium/paratest": "^7.0.6",
3232
"doctrine/dbal": "^3.0|^4.0",
3333
"nunomaduro/collision": "^8.1",
34-
"openai-php/laravel": "^0.8.1|^0.11",
35-
"orchestra/testbench": "^9.0|^10.0",
34+
"openai-php/laravel": "^0.8.1|^0.11|^0.19",
35+
"orchestra/testbench": "^9.0|^10.0|^11.0",
3636
"phpstan/extension-installer": "^1.1",
3737
"phpstan/phpstan-deprecation-rules": "^1.0|^2.0",
3838
"phpstan/phpstan-phpunit": "^1.0|^2.0",
0 Bytes
Binary file not shown.

docs-v3/nuxt.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ export default defineNuxtConfig({
8686
typeCheck: false
8787
},
8888

89-
// Static site generation for Vercel
89+
// Static site generation for Netlify
9090
ssr: true,
9191
nitro: {
92-
preset: 'vercel-static',
92+
preset: 'netlify-static',
9393
prerender: {
9494
failOnError: false,
9595
crawlLinks: true,

polyscope.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"scripts": {
3+
"setup": "herd link",
4+
"archive": "herd unlink"
5+
},
6+
"preview": {
7+
"url": "http://{{folder}}.test"
8+
}
9+
}

src/Bootstrap/RoutesDefinition.php

Lines changed: 55 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,32 @@
22

33
namespace Binaryk\LaravelRestify\Bootstrap;
44

5+
use Binaryk\LaravelRestify\Http\Controllers\FieldDestroyController;
56
use Binaryk\LaravelRestify\Http\Controllers\GlobalSearchController;
7+
use Binaryk\LaravelRestify\Http\Controllers\ListActionsController;
8+
use Binaryk\LaravelRestify\Http\Controllers\ListGettersController;
9+
use Binaryk\LaravelRestify\Http\Controllers\ListRepositoryActionsController;
10+
use Binaryk\LaravelRestify\Http\Controllers\ListRepositoryGettersController;
11+
use Binaryk\LaravelRestify\Http\Controllers\PerformActionController;
12+
use Binaryk\LaravelRestify\Http\Controllers\PerformGetterController;
13+
use Binaryk\LaravelRestify\Http\Controllers\PerformRepositoryActionController;
14+
use Binaryk\LaravelRestify\Http\Controllers\PerformRepositoryGetterController;
615
use Binaryk\LaravelRestify\Http\Controllers\ProfileController;
716
use Binaryk\LaravelRestify\Http\Controllers\ProfileUpdateController;
17+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryApplyFiltersController;
18+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryAttachController;
19+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryDestroyBulkController;
20+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryDestroyController;
21+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryDetachController;
22+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryFilterController;
23+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryIndexController;
24+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryPatchController;
25+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryShowController;
26+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryStoreBulkController;
27+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryStoreController;
28+
use Binaryk\LaravelRestify\Http\Controllers\RepositorySyncController;
29+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryUpdateBulkController;
30+
use Binaryk\LaravelRestify\Http\Controllers\RepositoryUpdateController;
831
use Binaryk\LaravelRestify\Http\Controllers\RestifyJsSetupController;
932
use Illuminate\Support\Facades\Route;
1033

@@ -19,98 +42,98 @@ public function __invoke(?string $uriKey = null)
1942
// Filters
2043
Route::get(
2144
$prefix.'/filters',
22-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryFilterController::class
45+
RepositoryFilterController::class
2346
)->name('filters.index');
2447

2548
Route::post(
2649
$prefix.'/apply-restify-advanced-filters',
27-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryApplyFiltersController::class
50+
RepositoryApplyFiltersController::class
2851
)->name('filters.apply');
2952

3053
// Actions
3154
Route::get(
3255
$prefix.'/actions',
33-
\Binaryk\LaravelRestify\Http\Controllers\ListActionsController::class
56+
ListActionsController::class
3457
)->name('actions.index');
3558
Route::get(
3659
$prefix.'/{repositoryId}/actions',
37-
\Binaryk\LaravelRestify\Http\Controllers\ListRepositoryActionsController::class
60+
ListRepositoryActionsController::class
3861
)->name('actions.repository.index');
3962
Route::post(
4063
$prefix.'/action',
41-
\Binaryk\LaravelRestify\Http\Controllers\PerformActionController::class
64+
PerformActionController::class
4265
)->name('actions.perform');
4366
Route::post(
4467
$prefix.'/actions',
45-
\Binaryk\LaravelRestify\Http\Controllers\PerformActionController::class
68+
PerformActionController::class
4669
)->name('actions.performs'); // alias to the previous route
4770
Route::post(
4871
$prefix.'/{repositoryId}/action',
49-
\Binaryk\LaravelRestify\Http\Controllers\PerformRepositoryActionController::class
72+
PerformRepositoryActionController::class
5073
)->name('actions.repository.perform');
5174
Route::post(
5275
$prefix.'/{repositoryId}/actions',
53-
\Binaryk\LaravelRestify\Http\Controllers\PerformRepositoryActionController::class
76+
PerformRepositoryActionController::class
5477
)->name('actions.repository.performs'); // alias to the previous route
5578

5679
// Getters
5780
Route::get(
5881
$prefix.'/getters',
59-
\Binaryk\LaravelRestify\Http\Controllers\ListGettersController::class
82+
ListGettersController::class
6083
)->name('getters.index')->withoutMiddleware($this->excludedMiddleware);
6184
Route::get(
6285
$prefix.'/{repositoryId}/getters',
63-
\Binaryk\LaravelRestify\Http\Controllers\ListRepositoryGettersController::class
86+
ListRepositoryGettersController::class
6487
)->name('getters.repository.index')->withoutMiddleware($this->excludedMiddleware);
6588
Route::get(
6689
$prefix.'/getters/{getter}',
67-
\Binaryk\LaravelRestify\Http\Controllers\PerformGetterController::class
90+
PerformGetterController::class
6891
)->name('getters.perform')->withoutMiddleware($this->excludedMiddleware);
6992
Route::get(
7093
$prefix.'/{repositoryId}/getters/{getter}',
71-
\Binaryk\LaravelRestify\Http\Controllers\PerformRepositoryGetterController::class
94+
PerformRepositoryGetterController::class
7295
)->name('getters.repository.perform')->withoutMiddleware($this->excludedMiddleware);
7396

7497
// API CRUD
7598
Route::get(
7699
$prefix.'',
77-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryIndexController::class
100+
RepositoryIndexController::class
78101
)->name('index')->withoutMiddleware($this->excludedMiddleware);
79102
Route::post(
80103
$prefix.'',
81-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryStoreController::class
104+
RepositoryStoreController::class
82105
)->name('store');
83106
Route::post(
84107
$prefix.'/bulk',
85-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryStoreBulkController::class
108+
RepositoryStoreBulkController::class
86109
)->name('store.bulk');
87110
Route::post(
88111
$prefix.'/bulk/update',
89-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryUpdateBulkController::class
112+
RepositoryUpdateBulkController::class
90113
)->name('update.bulk');
91114
Route::delete(
92115
$prefix.'/bulk/delete',
93-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryDestroyBulkController::class
116+
RepositoryDestroyBulkController::class
94117
)->name('destroy.bulk');
95118
Route::get(
96119
$prefix.'/{repositoryId}',
97-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryShowController::class
120+
RepositoryShowController::class
98121
)->name('show')->withoutMiddleware($this->excludedMiddleware);
99122
Route::patch(
100123
$prefix.'/{repositoryId}',
101-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryPatchController::class
124+
RepositoryPatchController::class
102125
)->name('patch');
103126
Route::put(
104127
$prefix.'/{repositoryId}',
105-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryUpdateController::class
128+
RepositoryUpdateController::class
106129
)->name('put');
107130
Route::post(
108131
$prefix.'/{repositoryId}',
109-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryUpdateController::class
132+
RepositoryUpdateController::class
110133
)->name('update');
111134
Route::delete(
112135
$prefix.'/{repositoryId}',
113-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryDestroyController::class
136+
RepositoryDestroyController::class
114137
)->name('destroy');
115138

116139
if ($uriKey) {
@@ -120,47 +143,47 @@ public function __invoke(?string $uriKey = null)
120143
// Fields
121144
Route::delete(
122145
$prefix.'/{repositoryId}/field/{field}',
123-
\Binaryk\LaravelRestify\Http\Controllers\FieldDestroyController::class
146+
FieldDestroyController::class
124147
)->name('field.destroy');
125148

126149
// Attach related repository id
127150
Route::post(
128151
$prefix.'/{repositoryId}/attach/{relatedRepository}',
129-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryAttachController::class
152+
RepositoryAttachController::class
130153
)->name('attach');
131154
Route::post(
132155
$prefix.'/{repositoryId}/detach/{relatedRepository}',
133-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryDetachController::class
156+
RepositoryDetachController::class
134157
)->name('detach');
135158
Route::post(
136159
$prefix.'/{repositoryId}/sync/{relatedRepository}',
137-
\Binaryk\LaravelRestify\Http\Controllers\RepositorySyncController::class
160+
RepositorySyncController::class
138161
)->name('sync');
139162

140163
// Relatable
141164
Route::get(
142165
'/{parentRepository}/{parentRepositoryId}/{repository}',
143-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryIndexController::class
166+
RepositoryIndexController::class
144167
)->name('relatable.index');
145168
Route::post(
146169
'/{parentRepository}/{parentRepositoryId}/{repository}',
147-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryStoreController::class
170+
RepositoryStoreController::class
148171
)->name('relatable.store');
149172
Route::get(
150173
'/{parentRepository}/{parentRepositoryId}/{repository}/{repositoryId}',
151-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryShowController::class
174+
RepositoryShowController::class
152175
)->name('relatable.show');
153176
Route::post(
154177
'/{parentRepository}/{parentRepositoryId}/{repository}/{repositoryId}',
155-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryUpdateController::class
178+
RepositoryUpdateController::class
156179
)->name('relatable.update');
157180
Route::put(
158181
'/{parentRepository}/{parentRepositoryId}/{repository}/{repositoryId}',
159-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryUpdateController::class
182+
RepositoryUpdateController::class
160183
)->name('relatable.updatePut');
161184
Route::delete(
162185
'/{parentRepository}/{parentRepositoryId}/{repository}/{repositoryId}',
163-
\Binaryk\LaravelRestify\Http\Controllers\RepositoryDestroyController::class
186+
RepositoryDestroyController::class
164187
)->name('relatable.destroy');
165188
}
166189

src/Commands/ActionCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Console\ConfirmableTrait;
66
use Illuminate\Console\GeneratorCommand;
7+
use Illuminate\Contracts\Filesystem\FileNotFoundException;
78
use Illuminate\Support\Str;
89

910
class ActionCommand extends GeneratorCommand
@@ -30,7 +31,7 @@ public function handle()
3031
* @param string $name
3132
* @return string
3233
*
33-
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
34+
* @throws FileNotFoundException
3435
*/
3536
protected function buildClass($name)
3637
{

src/Commands/GetterCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Console\ConfirmableTrait;
66
use Illuminate\Console\GeneratorCommand;
7+
use Illuminate\Contracts\Filesystem\FileNotFoundException;
78
use Illuminate\Support\Str;
89

910
class GetterCommand extends GeneratorCommand
@@ -30,7 +31,7 @@ public function handle()
3031
* @param string $name
3132
* @return string
3233
*
33-
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
34+
* @throws FileNotFoundException
3435
*/
3536
protected function buildClass($name)
3637
{

src/Commands/GraphqlGenerateCommand.php

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
use Binaryk\LaravelRestify\Fields\Field;
66
use Binaryk\LaravelRestify\Http\Requests\RepositoryStoreRequest;
7+
use Binaryk\LaravelRestify\Http\Requests\RestifyRequest;
78
use Binaryk\LaravelRestify\Restify;
89
use Illuminate\Console\Command;
910
use Illuminate\Console\ConfirmableTrait;
1011
use Illuminate\Filesystem\Filesystem;
1112
use Illuminate\Support\Collection;
13+
use Illuminate\Support\Facades\Auth;
1214
use Illuminate\Support\Str;
1315

1416
class GraphqlGenerateCommand extends Command
@@ -152,7 +154,7 @@ protected function showPreview(Collection $repositories, string $outputPath, str
152154
try {
153155
if (class_exists($repositoryClass)) {
154156
$repository = new $repositoryClass;
155-
$request = app(\Binaryk\LaravelRestify\Http\Requests\RestifyRequest::class);
157+
$request = app(RestifyRequest::class);
156158
$fieldCollection = $repository->collectFields($request);
157159

158160
$sampleFields = collect($fieldCollection)->take(4);
@@ -270,7 +272,7 @@ protected function generateType(string $repositoryClass, string $typeName): stri
270272
}
271273

272274
$repository = new $repositoryClass;
273-
$request = app(\Binaryk\LaravelRestify\Http\Requests\RestifyRequest::class);
275+
$request = app(RestifyRequest::class);
274276

275277
$fields = [' id: ID!'];
276278

@@ -306,7 +308,7 @@ protected function generateInputType(string $repositoryClass, string $typeName):
306308
}
307309

308310
$repository = new $repositoryClass;
309-
$request = app(\Binaryk\LaravelRestify\Http\Requests\RestifyRequest::class);
311+
$request = app(RestifyRequest::class);
310312

311313
$fields = [];
312314

@@ -644,13 +646,13 @@ public function __call($method, $parameters)
644646
};
645647

646648
// Mock Auth facade
647-
\Illuminate\Support\Facades\Auth::shouldReceive('user')
649+
Auth::shouldReceive('user')
648650
->andReturn($mockUser);
649651

650-
\Illuminate\Support\Facades\Auth::shouldReceive('check')
652+
Auth::shouldReceive('check')
651653
->andReturn(true);
652654

653-
\Illuminate\Support\Facades\Auth::shouldReceive('id')
655+
Auth::shouldReceive('id')
654656
->andReturn(1);
655657

656658
request()->setUserResolver(function () use ($mockUser) {
@@ -663,11 +665,11 @@ public function __call($method, $parameters)
663665
});
664666

665667
// Extend RestifyRequest to return our mock user
666-
$originalMakeMethod = \Binaryk\LaravelRestify\Http\Requests\RestifyRequest::class.'::createFrom';
668+
$originalMakeMethod = RestifyRequest::class.'::createFrom';
667669

668670
// Create a custom request instance that returns our mock user
669-
app()->bind(\Binaryk\LaravelRestify\Http\Requests\RestifyRequest::class, function ($app) use ($mockUser) {
670-
$request = new \Binaryk\LaravelRestify\Http\Requests\RestifyRequest;
671+
app()->bind(RestifyRequest::class, function ($app) use ($mockUser) {
672+
$request = new RestifyRequest;
671673

672674
// Override the user method to return our mock
673675
$reflection = new \ReflectionClass($request);

0 commit comments

Comments
 (0)