nuwave / lighthouse

A framework for serving GraphQL from Laravel
https://lighthouse-php.com
MIT License
3.36k stars 437 forks source link

it is not possible to use model or builder together with scope in the @paginate directive #1196

Closed crThiago closed 4 years ago

crThiago commented 4 years ago

Describe the bug

It's not possible use builder or model with scope in @paginate directive

Expected behavior/Solution

@paginate directive should allow the builder/model arguments together with scope

Steps to reproduce

  1. Create a scope to view posts in AuthServiceProvider
  2. Include in a query the @paginate(model: "App\\Blog\\BlogPost" scopes: ["view"]) or @paginate(builder: "App\\Blog@visiblePosts" scopes: ["view"])

Output/Logs

Click to expand ``` { "errors": [ { "debugMessage": "Call to undefined method Illuminate\\Database\\Eloquent\\Builder::view()", "message": "Internal server error", "extensions": { "category": "internal" }, "locations": [ { "line": 2, "column": 3 } ], "path": [ "clientes" ], "trace": [ { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Support\/Traits\/ForwardsCalls.php", "line": 36, "call": "Illuminate\\Database\\Eloquent\\Builder::throwBadMethodCallException('view')" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Eloquent\/Builder.php", "line": 1369, "call": "Illuminate\\Database\\Eloquent\\Builder::forwardCallTo(instance of Illuminate\\Database\\Query\\Builder, 'view', array(1))" }, { "call": "Illuminate\\Database\\Eloquent\\Builder::__call('view', array(1))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Execution\/Arguments\/ArgumentSet.php", "line": 154, "function": "call_user_func(array(2), array(2))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Schema\/Directives\/PaginateDirective.php", "line": 122, "call": "Nuwave\\Lighthouse\\Execution\\Arguments\\ArgumentSet::enhanceBuilder(instance of Illuminate\\Database\\Eloquent\\Builder, array(1))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Schema\/Directives\/MiddlewareDirective.php", "line": 100, "call": "Nuwave\\Lighthouse\\Schema\\Directives\\PaginateDirective::Nuwave\\Lighthouse\\Schema\\Directives\\{closure}(null, array(2), instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 130, "call": "Nuwave\\Lighthouse\\Schema\\Directives\\MiddlewareDirective::Nuwave\\Lighthouse\\Schema\\Directives\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Auth\/Middleware\/Authenticate.php", "line": 43, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 171, "call": "Illuminate\\Auth\\Middleware\\Authenticate::handle(instance of Illuminate\\Http\\Request, instance of Closure, 'api')" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Support\/Pipeline.php", "line": 44, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 105, "call": "Nuwave\\Lighthouse\\Support\\Pipeline::Nuwave\\Lighthouse\\Support\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Schema\/Directives\/MiddlewareDirective.php", "line": 105, "call": "Illuminate\\Pipeline\\Pipeline::then(instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Schema\/Factories\/FieldFactory.php", "line": 174, "call": "Nuwave\\Lighthouse\\Schema\\Directives\\MiddlewareDirective::Nuwave\\Lighthouse\\Schema\\Directives\\{closure}(null, array(2), instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/Executor\/ReferenceExecutor.php", "line": 632, "call": "Nuwave\\Lighthouse\\Schema\\Factories\\FieldFactory::Nuwave\\Lighthouse\\Schema\\Factories\\{closure}(null, array(2), instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/Executor\/ReferenceExecutor.php", "line": 555, "call": "GraphQL\\Executor\\ReferenceExecutor::resolveOrError(instance of GraphQL\\Type\\Definition\\FieldDefinition, instance of GraphQL\\Language\\AST\\FieldNode, instance of Closure, null, instance of Nuwave\\Lighthouse\\Schema\\Context, instance of GraphQL\\Type\\Definition\\ResolveInfo)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/Executor\/ReferenceExecutor.php", "line": 1247, "call": "GraphQL\\Executor\\ReferenceExecutor::resolveField(GraphQLType: Query, null, instance of ArrayObject(1), array(1))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/Executor\/ReferenceExecutor.php", "line": 257, "call": "GraphQL\\Executor\\ReferenceExecutor::executeFields(GraphQLType: Query, null, array(0), instance of ArrayObject(1))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/Executor\/ReferenceExecutor.php", "line": 208, "call": "GraphQL\\Executor\\ReferenceExecutor::executeOperation(instance of GraphQL\\Language\\AST\\OperationDefinitionNode, null)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/Executor\/Executor.php", "line": 155, "call": "GraphQL\\Executor\\ReferenceExecutor::doExecute()" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/GraphQL.php", "line": 158, "call": "GraphQL\\Executor\\Executor::promiseToExecute(instance of GraphQL\\Executor\\Promise\\Adapter\\SyncPromiseAdapter, instance of GraphQL\\Type\\Schema, instance of GraphQL\\Language\\AST\\DocumentNode, null, instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/webonyx\/graphql-php\/src\/GraphQL.php", "line": 90, "call": "GraphQL\\GraphQL::promiseToExecute(instance of GraphQL\\Executor\\Promise\\Adapter\\SyncPromiseAdapter, instance of GraphQL\\Type\\Schema, '{\n clientes(page: 1, first: 25) {\n data {\n id\n cep\n }\n }\n}', null, instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null, array(29))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/GraphQL.php", "line": 171, "call": "GraphQL\\GraphQL::executeQuery(instance of GraphQL\\Type\\Schema, '{\n clientes(page: 1, first: 25) {\n data {\n id\n cep\n }\n }\n}', null, instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null, array(29))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/GraphQL.php", "line": 110, "call": "Nuwave\\Lighthouse\\GraphQL::executeQuery('{\n clientes(page: 1, first: 25) {\n data {\n id\n cep\n }\n }\n}', instance of Nuwave\\Lighthouse\\Schema\\Context, array(0), null, null)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Support\/Http\/Controllers\/GraphQLController.php", "line": 70, "call": "Nuwave\\Lighthouse\\GraphQL::executeRequest(instance of Nuwave\\Lighthouse\\Execution\\LighthouseRequest)" }, { "call": "Nuwave\\Lighthouse\\Support\\Http\\Controllers\\GraphQLController::query(instance of Nuwave\\Lighthouse\\Execution\\LighthouseRequest)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Controller.php", "line": 54, "function": "call_user_func_array(array(2), array(1))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/ControllerDispatcher.php", "line": 45, "call": "Illuminate\\Routing\\Controller::callAction('query', array(1))" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Route.php", "line": 219, "call": "Illuminate\\Routing\\ControllerDispatcher::dispatch(instance of Illuminate\\Routing\\Route, instance of Nuwave\\Lighthouse\\Support\\Http\\Controllers\\GraphQLController, 'query')" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Route.php", "line": 176, "call": "Illuminate\\Routing\\Route::runController()" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php", "line": 681, "call": "Illuminate\\Routing\\Route::run()" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 130, "call": "Illuminate\\Routing\\Router::Illuminate\\Routing\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/nuwave\/lighthouse\/src\/Support\/Http\/Middleware\/AcceptJson.php", "line": 30, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 171, "call": "Nuwave\\Lighthouse\\Support\\Http\\Middleware\\AcceptJson::handle(instance of Illuminate\\Http\\Request, instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 105, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php", "line": 683, "call": "Illuminate\\Pipeline\\Pipeline::then(instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php", "line": 658, "call": "Illuminate\\Routing\\Router::runRouteWithinStack(instance of Illuminate\\Routing\\Route, instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php", "line": 624, "call": "Illuminate\\Routing\\Router::runRoute(instance of Illuminate\\Http\\Request, instance of Illuminate\\Routing\\Route)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php", "line": 613, "call": "Illuminate\\Routing\\Router::dispatchToRoute(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php", "line": 170, "call": "Illuminate\\Routing\\Router::dispatch(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 130, "call": "Illuminate\\Foundation\\Http\\Kernel::Illuminate\\Foundation\\Http\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/fideloper\/proxy\/src\/TrustProxies.php", "line": 57, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 171, "call": "Fideloper\\Proxy\\TrustProxies::handle(instance of Illuminate\\Http\\Request, instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/TransformsRequest.php", "line": 21, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 171, "call": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest::handle(instance of Illuminate\\Http\\Request, instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/TransformsRequest.php", "line": 21, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 171, "call": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest::handle(instance of Illuminate\\Http\\Request, instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/ValidatePostSize.php", "line": 27, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 171, "call": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize::handle(instance of Illuminate\\Http\\Request, instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/CheckForMaintenanceMode.php", "line": 63, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 171, "call": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode::handle(instance of Illuminate\\Http\\Request, instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php", "line": 105, "call": "Illuminate\\Pipeline\\Pipeline::Illuminate\\Pipeline\\{closure}(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php", "line": 145, "call": "Illuminate\\Pipeline\\Pipeline::then(instance of Closure)" }, { "file": "\/var\/www\/jueri\/v3\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php", "line": 110, "call": "Illuminate\\Foundation\\Http\\Kernel::sendRequestThroughRouter(instance of Illuminate\\Http\\Request)" }, { "file": "\/var\/www\/jueri\/v3\/public\/index.php", "line": 54, "call": "Illuminate\\Foundation\\Http\\Kernel::handle(instance of Illuminate\\Http\\Request)" } ] } ], "data": { "clientes": null } } ```

**Environment** Lighthouse Version: v4.9.0 Laravel Version: v6.16.0
spawnia commented 4 years ago

That error is caused because you do not have a scopeView on the model.

Just added a test in https://github.com/nuwave/lighthouse/pull/1199, @paginate and scopes works fine.