Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How send and process context? #617

Closed
des1roer opened this issue Nov 22, 2019 · 10 comments
Closed

How send and process context? #617

des1roer opened this issue Nov 22, 2019 · 10 comments

Comments

@des1roer
Copy link

des1roer commented Nov 22, 2019

Q A
Bug report? no
Feature request? no
BC Break report? no
RFC? no

How send and process context?

@murtukov
Copy link
Member

@des1roer

Your message makes no sense.

@mcg-web
Copy link
Member

mcg-web commented Nov 22, 2019

@des1roer can you provide some use case or examples of what you trying to do please?

@des1roer
Copy link
Author

in graphql exist context

https://graphql-modules.com/docs/introduction/context

i can use it?

@murtukov
Copy link
Member

murtukov commented Nov 22, 2019

@des1roer

Yes you can use it:

resolve: "@=resolver('myResolver', [args, context])"

Russian: Тебе нужно получить доступ к контексту в твоем резолвере? Просто передавай в твоих конфигах переменную context в резолвер, как показано в примере выше. Я там передал в резолвер две переменные args и context. Передавать можно в любом порядке. твой резолвер затем будет выглядет примерно так:

public function myResolver($args, $context) {
    // ...
}

@des1roer
Copy link
Author

des1roer commented Nov 22, 2019

russian;
у меня в yaml

     affiliateClicksAndCommission:
            type: "AffiliateClicksAndCommission!"
            resolve: "@=resolver('affiliateClicksAndCommission', [args['startDate'], args['endDate'], args['retailerReference']])"
            args:
                startDate:
                    type: "DateTimeImmutable!"
                    description: "Select from datetime (time format must be like '2019-10-01T00:00:00+00:00')"
                endDate:
                    type: "DateTimeImmutable!"
                    description: "Select to datetime (time format must be like '2019-30-01T00:00:00+00:00')"
                retailerReference:
                    type: "String!"
                    description: "Retailer reference'"

в резолвере

public static function getAliases(): array
{
    return [
        'resolveItem' => 'affiliateClicksAndCommission',
    ];
}

public function resolveItem(
    DateTimeImmutable $startDate,
    DateTimeImmutable $endDate,
    string $retailerReference
): AffiliateClicksAndCommission {

не очень понимаю. т.е. контекст также как параметр передавать?
и как тогда запрос строится?

сейчас

	{
	  affiliateClicksAndCommission(
	    startDate: "2019-10-01T00:00:00+00:00", 
	    endDate: "2019-30-01T00:00:00+00:00",
	    retailerReference: "some"
	  ) {
	    clicks {
	      description
	      quantity
	      value
	      commission
	    }  
	  }
	}

@murtukov
Copy link
Member

@des1roer

Короткий ответ: твой запрос никак не изменится.

Длинный ответ:
То, как ты определяешь аргументы в своем запросе, никак не связано с тем, как ты передаешь параметры в твой резолвер. Ты не должен передавать параметры в резолвер в том же порядке, что и в твоем запросе.

Другими словами это:

public function resolveItem(
    DateTimeImmutable $startDate,
    DateTimeImmutable $endDate,
    string $retailerReference
): AffiliateClicksAndCommission {
   // ...
}

никак не связано с этим:

{
  affiliateClicksAndCommission(
    startDate: "2019-10-01T00:00:00+00:00", 
    endDate: "2019-30-01T00:00:00+00:00",
    retailerReference: "some"
) { 
  # ...
}

Все аргументы твоего запроса, всегда сохраняются в переменную args. А как ты передаешь args в твой резолвер уже зависит полностью от тебя. Ты в своем случае отправил каждый из трёх аргументов по отдельности:

[args['startDate'], args['endDate'], args['retailerReference']]

А значит твой резолвер должен ожидать 3 аргумента в той же последовательности. Если ты добавишь еще один аргумент в твой конфиг (context), то это будет выглядеть вот так

[args['startDate'], args['endDate'], args['retailerReference'], context]

следовательно и твой php резолвер будет принимать на 1 аргумент больше:

public function resolveItem(
    DateTimeImmutable $startDate,
    DateTimeImmutable $endDate,
    string $retailerReference,
    $context
): AffiliateClicksAndCommission {
   // ...
}

Важный момент. Ты можешь отправишь все аргументы разом, нет никакой необходимости отправлять их в резолвер по отдельности. Пример:

[args, context]

а в резолвере уже можешь извлекать нужные тебе аргументы запроса:

public function resolveItem($args, $context): AffiliateClicksAndCommission {
   $startDate = $args['startDate'];
   $nedDate = $args['endDate'];
   $retailerReference = $args['retailerReference'];

   // ...
}

@des1roer des1roer reopened this Nov 22, 2019
@des1roer
Copy link
Author

image

  dd($args, $context);

оно вроде как все в аргументы уходит

@murtukov
Copy link
Member

murtukov commented Nov 22, 2019

@des1roer Я вроде понятно объяснил, что ты не должен менять свой запрос. Зачем ты добавил аргумент с именем context? Контекст - это не аргумент, ты его не создаешь сам. Он создается системой для тебя. Ты можешь сохранять в контекст всякую информацию, чтобы потом в других резолверах получить к ней доступ.

@des1roer
Copy link
Author

а сам я не могу записать в контекст?

@murtukov
Copy link
Member

murtukov commented Nov 22, 2019

@des1roer Не только можешь, но и должен, потому что контекст для этого и предназначен. Он изначально пустой, но записывать в него ты должен внутри резолвера, чтобы потом получить доступ к записанным данным в другом резолвере.

Контекст нужен, чтобы иметь какие-то общие данные между всеми резолверами.

public function firstResolver($context) {
    $context->offsetSet('firstName', 'Alex'); // записываешь данные
    $context->offsetSet('lastName', 'Kowalski');
}

public function secondResolver() {
    // считываешь данные, записанные в первом резолвере
    $firstName = $context->offsetGet('firstName'); 
    $lastName = $context->offsetGet('lastName');
}

P.S. Не обязательно использовать методы offsetSet и offsetGet, можно записывать и считывать данные, как с обычным массивом:

$context['firstName'] = "Alex";

Я закрываю этот issue, потому что он не имеет ничего общего с этим бандлом. Эти вопросы относятся к GraphQL в целом.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants