PHP code example of wedrix / watchtower
1. Go to this page and download the library: Download wedrix/watchtower library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
wedrix / watchtower example snippets
declare(strict_types=1);
use function Wedrix\Watchtower\Console;
$console = Console(
entityManager: $entityManager,
schemaFileDirectory: __DIR__.'/resources/graphql',
schemaFileName: 'schema.graphql',
pluginsDirectory: __DIR__.'/resources/graphql/plugins',
scalarTypeDefinitionsDirectory: __DIR__.'/resources/graphql/scalar_type_definitions',
cacheDirectory: __DIR__.'/var/cache',
);
match ($argv[1] ?? null) {
'schema:generate' => $console->generateSchema(),
'schema:update' => $console->updateSchema(),
'cache:generate' => $console->generateCache(),
default => fwrite(STDERR, "Usage: schema:generate | schema:update | cache:generate\n"),
};
declare(strict_types=1);
use GraphQL\Error\DebugFlag;
use function Wedrix\Watchtower\Executor;
$executor = Executor(
entityManager: $entityManager,
schemaFile: __DIR__.'/resources/graphql/schema.graphql',
pluginsDirectory: __DIR__.'/resources/graphql/plugins',
scalarTypeDefinitionsDirectory: __DIR__.'/resources/graphql/scalar_type_definitions',
cacheDirectory: __DIR__.'/var/cache',
optimize: false,
);
$input = json_decode(file_get_contents('php://input') ?: '{}', true, 512, JSON_THROW_ON_ERROR);
$result = $executor->executeQuery(
source: $input['query'] ?? '',
rootValue: [],
contextValue: [
'request' => $request,
'currentUser' => $currentUser,
],
variableValues: $input['variables'] ?? null,
operationName: $input['operationName'] ?? null,
validationRules: null,
);
header('Content-Type: application/json; charset=utf-8');
echo json_encode(
$result->toArray(DebugFlag::INCLUDE_DEBUG_MESSAGE),
JSON_THROW_ON_ERROR,
);
return [
[
'__typename' => 'BookSearchResult',
'id' => '1',
'title' => 'GraphQL Basics',
],
];
$cursor = base64_encode(json_encode([
'title' => 'GraphQL Basics',
'id' => 123,
], JSON_THROW_ON_ERROR));
$console->addFilterPlugin('Book', 'ids');
$console->addOrderingPlugin('Book', 'titleAsc');
$console->addSelectorPlugin('Book', 'summary');
$console->addResolverPlugin('Book', 'externalRating');
$console->addSearchResolverPlugin('Book');
$console->addNodeAuthorizorPlugin('Book');
$console->addRootNodeAuthorizorPlugin();
$console->addProjectionPlugin('Book');
$console->addConstraintPlugin('Book');
$console->addRootConstraintPlugin();
$console->addMutationPlugin('createBook');
$console->addSubscriptionPlugin('bookCreated');
$console->addResultAuthorizorPlugin('Book', false);
$console->addRootResultAuthorizorPlugin();
declare(strict_types=1);
namespace Wedrix\Watchtower\FilterPlugin;
use Wedrix\Watchtower\Resolver\Node;
use Wedrix\Watchtower\Resolver\QueryBuilder;
function apply_books_ids_filter(
QueryBuilder $queryBuilder,
Node $node
): void {
$ids = $node->args()['queryParams']['filters']['ids'] ?? null;
if ($ids === null || $ids === []) {
return;
}
$rootAlias = $queryBuilder->rootAlias();
$idsParameter = $queryBuilder->parameterName('ids');
$queryBuilder
->andWhere("$rootAlias.id IN (:$idsParameter)")
->setParameter($idsParameter, $ids);
}
$rootAlias = $queryBuilder->rootAlias();
$authorJoin = "$rootAlias.author";
$authorAlias = $queryBuilder->joinAlias(
$authorJoin,
'bookAuthor'
);
$queryBuilder->joinOnce($authorJoin, $authorAlias);
$queryBuilder->andWhere("LOWER($authorAlias.name) LIKE :authorName");
$businessJoin = "$rootAlias.business";
$businessAlias = $queryBuilder->joinAlias(
$businessJoin,
'listingBusiness'
);
$queryBuilder->joinOnce($businessJoin, $businessAlias);
$sellerJoin = "$businessAlias.seller";
$sellerAlias = $queryBuilder->joinAlias(
$sellerJoin,
'listingBusinessSeller'
);
$queryBuilder->joinOnce($sellerJoin, $sellerAlias);
declare(strict_types=1);
namespace Wedrix\Watchtower\OrderingPlugin;
use Doctrine\DBAL\ParameterType;
use Wedrix\Watchtower\Resolver\Node;
use Wedrix\Watchtower\Resolver\QueryBuilder;
function apply_books_title_asc_ordering(
QueryBuilder $queryBuilder,
Node $node
): void {
$rootAlias = $queryBuilder->rootAlias();
$titleAlias = $queryBuilder->selectAlias('titleOrder');
$idAlias = $queryBuilder->selectAlias('idOrder');
$queryBuilder
->addSelect("LOWER($rootAlias.title) AS HIDDEN $titleAlias")
->addSelect("$rootAlias.id AS HIDDEN $idAlias")
->addOrderBy($titleAlias, 'ASC')
->addOrderBy($idAlias, 'ASC');
$queryBuilder->registerCursorOrdering('title', "LOWER($rootAlias.title)", 'ASC', ParameterType::STRING);
$queryBuilder->registerCursorOrdering('id', "$rootAlias.id", 'ASC', ParameterType::INTEGER);
}
function apply_book_summary_selector(
QueryBuilder $queryBuilder,
Node $node
): void {
$rootAlias = $queryBuilder->rootAlias();
$queryBuilder->addSelect("CONCAT($rootAlias.title, ' #', $rootAlias.id) AS summary");
}
function resolve_book_external_rating_field(Node $node): mixed
{
return $node->context()['ratings']->forBook($node->root()['id']);
}
use function Wedrix\Watchtower\Resolver\EntityManager;
use function Wedrix\Watchtower\Resolver\HydrationQuery;
function resolve_books_search(Node $node): mixed
{
$ids = $node->context()['search']->bookIds(
(string) ($node->args()['queryParams']['search'] ?? ''),
);
if ($ids === []) {
return [];
}
$query = HydrationQuery(
node: $node,
entityManager: EntityManager($node->context()['entityManager']),
plugins: $node->context()['watchtowerPlugins']
);
if (! $query->isWorkable()) {
return [];
}
$queryBuilder = $query->builder();
$rootAlias = $queryBuilder->rootAlias();
$rows = $queryBuilder
->andWhere("$rootAlias.id IN (:searchIds)")
->setParameter('searchIds', $ids)
->getQuery()
->getArrayResult();
$rowsById = array_column($rows, null, 'id');
return array_values(array_filter(array_map(
static fn ($id) => $rowsById[$id] ?? null,
$ids
)));
}
function call_create_book_mutation(Node $node): mixed
{
$book = $node->context()['bookService']->create($node->args()['input']);
return [
'id' => $book->id(),
'title' => $book->title(),
];
}
function apply_book_constraint(QueryBuilder $queryBuilder, Node $node): void
{
$rootAlias = $queryBuilder->rootAlias();
$tenantIdParameter = $queryBuilder->parameterName('tenantId');
$queryBuilder
->andWhere("$rootAlias.tenant = :$tenantIdParameter")
->setParameter($tenantIdParameter, $node->context()['tenantId']);
}
function authorize_book_node(Node $node): void
{
if (
$node->isACollection()
&& $node->context()['currentUser']->isGuest()
&& (($node->args()['queryParams']['filters']['public'] ?? null) !== true)
) {
throw new \RuntimeException('A public-only filter is
function project_book(QueryBuilder $queryBuilder, Node $node): void
{
$rootAlias = $queryBuilder->rootAlias();
$queryBuilder->addSelect("$rootAlias.public AS authorizationPublic");
}
function authorize_book_result(Result $result, Node $node): void
{
if (! $node->context()['currentUser']->canViewBooks()) {
throw new \RuntimeException('Unauthorized.');
}
}
$console->addScalarTypeDefinition('Money');
declare(strict_types=1);
namespace Wedrix\Watchtower\MoneyTypeDefinition;
use GraphQL\Language\AST\Node;
use GraphQL\Language\AST\StringValueNode;
function serialize(mixed $value): string
{
return (string) $value;
}
function parseValue(string $value): mixed
{
return $value;
}
function parseLiteral(Node $value, ?array $variables = null): mixed
{
if (! $value instanceof StringValueNode) {
throw new \InvalidArgumentException('Money must be a string.');
}
return parseValue($value->value);
}
$executor = Executor(
entityManager: $entityManager,
schemaFile: __DIR__.'/resources/graphql/schema.graphql',
pluginsDirectory: __DIR__.'/resources/graphql/plugins',
scalarTypeDefinitionsDirectory: __DIR__.'/resources/graphql/scalar_type_definitions',
cacheDirectory: __DIR__.'/var/cache',
optimize: true,
);
bash
php bin/watchtower schema:generate
bash
php bin/watchtower cache:generate