CoreShop Country Context

For CoreShop to determine the current country the visitor or customer comes from, it uses a concept called context and context resolver.


Name Priority Tag Description
FixedCountryContext default Used for testing purposes
CountryContext default Check for a country within the country request resolver
StoreAwareCountryContext default Check if current country is available in current store context


Name Priority Tag Description
GeoLiteBasedRequestResolver 10 This Resolver tries to determinate the users location by using the Geo Lite Database.

These resolver takes care about finding the correct country for the current request.

Create a Custom Resolver

A Country Context needs to implement the interface CoreShop\Component\Address\Context\CountryContextInterface. This interface consists of one method called getCountry which returns a CoreShop\Component\Address\Model\CountryInterface or throws an CoreShop\Component\Address\Context\CountryNotFoundException.

To register your context, you need to use the tag: with an optional priority attribute.

Create a Request based Resolver

CoreShop already implements Request based country context resolver. So if your Context depends on the current request, you can create a custom RequestBased Resolver. To do that, implement the interface CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface with the method findCountry. This method either returns a country or null.

To register this resolver, use the tag: with an optional priority attribute.


We want to a CountryContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Austria, if we are on page /en we want to resolve to Country Great Britain:

1: First of all we need to create our RequestBased Country Context:


namespace AppBundle\CoreShop\Address\Context;

use CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface;
use CoreShop\Component\Address\Repository\CountryRepositoryInterface;
use Pimcore\Http\Request\Resolver\DocumentResolver;
use Symfony\Component\HttpFoundation\Request;

final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
     * @var DocumentResolver
    private $pimcoreDocumentResolver;

     * @var CountryRepositoryInterface
    private $countryRepository;

     * @param DocumentResolver $pimcoreDocumentResolver
     * @param CountryRepositoryInterface $countryRepository
    public function __construct(DocumentResolver $pimcoreDocumentResolver, CountryRepositoryInterface $countryRepository)
        $this->pimcoreDocumentResolver = $pimcoreDocumentResolver;
        $this->countryRepository = $countryRepository;

    public function findCountry(Request $request)
        $doc = $this->pimcoreDocumentResolver->getDocument($request);

        if (substr($doc->getFullPath(), 0, 3) === '/en') {
            return $this->countryRepository->findByCode('GB');

        if (substr($doc->getFullPath(), 0, 3) === '/de') {
            return $this->countryRepository->findByCode('AT');

        return null;

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

    class: AppBundle\CoreShop\Address\Context\DocumentBasedRequestRequestResolver
      - '@Pimcore\Http\Request\Resolver\DocumentResolver'
      - ''
      - { name: }

CoreShop now tries to resolve the current country based on the Pimcore Site we are on.