public function load($resource, $type = null)
{
$processor = new Processor();
$configurationDefinition = new Configuration();
$configuration = Yaml::parse($resource);
$configuration = $processor->processConfiguration($configurationDefinition, ['routing' => $configuration]);
if (!empty($configuration['only']) && !empty($configuration['except'])) {
throw new \InvalidArgumentException('You can configure only one of "except" & "only" options.');
}
$routesToGenerate = ['show', 'index', 'create', 'update', 'delete'];
if (!empty($configuration['only'])) {
$routesToGenerate = $configuration['only'];
}
if (!empty($configuration['except'])) {
$routesToGenerate = array_diff($routesToGenerate, $configuration['except']);
}
$isApi = $type === 'sylius.resource_api';
/** @var MetadataInterface $metadata */
$metadata = $this->resourceRegistry->get($configuration['alias']);
$routes = $this->routeFactory->createRouteCollection();
$rootPath = sprintf('/%s/', isset($configuration['path']) ? $configuration['path'] : Urlizer::urlize($metadata->getPluralName()));
if (in_array('index', $routesToGenerate)) {
$indexRoute = $this->createRoute($metadata, $configuration, $rootPath, 'index', ['GET'], $isApi);
$routes->add($this->getRouteName($metadata, $configuration, 'index'), $indexRoute);
}
if (in_array('create', $routesToGenerate)) {
$createRoute = $this->createRoute($metadata, $configuration, $isApi ? $rootPath : $rootPath . 'new', 'create', $isApi ? ['POST'] : ['GET', 'POST'], $isApi);
$routes->add($this->getRouteName($metadata, $configuration, 'create'), $createRoute);
}
if (in_array('update', $routesToGenerate)) {
$updateRoute = $this->createRoute($metadata, $configuration, $isApi ? $rootPath . '{id}' : $rootPath . '{id}/edit', 'update', $isApi ? ['PUT', 'PATCH'] : ['GET', 'PUT', 'PATCH'], $isApi);
$routes->add($this->getRouteName($metadata, $configuration, 'update'), $updateRoute);
}
if (in_array('show', $routesToGenerate)) {
$showRoute = $this->createRoute($metadata, $configuration, $rootPath . '{id}', 'show', ['GET'], $isApi);
$routes->add($this->getRouteName($metadata, $configuration, 'show'), $showRoute);
}
if (in_array('delete', $routesToGenerate)) {
$deleteRoute = $this->createRoute($metadata, $configuration, $rootPath . '{id}', 'delete', ['DELETE'], $isApi);
$routes->add($this->getRouteName($metadata, $configuration, 'delete'), $deleteRoute);
}
return $routes;
}