1. Go to this page and download the library: Download elazar/phanua 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/ */
elazar / phanua example snippets
/**
* 1. Configure the Phanua service provider.
*
* The next section covers this step in more detail.
*/
$provider = new \Elazar\Phanua\Service\Provider;
// Configure $provider as needed here.
/**
* 2. Use the Phanua service provider to create a Phanua schema builder.
*/
$schemaBuilder = $provider->getSchemaBuilder();
/**
* 3. Use the Phanua schema builder to generate a Cycle schema or ORM instance.
*/
// To configure an existing ORM instance to use the generated schema:
$orm = new \Cycle\ORM\ORM(/* ... */);
// ...
$schema = $schemaBuilder->buildSchema();
$orm = $orm->withSchema($schema);
// To have Phanua create a new ORM instance with the generated schema:
$orm = $schemaBuilder->buildOrm();
use Elazar\Phanua\Service\Provider;
// To load the Jane configuration file, provide the path
$provider = (new Provider)
->withJaneConfiguration('/path/to/.jane-openapi.php');
// If file is already loaded, provide the contained array
$janeConfig =
// Create a Pimple or PSR-11 container instance
$container = new \Pimple\Container;
// Then configure Phanua to use it
$provider = (new \Elazar\Phanua\Service\Provider)
->withDelegateContainer($container);
$container = new \Pimple\Container;
// Compared to the earlier example of passing the database configuration to
// Phanua as an array, this is the next easiest / most low-level method of doing
// so if you're not already using a container in your application.
use Spiral\Database\Config\DatabaseConfig;
$container[DatabaseConfig::class] = fn() => new DatabaseConfig(
// Pass the same array passed to Provider->withDatabaseConfig() in the earlier
// example here.
);
// If you're already using a container and it Cycle\ORM\ORM.
use Cycle\ORM\ORM;
$container[ORM::class] = fn() => new ORM(
new Factory(/* ... */)
);
$provider = new \Elazar\Phanua\Service\Provider;
// Configure $provider as needed here.
$container = new \Pimple\Container;
$container->register($provider);
$provider = new \Elazar\Phanua\Service\Provider;
// Configure $provider as needed here.
// Pimple
$container = $provider->getContainer();
// PSR-11
$psrContainer = $provider->getPsrContainer();
// To get the schema builder:
use Elazar\Phanua\Schema\Builder;
// Pimple
$schemaBuilder = $container[Builder::class];
// PSR-11
$schemaBuilder = $container->get(Builder::class);
use Elazar\Phanua\Field\TypeResolver;
$container[TypeResolver::class] = new TypeResolver(
null // fallback value goes here
);
use Elazar\Phanua\Field\CompositeTypeResolver;
use Elazar\Phanua\Field\TypeResolver;
use Elazar\Phanua\Field\TypeResolverInterface;
use My\CustomTypeResolver;
// If you want your resolver to be tried first:
$container[TypeResolverInterface::class] = new CompositeTypeResolver(
new CustomTypeResolver(),
new TypeResolver(),
);
// If you want the default resolver to be tried first:
$container[TypeResolverInterface::class] = new CompositeTypeResolver(
new TypeResolver(
null // Required for CompositeTypeResolver to fall back to your resolver
),
new CustomTypeResolver(),
);
use Jane\Component\OpenApi3\JsonSchema\Model\Schema;
$componentFilter = fn (
string $componentName,
Schema $componentSchema
): bool =>
!in_array($componentName, [
// These components are excluded from the schema
'component1',
'component2',
// ...
]);
$provider = (new \Elazar\Phanua\Service\Provider)
->withComponentFilter($componentFilter);
use Elazar\Phanua\{
Entity\ClassResolverInterface,
Entity\EntityResolver,
Entity\EntityResolverInterface,
Entity\RoleResolverInterface,
Service\Provider
};
use Jane\Component\OpenApi3\JsonSchema\Model\Schema;
$provider = new Provider;
/**
* 1. Get a container from the Phanua service provider to override some of the
* default dependencies it defines.
*/
// Pimple
$phanuaContainer = $provider->getContainer();
// PSR-11
$phanuaContainer = $provider->getPsrContainer();
/**
* 2. In your own container, use the key EntityResolverInterface::class and
* assign it an instance of EntityResolver or your own entity resolver
* implementation, injecting any default Phanua dependencies that you need.
* Below is an example of doing this using Pimple containers.
*/
$yourContainer = new \Pimple\Container;
$yourContainer[EntityResolverInterface::class] = fn() => new EntityResolver(
$phanuaContainer[RoleResolverInterface::class],
$phanuaContainer[ClassResolverInterface::class],
function (
string $componentName,
string $propertyName,
Schema $propertySchema
): bool {
/* return TRUE to
/**
* 1. Define your entity resolver implementation.
*/
use Cycle\Schema\Definition\Entity;
use Elazar\Phanua\Entity\EntityResolverInterface;
use Jane\Component\OpenApi3\JsonSchema\Model\Schema;
class YourEntityResolver implements EntityResolverInterface
{
private EntityResolverInterface $entityResolver;
// Have the constructor accept another resolver implementation as a
// parameter.
public function __construct(
EntityResolverInterface $entityResolver,
/* ... */
) {
$this->entityResolver = $entityResolver;
/* ... */
}
// Then, in the implementation of the interface method...
public function getEntity(
string $componentName,
Schema $componentSchema
): ?Entity
{
// $entity = ...
// ... if your implementation can't resolve an entity...
if ($entity === null) {
// ... then have it defer to the injected resolver.
$entity = $this->entityResolver->getEntity(
$componentName,
$componentSchema
);
}
return $entity;
}
}
/**
* 2. Inject your implementation to have Phanua use it.
*/
// Get the Phanua container and configure your container as normal...
$phanuaContainer = $provider->getContainer();
$yourContainer = new \Pimple\Container;
$yourContainer[EntityResolverInterface::class] = fn() => new YourEntityResolver(
// ... then inject the entity resolver implementation from the Phanua
// container into your own implementation.
$phanuaContainer[EntityResolverInterface::class]
);
use Jane\Component\OpenApi3\JsonSchema\Model\Schema;
$propertyFilter = fn (
string $componentName,
string $propertyName,
Schema $propertySchema
): bool =>
// Exclude all properties with this name
$property !== 'propertyName'
// Exclude the property only in the specified component
&& "$component.$property" !== 'componentName.propertyName';
$provider = (new \Elazar\Phanua\Service\Provider)
->withPropertyFilter($propertyFilter);
use Elazar\Phanua\{
Field\ColumnResolverInterface,
Field\FieldResolver,
Field\FieldResolverInterface,
Field\PrimaryResolverInterface,
Field\TypeResolverInterface,
Service\Provider
};
use Jane\Component\OpenApi3\JsonSchema\Model\Schema;
$provider = new Provider;
/**
* 1. Get a container from the Phanua service provider to override some of the
* default dependencies it defines.
*/
// Pimple
$phanuaContainer = $provider->getContainer();
// PSR-11
$phanuaContainer = $provider->getPsrContainer();
/**
* 2. In your own container, use the key FieldResolverInterface::class and
* assign it an instance of your entity resolver implementation, injecting
* any default Phanua dependencies that you need. Below is an example of
* doing this using Pimple containers.
*/
$yourContainer = new \Pimple\Container;
$yourContainer[FieldResolverInterface::class] = fn() => new FieldResolver(
$phanuaContainer[ColumnResolverInterface::class],
$phanuaContainer[PrimaryResolverInterface::class],
$phanuaContainer[TypeResolverInterface::class],
function (
string $componentName,
string $propertyName,
Schema $propertySchema
): bool {
/* return TRUE to
/**
* 1. Define your field resolver implementation.
*/
use Cycle\Schema\Definition\Field;
use Elazar\Phanua\Field\FieldResolverInterface;
use Jane\Component\OpenApi3\JsonSchema\Model\Schema;
class YourFieldResolver implements FieldResolverInterface
{
private FieldResolverInterface $fieldResolver;
// Have the constructor accept another resolver implementation as a
// parameter.
public function __construct(
FieldResolverInterface $fieldResolver,
/* ... */
) {
$this->fieldResolver = $fieldResolver;
/* ... */
}
// Then, in the implementation of the interface method...
public function getField(
string $componentName,
string $propertyName,
Schema $propertySchema
): ?Field
{
// $field = ...
// ... if your implementation can't resolve an entity...
if ($field === null) {
// ... then have it defer to the injected resolver.
$field = $this->fieldResolver->getField(
$componentName,
$propertyName,
$propertySchema
);
}
return $field;
}
}
/**
* 2. Inject your implementation to have Phanua use it.
*/
// Get the Phanua container and configure your container as normal...
$phanuaContainer = $provider->getContainer();
$yourContainer = new \Pimple\Container;
$yourContainer[FieldResolverInterface::class] = fn() => new YourFieldResolver(
// ... then inject the field resolver implementation from the Phanua
// container into your own implementation.
$phanuaContainer[FieldResolverInterface::class]
);
use Elazar\Phanua\Service\Provider;
use Monolog\Logger;
use Pimple\Container;
use Psr\Log\LoggerInterface;
$yourContainer = new Container;
$yourContainer[LoggerInterface::class] = function () {
$logger = new Logger;
// Configure $logger as needed here
return $logger;
};
$provider = (new Provider)
->withDelegateContainer($yourContainer);
use Cycle\Schema\Registry;
use Phanua\Service\Provider;
use Pimple\Container;
use Spiral\Database\DatabaseProviderInterface;
$provider = new Provider;
// If you're using Phanua\Service\Provider as a Pimple provider:
$yourContainer = new Container;
$yourContainer->register($provider);
$yourContainer->extend(Registry::class, function (Registry $registry) {
// Change $registry as needed here
});
// If you're not using Phanua\Service\Provider as a Pimple provider:
$phanuaContainer = $provider->getContainer();
$yourContainer = new Container;
$yourContainer[Registry::class] = function () use ($phanuaContainer) {
$databaseProvider = $phanuaContainer[DatabaseProviderInterface::class];
$registry = new Registry($databaseProvider);
// Configure $registry here as needed
return $registry;
};
$phanuaContainer[Registry::class] = fn() => $yourContainer[Registry::class];
use Elazar\Phanua\Schema\CompilerConfiguration;
use Elazar\Phanua\Service\Provider;
use Pimple\Container;
$yourContainer = new Container;
$yourContainer[CompilerConfiguration::class] = fn() => (new CompilerConfiguration)
->withGenerators(/* ... */)
->withDefaults(/* ... */);
$provider = (new Provider)
->withDelegateContainer($yourContainer);
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.