Decoupled Glue infrastructure: Integrate Storefront and Backend Glue API applications
Edit on GitHubThis document describes how to integrate the Glue Storefront and Backend API applications into a Spryker project.
Install feature core
Follow the steps below to install the Glue Storefront and Backend API applications core.
Prerequisites
Install the required features:
NAME | VERSION | INSTALLATION GUIDE |
---|---|---|
Glue Application | Glue API - Install the Spryker Core Glue API |
1) Install the required modules
Install the required modules using Composer:
composer require spryker/glue-storefront-api-application:"^1.0.0" spryker/glue-backend-api-application:"^1.0.0" --update-with-dependencies
Make sure that the following modules have been installed:
MODULE | EXPECTED DIRECTORY |
---|---|
GlueApplication | vendor/spryker/glue-application |
GlueStorefrontApiApplication | vendor/spryker/glue-storefront-api-application |
GlueBackendApiApplication | vendor/spryker/glue-backend-api-application |
2) Set up the configuration
- Add the following configuration:
config/Shared/config_default.php
<?php
use Spryker\Shared\GlueBackendApiApplication\GlueBackendApiApplicationConstants;
use Spryker\Shared\GlueStorefrontApiApplication\GlueStorefrontApiApplicationConstants;
// ----------------------------------------------------------------------------
// ------------------------------ Glue Backend API -------------------------------
// ----------------------------------------------------------------------------
$sprykerGlueBackendHost = getenv('SPRYKER_GLUE_BACKEND_HOST');
$config[GlueBackendApiApplicationConstants::GLUE_BACKEND_API_HOST] = $sprykerGlueBackendHost;
$config[GlueBackendApiApplicationConstants::PROJECT_NAMESPACES] = [
'Pyz',
];
// ----------------------------------------------------------------------------
// ------------------------------ Glue Storefront API -------------------------------
// ----------------------------------------------------------------------------
$sprykerGlueStorefrontHost = getenv('SPRYKER_GLUE_STOREFRONT_HOST');
$config[GlueStorefrontApiApplicationConstants::GLUE_STOREFRONT_API_HOST] = $sprykerGlueStorefrontHost;
src/Pyz/Glue/GlueApplication/Bootstrap/GlueBackendApiBootstrap.php
<?php
namespace Pyz\Glue\GlueApplication\Bootstrap;
use Spryker\Glue\GlueApplication\Bootstrap\GlueBootstrap;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\BackendApiGlueApplicationBootstrapPlugin;
use Spryker\Shared\Application\ApplicationInterface;
class GlueBackendApiBootstrap extends GlueBootstrap
{
/**
* @param array $glueApplicationBootstrapPluginClassNames
*
* @return \Spryker\Shared\Application\ApplicationInterface
*/
public function boot(array $glueApplicationBootstrapPluginClassNames = []): ApplicationInterface
{
return parent::boot([BackendApiGlueApplicationBootstrapPlugin::class]);
}
}
src/Pyz/Glue/GlueApplication/Bootstrap/GlueBootstrap.php
<?php
namespace Pyz\Glue\GlueApplication\Bootstrap;
use Spryker\Glue\GlueApplication\Bootstrap\GlueBootstrap as SprykerGlueBootstrap;
use Spryker\Glue\GlueApplication\Plugin\GlueApplication\FallbackStorefrontApiGlueApplicationBootstrapPlugin;
use Spryker\Shared\Application\ApplicationInterface;
class GlueBootstrap extends SprykerGlueBootstrap
{
/**
* @param array<string> $glueApplicationBootstrapPluginClassNames
*
* @return \Spryker\Shared\Application\ApplicationInterface
*/
public function boot(array $glueApplicationBootstrapPluginClassNames = []): ApplicationInterface
{
return parent::boot([FallbackStorefrontApiGlueApplicationBootstrapPlugin::class]);
}
}
src/Pyz/Glue/GlueApplication/Bootstrap/GlueStorefrontApiBootstrap.php
<?php
namespace Pyz\Glue\GlueApplication\Bootstrap;
use Spryker\Glue\GlueApplication\Bootstrap\GlueBootstrap;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\StorefrontApiGlueApplicationBootstrapPlugin;
use Spryker\Shared\Application\ApplicationInterface;
class GlueStorefrontApiBootstrap extends GlueBootstrap
{
/**
* @param array $glueApplicationBootstrapPluginClassNames
*
* @return \Spryker\Shared\Application\ApplicationInterface
*/
public function boot(array $glueApplicationBootstrapPluginClassNames = []): ApplicationInterface
{
return parent::boot([StorefrontApiGlueApplicationBootstrapPlugin::class]);
}
}
public/GlueBackend/index.php
<?php
use Pyz\Glue\GlueApplication\Bootstrap\GlueBackendApiBootstrap;
use Spryker\Shared\Config\Application\Environment;
use Spryker\Shared\ErrorHandler\ErrorHandlerEnvironment;
define('APPLICATION', 'GLUE_BACKEND');
defined('APPLICATION_ROOT_DIR') || define('APPLICATION_ROOT_DIR', dirname(__DIR__, 2));
require_once APPLICATION_ROOT_DIR . '/vendor/autoload.php';
Environment::initialize();
$errorHandlerEnvironment = new ErrorHandlerEnvironment();
$errorHandlerEnvironment->initialize();
$bootstrap = new GlueBackendApiBootstrap();
$bootstrap
->boot()
->run();
public/Glue****/index.****php
<?php
use Pyz\Glue\GlueApplication\Bootstrap\GlueBootstrap;
use Spryker\Shared\Config\Application\Environment;
use Spryker\Shared\ErrorHandler\ErrorHandlerEnvironment;
define('APPLICATION', 'GLUE');
defined('APPLICATION_ROOT_DIR') || define('APPLICATION_ROOT_DIR', dirname(__DIR__, 2));
require_once APPLICATION_ROOT_DIR . '/vendor/autoload.php';
Environment::initialize();
$errorHandlerEnvironment = new ErrorHandlerEnvironment();
$errorHandlerEnvironment->initialize();
$bootstrap = new GlueBootstrap();
$bootstrap
->boot()
->run();
public/GlueStorefront****/index.****php
use Pyz\Glue\GlueApplication\Bootstrap\GlueStorefrontApiBootstrap;
use Spryker\Shared\Config\Application\Environment;
use Spryker\Shared\ErrorHandler\ErrorHandlerEnvironment;
define('APPLICATION', 'GLUE_STOREFRONT');
defined('APPLICATION_ROOT_DIR') || define('APPLICATION_ROOT_DIR', dirname(__DIR__, 2));
require_once APPLICATION_ROOT_DIR . '/vendor/autoload.php';
Environment::initialize();
$errorHandlerEnvironment = new ErrorHandlerEnvironment();
$errorHandlerEnvironment->initialize();
$bootstrap = new GlueStorefrontApiBootstrap();
$bootstrap
->boot()
->run();
deploy****.yml
groups:
EU:
applications:
glue_eu:
application: glue
endpoints:
glue.de.spryker.local:
store: DE
glue_storefront_eu:
application: glue-storefront
endpoints:
glue-storefront.de.spryker.local:
store: DE
glue_backend_eu:
application: glue-backend
endpoints:
glue-backend.de.spryker.local:
store: DE
US:
applications:
glue_us:
application: glue
endpoints:
glue.us.spryker.local:
store: US
glue_storefront_us:
application: glue-storefront
endpoints:
glue-storefront.us.spryker.local:
store: US
glue_backend_us:
application: glue-backend
endpoints:
glue-backend.us.spryker.local:
store: US
- Activate your new API:
docker/sdk boot
docker/sdk up
Verify that your domains are available: http://glue-storefront.de.spryker.local
, http://glue-backend.de.spryker.local
, and http://glue.de.spryker.local
.
3) Set up transfer objects
Generate transfers:
vendor/bin/console transfer:generate
Ensure the following transfers have been created:
TRANSFER | TYPE | EVENT | PATH |
---|---|---|---|
GlueApiContext | class | created | src/Generated/Shared/Transfer/GlueApiContextTransfer.php |
GlueResponse | class | created | src/Generated/Shared/Transfer/GlueResponseTransfer.php |
GlueRequest | class | created | src/Generated/Shared/Transfer/GlueRequestTransfer.php |
GlueRequestValidation | class | created | src/Generated/Shared/Transfer/GlueRequestValidationTransfer.php |
GlueError | class | created | src/Generated/Shared/Transfer/GlueErrorTransfer.php |
GlueResource | class | created | src/Generated/Shared/Transfer/GlueResourceTransfer.php |
GlueResourceMethodCollection | class | created | src/Generated/Shared/Transfer/GlueResourceMethodCollectionTransfer.php |
GlueResourceMethodConfiguration | class | created | src/Generated/Shared/Transfer/GlueResourceMethodConfigurationTransfer.php |
GlueVersion | class | created | src/Generated/Shared/Transfer/GlueVersionTransfer.php |
GlueFilter | class | created | src/Generated/Shared/Transfer/GlueFilterTransfer.php |
GluePagination | class | created | src/Generated/Shared/Transfer/GluePaginationTransfer.php |
GlueSparseResource | class | created | src/Generated/Shared/Transfer/GlueSparseResourceTransfer.php |
Sort | class | created | src/Generated/Shared/Transfer/SortTransfer.php |
Store | class | created | src/Generated/Shared/Transfer/StoreTransfer.php |
4) Set up behavior
Enable the following behaviors by registering the plugins:
PLUGIN | SPECIFICATION | NAMESPACE |
---|---|---|
BackendApiGlueApplicationBootstrapPlugin | Returns the Application class responsible for executing the Backend API application. |
Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication |
StorefrontApiGlueApplicationBootstrapPlugin | Returns the Application class responsible for executing the Storefront API application. |
Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication |
FallbackStorefrontApiGlueApplicationBootstrapPlugin | Returns the Application class responsible for executing the Storefront Fallback API application. |
Spryker\Glue\GlueApplication\Plugin\FallbackStorefrontApiGlueApplicationBootstrapPlugin |
ControllerCacheCollectorConsole | Builds a cache of controller parameters for the API applications controllers. | Spryker\Glue\GlueApplication\Plugin\Console |
RouterCacheWarmUpConsole | Builds a Router cache for the ApiApplications. | Spryker\Glue\GlueApplication\Plugin\Console |
RouterDebugGlueApplicationConsole | Renders a table with all available routes for specified API Application | Spryker\Glue\GlueApplication\Plugin\Console |
ApplicationIdentifierRequestBuilderPlugin | Sets GlueRequestTransfer::$application to the correct application. |
Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication and Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication |
LocaleRequestBuilderPlugin | Builds GlueRequestTransfer.locale from the accept-language header for Glue Storefront/Backend API application. |
Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication and Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication |
SecurityHeaderResponseFormatterPlugin | Extends GlueResponseTransfer with security headers for Glue Storefront/Backend API application. |
Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication and Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication |
RequestCorsValidatorPlugin | Validates cors headers for Glue Storefront API application. | Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication and Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication |
CustomRouteRoutesProviderPlugin | Returns the stack of \Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RouteProviderPluginInterface for the current application. |
Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication and Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication |
ResourcesProviderPlugin | Returns the stack of \Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ResourceInterface for the current application. |
Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication and Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication |
StorefrontRouterProviderPlugin | Gets route collection from current Glue Storefront API Application for route debug console command. | Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication |
BackendRouterProviderPlugin | Gets route collection from current Glue Backend API Application for route debug console command. | Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication |
ControllerCacheCollectorPlugin | Returns controllers configuration for GlueStorefrontApiApplication/GlueBackendApiApplication applications. | Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication and Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication |
src/Pyz/Glue/GlueApplication/****GlueApplicationDependencyProvider****.php
<?php
namespace Pyz\Glue\GlueApplication;
use Spryker\Glue\GlueApplication\GlueApplicationDependencyProvider as SprykerGlueApplicationDependencyProvider;
use Spryker\Glue\GlueApplication\Plugin\GlueApplication\FallbackStorefrontApiGlueApplicationBootstrapPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\BackendApiGlueApplicationBootstrapPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\BackendRouterProviderPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\ControllerCacheCollectorPlugin as BackendControllerCacheCollectorPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\CustomRouteRoutesProviderPlugin as BackendCustomRouteRoutesProviderPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\ResourcesProviderPlugin as BackendResourcesProviderPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\ControllerCacheCollectorPlugin as StorefrontControllerCacheCollectorPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\CustomRouteRoutesProviderPlugin as StorefrontCustomRouteRoutesProviderPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\ResourcesProviderPlugin as StorefrontResourcesProviderPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\StorefrontApiGlueApplicationBootstrapPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\StorefrontRouterProviderPlugin;
class GlueApplicationDependencyProvider extends SprykerGlueApplicationDependencyProvider
{
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\GlueApplicationBootstrapPluginInterface>
*/
protected function getGlueApplicationBootstrapPlugins(): array
{
return [
new StorefrontApiGlueApplicationBootstrapPlugin(),
new BackendApiGlueApplicationBootstrapPlugin(),
new FallbackStorefrontApiGlueApplicationBootstrapPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ConventionPluginInterface>
*/
protected function getConventionPlugins(): array
{
return [
// Wire the conventions your project supports only.
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ControllerCacheCollectorPluginInterface>
*/
protected function getControllerCacheCollectorPlugins(): array
{
return [
new StorefrontControllerCacheCollectorPlugin(),
new BackendControllerCacheCollectorPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ApiApplicationEndpointProviderPluginInterface>
*/
protected function getGlueApplicationRouterProviderPlugins(): array
{
return [
new BackendRouterProviderPlugin(),
new StorefrontRouterProviderPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RoutesProviderPluginInterface>
*/
protected function getRoutesProviderPlugins(): array
{
return [
new StorefrontCustomRouteRoutesProviderPlugin(),
new BackendCustomRouteRoutesProviderPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ResourcesProviderPluginInterface>
*/
protected function getResourcesProviderPlugins(): array
{
return [
new StorefrontResourcesProviderPlugin(),
new BackendResourcesProviderPlugin(),
];
}
}
src/Pyz/Glue/Console/ConsoleDependencyProvider.php
<?php
namespace Pyz\Glue\Console;
use Spryker\Glue\Console\ConsoleDependencyProvider as SprykerConsoleDependencyProvider;
use Spryker\Glue\GlueApplication\Plugin\Console\ControllerCacheCollectorConsole;
use Spryker\Glue\GlueApplication\Plugin\Console\RouterCacheWarmUpConsole;
use Spryker\Glue\GlueApplication\Plugin\Console\RouterDebugGlueApplicationConsole;
use Spryker\Glue\Kernel\Container;
class ConsoleDependencyProvider extends SprykerConsoleDependencyProvider
{
/**
* @param \Spryker\Glue\Kernel\Container $container
*
* @return array<\Symfony\Component\Console\Command\Command>
*/
protected function getConsoleCommands(Container $container): array
{
return [
new ControllerCacheCollectorConsole(),
new RouterDebugGlueApplicationConsole(),
new RouterCacheWarmUpConsole(),
];
}
}
If the console commands are setup correctly, the following commands are available:
vendor/bin/glue glue-api:controller:cache:warm-up
vendor/bin/glue router:debug [application_name]
vendor/bin/glue api:router:cache:warm-up [application_name]
src/Pyz/Glue/GlueBackendApiApplication/GlueBackendApiApplicationDependencyProvider.php
<?php
namespace Pyz\Glue\GlueBackendApiApplication;
use Spryker\Glue\GlueBackendApiApplication\GlueBackendApiApplicationDependencyProvider as SprykerGlueBackendApiApplicationDependencyProvider;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\ApplicationIdentifierRequestBuilderPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\LocaleRequestBuilderPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\RequestCorsValidatorPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\ScopeRequestAfterRoutingValidatorPlugin;
use Spryker\Glue\GlueBackendApiApplication\Plugin\GlueApplication\SecurityHeaderResponseFormatterPlugin;
use Spryker\Glue\OauthBackendApi\Plugin\UserRequestBuilderPlugin;
use Spryker\Zed\Propel\Communication\Plugin\Application\PropelApplicationPlugin;
use Spryker\Glue\GlueBackendApiApplicationAuthorizationConnector\Plugin\GlueBackendApiApplication\AuthorizationRequestAfterRoutingValidatorPlugin;
class GlueBackendApiApplicationDependencyProvider extends SprykerGlueBackendApiApplicationDependencyProvider
{
/**
* @return array<\Spryker\Shared\ApplicationExtension\Dependency\Plugin\ApplicationPluginInterface>
*/
protected function getApplicationPlugins(): array
{
return [
new PropelApplicationPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestBuilderPluginInterface>
*/
protected function getRequestBuilderPlugins(): array
{
return [
new ApplicationIdentifierRequestBuilderPlugin(),
new LocaleRequestBuilderPlugin(),
new UserRequestBuilderPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestValidatorPluginInterface>
*/
protected function getRequestValidatorPlugins(): array
{
return [
// Wire validators.
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestAfterRoutingValidatorPluginInterface>
*/
protected function getRequestAfterRoutingValidatorPlugins(): array
{
return [
new RequestCorsValidatorPlugin(),
new ScopeRequestAfterRoutingValidatorPlugin(),
new AuthorizationRequestAfterRoutingValidatorPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ResponseFormatterPluginInterface>
*/
protected function getResponseFormatterPlugins(): array
{
return [
new SecurityHeaderResponseFormatterPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ResourceInterface>
*/
protected function getResourcePlugins(): array
{
return [
// Wire resources.
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RouteProviderPluginInterface>
*/
protected function getRouteProviderPlugins(): array
{
return [
// Wire routes.
];
}
}
src/Pyz/Glue/GlueStorefrontApiApplication/GlueStorefrontApiApplicationDependencyProvider.php
<?php
namespace Pyz\Glue\GlueStorefrontApiApplication;
use Spryker\Glue\GlueStorefrontApiApplication\GlueStorefrontApiApplicationDependencyProvider as SprykerGlueStorefrontApiApplicationDependencyProvider;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\ApplicationIdentifierRequestBuilderPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\LocaleRequestBuilderPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\RequestCorsValidatorPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\ScopeRequestAfterRoutingValidatorPlugin;
use Spryker\Glue\GlueStorefrontApiApplication\Plugin\GlueApplication\SecurityHeaderResponseFormatterPlugin;
use Spryker\Glue\GlueStorefrontApiApplicationAuthorizationConnector\Plugin\GlueStorefrontApiApplicationAuthorizationConnector\AuthorizationRequestAfterRoutingValidatorPlugin;
use Spryker\Glue\OauthApi\Plugin\CustomerRequestBuilderPlugin;
class GlueStorefrontApiApplicationDependencyProvider extends SprykerGlueStorefrontApiApplicationDependencyProvider
{
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestBuilderPluginInterface>
*/
protected function getRequestBuilderPlugins(): array
{
return [
new ApplicationIdentifierRequestBuilderPlugin(),
new LocaleRequestBuilderPlugin(),
new CustomerRequestBuilderPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestValidatorPluginInterface>
*/
protected function getRequestValidatorPlugins(): array
{
return [
// Wire validators.
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestAfterRoutingValidatorPluginInterface>
*/
protected function getRequestAfterRoutingValidatorPlugins(): array
{
return [
new RequestCorsValidatorPlugin(),
new ScopeRequestAfterRoutingValidatorPlugin(),
new AuthorizationRequestAfterRoutingValidatorPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ResponseFormatterPluginInterface>
*/
protected function getResponseFormatterPlugins(): array
{
return [
new SecurityHeaderResponseFormatterPlugin(),
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\ResourceInterface>
*/
protected function getResourcePlugins(): array
{
return [
// Wire resources.
];
}
/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RouteProviderPluginInterface>
*/
protected function getRouteProviderPlugins(): array
{
return [
// Wire routes.
];
}
}
If everything is set up correctly, you can access it as follows:
- Glue Backend API application:
http://glue-backend.mysprykershop.com
. - Glue Storefront API application:
http://glue-storefront.mysprykershop.com
.
Thank you!
For submitting the form