diff --git a/src/Factory.php b/src/Factory.php index 4ecc8224..65c319b4 100644 --- a/src/Factory.php +++ b/src/Factory.php @@ -3,23 +3,54 @@ namespace Faker; require_once __DIR__ . '/Generator.php'; -require_once __DIR__ . '/Provider/Name.php'; -require_once __DIR__ . '/Provider/Address.php'; -require_once __DIR__ . '/Provider/PhoneNumber.php'; -require_once __DIR__ . '/Provider/Company.php'; -require_once __DIR__ . '/Provider/Lorem.php'; class Factory { - public static function create() + const DEFAULT_LOCALE = 'en_US'; + + protected static $defaultProviders = array('Name', 'Address', 'PhoneNumber', 'Company', 'Lorem'); + + public static function create($locale = self::DEFAULT_LOCALE) { $generator = new Generator(); - $generator->addProvider(new Provider\Name($generator)); - $generator->addProvider(new Provider\Address($generator)); - $generator->addProvider(new Provider\PhoneNumber($generator)); - $generator->addProvider(new Provider\Company($generator)); - $generator->addProvider(new Provider\Lorem($generator)); + foreach (static::$defaultProviders as $provider) { + $providerClassName = self::getProviderClassname($provider, $locale); + $generator->addProvider(new $providerClassName($generator)); + } return $generator; } + + protected function getProviderClassname($provider, $locale = '') + { + if ($providerClass = self::findProviderClassname($provider, $locale)) { + return $providerClass; + } + // fallback to default locale + if ($providerClass = self::findProviderClassname($provider, static::DEFAULT_LOCALE)) { + return $providerClass; + } + // fallback to no locale + $providerClass = self::findProviderClassname($provider); + if (class_exists($providerClass)) { + return $providerClass; + } + throw new \InvalidArgumentException(sprintf('Unable to find provider "%s" with locale "%s"', $provider, $locale)); + } + + protected static function findProviderClassname($provider, $locale = '') + { + $providerName = $locale ? sprintf('Provider\%s\%s', $locale, $provider) : sprintf('Provider\%s', $provider); + $providerClass = 'Faker\\' . $providerName; + echo $providerClass, "\n"; + if (class_exists($providerClass)) { + return $providerClass; + } + $providerClassPath = __DIR__ . '/' . str_replace('\\', '/', $providerName) . '.php'; + echo $providerClassPath, "\n"; + if (file_exists($providerClassPath)) { + require $providerClassPath; + return $providerClass; + } + } } diff --git a/src/Provider/Address.php b/src/Provider/en_US/Address.php similarity index 99% rename from src/Provider/Address.php rename to src/Provider/en_US/Address.php index 260826fb..c2104169 100644 --- a/src/Provider/Address.php +++ b/src/Provider/en_US/Address.php @@ -1,6 +1,6 @@ <?php -namespace Faker\Provider; +namespace Faker\Provider\en_US; class Address { diff --git a/src/Provider/Company.php b/src/Provider/en_US/Company.php similarity index 99% rename from src/Provider/Company.php rename to src/Provider/en_US/Company.php index 47e23d3d..8b72f8b5 100644 --- a/src/Provider/Company.php +++ b/src/Provider/en_US/Company.php @@ -1,6 +1,6 @@ <?php -namespace Faker\Provider; +namespace Faker\Provider\en_US; class Company { diff --git a/src/Provider/Name.php b/src/Provider/en_US/Name.php similarity index 99% rename from src/Provider/Name.php rename to src/Provider/en_US/Name.php index 76f2ed25..6987eb0d 100644 --- a/src/Provider/Name.php +++ b/src/Provider/en_US/Name.php @@ -1,6 +1,6 @@ <?php -namespace Faker\Provider; +namespace Faker\Provider\en_US; class Name { diff --git a/src/Provider/PhoneNumber.php b/src/Provider/en_US/PhoneNumber.php similarity index 96% rename from src/Provider/PhoneNumber.php rename to src/Provider/en_US/PhoneNumber.php index d8beeb06..7790f95a 100644 --- a/src/Provider/PhoneNumber.php +++ b/src/Provider/en_US/PhoneNumber.php @@ -1,6 +1,6 @@ <?php -namespace Faker\Provider; +namespace Faker\Provider\en_US; class PhoneNumber {