egulias/egulias-provinces-bundle
Install Dependencies
Add the bundle and required fixtures to your deps file:
[EguliasProvincesBundle]
git=https://github.com/egulias/EguliasProvincesBundle.git
target=/bundles/Egulias/ProvincesBundle
[doctrine-fixtures]
git=https://github.com/doctrine/data-fixtures.git
[DoctrineFixturesBundle]
git=https://github.com/symfony/DoctrineFixturesBundle.git
target=/bundles/Symfony/Bundle/DoctrineFixturesBundle
Run php bin/vendors install.
Register Namespaces
Update app/autoload.php:
$loader->registerNamespaces(array(
'Egulias' => __DIR__.'/../vendor/bundles',
'Doctrine\\Common\\DataFixtures' => __DIR__.'/../vendor/doctrine-fixtures/lib',
'Doctrine\\Common' => __DIR__.'/../vendor/doctrine-common/lib',
));
Enable the Bundle
Add to AppKernel.php:
new Egulias\ProvincesBundle\EguliasProvincesBundle(),
new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(),
Load Fixtures
Create a fixture class (e.g., app/data/fixtures/ProvincesFixtures.php):
namespace Doctrine\Common\DataFixtures;
use Egulias\ProvincesBundle\DataFixtures\ORM\LoadProvincesData;
class ProvincesFixtures extends OrderFixture implements FixtureInterface {
public function load(ObjectManager $manager) {
$loader = new LoadProvincesData();
$loader->load($manager);
}
}
Run:
php app/console doctrine:fixtures:load
First Query Use the repository in a controller/service:
$provinces = $this->getDoctrine()
->getRepository('EguliasProvincesBundle:Province')
->findAll();
Fetching Provinces/Regions
Country entity to filter provinces:
$country = $this->getDoctrine()->getRepository('EguliasProvincesBundle:Country')->findOneBy(['code' => 'US']);
$provinces = $country->getProvinces();
$province = $this->getDoctrine()->getRepository('EguliasProvincesBundle:Province')->findOneBy(['code' => 'CA']);
$region = $province->getRegion();
Form Integration
Use Symfony’s EntityType for dropdowns:
$builder->add('province', EntityType::class, [
'class' => 'EguliasProvincesBundle:Province',
'choice_label' => 'name',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('p')
->where('p.country = :country')
->setParameter('country', $this->getDoctrine()->getRepository('EguliasProvincesBundle:Country')->findOneBy(['code' => 'US']));
},
]);
Caching Provinces Cache frequently accessed data (e.g., all provinces for a country):
$cache = $this->get('cache.app');
$key = 'provinces_us';
$provinces = $cache->get($key, function () use ($country) {
return $country->getProvinces();
});
Custom Fixtures
Extend LoadProvincesData to add custom provinces:
class CustomProvincesFixtures extends LoadProvincesData {
protected function getProvinces() {
$provinces = parent::getProvinces();
$provinces[] = new Province('XX', 'Custom Province', new Country('XX'), new Region('XX'));
return $provinces;
}
}
Fixture Overwrites
doctrine:fixtures:load without --append will delete and reinsert all provinces/regions.--append to avoid data loss:
php app/console doctrine:fixtures:load --append
Namespace Conflicts
Egulias namespace is registered in autoload.php; otherwise, autoloading fails silently.Database Schema Mismatch
EguliasProvincesBundle:Province and EguliasProvincesBundle:Region entities exist. If you’ve customized the schema, queries may fail.Case Sensitivity in Codes
US, CA) are case-sensitive in queries. Use strtoupper() if unsure:
$province = $repository->findOneBy(['code' => strtoupper('ca')]);
Verify Fixtures Loaded Check if data exists:
php app/console doctrine:query:sql "SELECT * FROM egulias_province"
Clear Cache After Fixtures If provinces don’t appear, clear the cache:
php app/console cache:clear
Check Entity Manager
Ensure the EguliasProvincesBundle is registered in AppKernel before DoctrineFixturesBundle.
Custom Province Attributes
Extend the Province entity (e.g., add population):
namespace AppBundle\Entity;
use Egulias\ProvincesBundle\Entity\Province as BaseProvince;
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity */
class Province extends BaseProvince {
/** @ORM\Column(type="integer") */
private $population;
}
Override Fixture Data
Subclass LoadProvincesData and override getProvinces() to inject custom data (e.g., localized names):
protected function getProvinces() {
$provinces = parent::getProvinces();
foreach ($provinces as $province) {
$province->setName($province->getName() . ' (Custom)');
}
return $provinces;
}
Add Validation Use Symfony’s validators to ensure province selection is valid:
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/** @UniqueEntity(fields="code", message="Province code already exists") */
class Province { ... }
API Endpoints Expose provinces via API (e.g., with FOSRestBundle):
# app/config/routing.yml
egulias_provinces:
resource: "@EguliasProvincesBundle/Resources/config/routing.yml"
prefix: /api/provinces
How can I help you explore Laravel packages today?