thecodingmachine / graphqlite

Use PHP Attributes/Annotations to declare your GraphQL API

Home Page:https://graphqlite.thecodingmachine.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

@Security with External type declaration - error

ameoba32 opened this issue · comments

commented

I am getting next error when using @Security with External type declaration.

Version: 5.0.3

"array_combine(): Argument #1 ($keys) and argument #2 ($values) must have the same number of elements"
vendor/thecodingmachine/graphqlite/src/Middlewares/SecurityFieldMiddleware.php:132

I've tried to debug the issue myself, it has something related with first parameter, which is always there. But no luck. If I comment out array_combine in SecurityFieldMiddleware.php:132 it seems to work.

Consider next php code example:

namespace App\Types;

use TheCodingMachine\GraphQLite\Annotations\Type;
use TheCodingMachine\GraphQLite\Annotations\Field;
use TheCodingMachine\GraphQLite\Annotations\Security;
use App\Entities\Product;

/**
 * @Type(class=Product::class)
 */
class ProductType
{
    /**
     * @Field
     * @Security("this.canAccess()")
     */
    public function getId(Product $product): string
    {
        return $product->getId();
    }
    
    public function canAccess(): bool
    {
        return true;
    }
}

thanks.

@ameoba32 Can you create a testcase for this, demonstrating the error, so we can work through it? Also, any reason you're not using the latest version?

commented

Ok, I was able to make a test, plz see this pull request #554

@ameoba32 this seems to be caused by the fact that all parameters are expected to map 1:1 to what the GQL schema exposes.
i think you could get this working by just adding a Ignore annotation/attribute for the $product parameter.

commented

@Lappihuan Can you show the code sample?

I think I will just drop the idea of using separate classes for type declaration and convert Types to Entities that I already have. External types does not work with security.

It made sense when I started to use graphqlite lib, wasn't sure about how it would go. After approx 1 year I am quite happy with results and will incorporate types directly into existing classes.