Skip to content

Commit 1dfefda

Browse files
jonericksonsoyuka
andauthored
feat(laravel): add middleware granularity (#6962)
Co-authored-by: soyuka <[email protected]>
1 parent 21bf7b1 commit 1dfefda

File tree

4 files changed

+34
-16
lines changed

4 files changed

+34
-16
lines changed

src/Laravel/.php-cs-fixer.cache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"php":"8.3.14","version":"3.64.0:v3.64.0#58dd9c931c785a79739310aef5178928305ffa67","indent":" ","lineEnding":"\n","rules":{"binary_operator_spaces":{"default":"at_least_single_space"},"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"braces_position":{"allow_single_line_empty_anonymous_classes":true},"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_parentheses":true,"no_blank_lines_after_class_opening":true,"no_extra_blank_lines":{"tokens":["use"]},"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"none"},"return_type_declaration":true,"short_scalar_cast":true,"single_import_per_statement":{"group_to_single_imports":false},"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","const_import","do","else","elseif","final","finally","for","foreach","function","function_import","if","insteadof","interface","namespace","new","private","protected","public","static","switch","trait","try","use","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"unary_operator_spaces":{"only_dec_inc":true},"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"attribute_placement":"ignore","on_multiline":"ensure_fully_multiline"},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"stdin.php":"b44802ce1721771a99bd5c345e644954"}}

src/Laravel/config/api-platform.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,14 @@
6262
'graphql' => [
6363
'enabled' => false,
6464
'nesting_separator' => '__',
65-
'introspection' => ['enabled' => true]
65+
'introspection' => ['enabled' => true],
66+
// 'middleware' => null
67+
],
68+
69+
'graphiql' => [
70+
// 'enabled' => true,
71+
// 'domain' => null,
72+
// 'middleware' => null
6673
],
6774

6875
'exception_to_status' => [

src/Laravel/phpstan.neon.dist

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ parameters:
88
paths:
99
- ApiResource
1010
- config
11+
- routes
1112
- Controller
1213
- Eloquent
1314
- Exception
@@ -17,8 +18,3 @@ parameters:
1718
- Tests
1819
ignoreErrors:
1920
- '#Cannot call method expectsQuestion#'
20-
#
21-
# excludePaths:
22-
# - ./*/*/FileToBeExcluded.php
23-
#
24-
# checkMissingIterableValueType: false

src/Laravel/routes/api.php

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
use Illuminate\Support\Facades\Route;
2626

2727
$globalMiddlewares = config()->get('api-platform.routes.middleware', []);
28-
$domain = config()->get('api-platform.routes.domain');
28+
$domain = config()->get('api-platform.routes.domain', '');
2929

3030
Route::domain($domain)->middleware($globalMiddlewares)->group(function (): void {
3131
$resourceNameCollectionFactory = app()->make(ResourceNameCollectionFactoryInterface::class);
@@ -35,20 +35,23 @@
3535
foreach ($resourceMetadataFactory->create($resourceClass) as $resourceMetadata) {
3636
foreach ($resourceMetadata->getOperations() as $operation) {
3737
$uriTemplate = str_replace('{._format}', '{_format?}', $operation->getUriTemplate());
38-
$uriTemplate = rtrim($operation->getRoutePrefix(), '/').'/'.ltrim($uriTemplate, '/');
3938

4039
/* @var HttpOperation $operation */
41-
Route::addRoute($operation->getMethod(), $uriTemplate, ApiPlatformController::class)
42-
->middleware(ApiPlatformMiddleware::class.':'.$operation->getName())
43-
->middleware($operation->getMiddleware())
40+
$route = Route::addRoute($operation->getMethod(), $uriTemplate, ['uses' => ApiPlatformController::class, 'prefix' => $operation->getRoutePrefix() ?? ''])
4441
->where('_format', '^\.[a-zA-Z]+')
4542
->name($operation->getName())
4643
->setDefaults(['_api_operation_name' => $operation->getName(), '_api_resource_class' => $operation->getClass()]);
44+
45+
$route->middleware(ApiPlatformMiddleware::class.':'.$operation->getName());
46+
47+
if ($operation->getMiddleware()) {
48+
$route->middleware($operation->getMiddleware());
49+
}
4750
}
4851
}
4952
}
5053

51-
$prefix = config()->get('api-platform.defaults.route_prefix') ?? '';
54+
$prefix = config()->get('api-platform.defaults.route_prefix', '');
5255

5356
Route::group(['prefix' => $prefix], function (): void {
5457
Route::group(['middleware' => ApiPlatformMiddleware::class], function (): void {
@@ -67,11 +70,22 @@
6770
});
6871

6972
if (config()->get('api-platform.graphql.enabled')) {
70-
Route::addRoute(['POST', 'GET'], '/graphql', GraphQlEntrypointController::class)
71-
->name('api_graphql');
73+
Route::group([
74+
'middleware' => config()->get('api-platform.graphql.middleware', []),
75+
], function (): void {
76+
Route::addRoute(['POST', 'GET'], '/graphql', GraphQlEntrypointController::class)
77+
->name('api_graphql');
78+
});
7279

73-
Route::get('/graphiql', GraphiQlController::class)
74-
->name('api_graphiql');
80+
if (config()->get('api-platform.graphiql.enabled', true)) {
81+
Route::group([
82+
'middleware' => config()->get('api-platform.graphiql.middleware', []),
83+
'domain' => config()->get('api-platform.graphiql.domain', ''),
84+
], function (): void {
85+
Route::get('/graphiql', GraphiQlController::class)
86+
->name('api_graphiql');
87+
});
88+
}
7589
}
7690
});
7791
});

0 commit comments

Comments
 (0)