Installation
composer require wapmorgan/morphos
Add to config/app.php under providers (if not using autoloading):
Wapmorgan\Morphos\MorphosServiceProvider::class,
First Use Case
use Wapmorgan\Morphos\Morphos;
$morphos = new Morphos();
echo $morphos->declension('Иванов', 'Иван', 'Иванович', 'именительный', 'мужской'); // "Иванов Иван Иванович"
Key Entry Points
Morphos class (main facade)Wapmorgan\Morphos\Russian\... (e.g., Names, Geography)Wapmorgan\Morphos\English\... (e.g., Nouns, Numbers)Russian Name Inflection
$morphos->declension('Петров', 'Алексей', 'Сергеевич', 'родительный'); // "Петрова Алексея Сергеевича"
именительный, родительный, etc.) + gender (мужской, женский, средний).English Pluralization
$morphos->pluralize('child'); // "children"
$morphos->pluralize('box'); // "boxes"
Numerals and Money
$morphos->cardinal(123); // "сто двадцать три"
$morphos->money(123.45, 'рубль'); // "сто двадцать три рубля сорок пять копеек"
declension for context-aware formatting (e.g., "123 рубля" vs. "123 рубль").Geographical Names
$morphos->country('США', 'родительный'); // "США" (unchanged)
$morphos->city('Москва', 'винительный'); // "Москву"
laravel-localization for language-aware routes:
$locale = app()->getLocale();
$morphos->setLanguage($locale === 'ru' ? 'ru' : 'en');
Illuminate\Support\Facades\Cache:
Cache::remember("morphos_{$user->last_name}_{$case}", 3600, fn() =>
$morphos->declension($user->last_name, ...)
);
public function rules()
{
return [
'last_name' => ['required', Rule::callback(function ($attr, $value, $fail) {
if (!preg_match('/^[А-Яа-я]+$/', $value)) {
$fail('Invalid Russian name format.');
}
})],
];
}
Case Sensitivity
Иванов, not иванов).$name = mb_strtoupper($name, 'UTF-8');
Unsupported Cases/Genders
дательный + средний for names).Morphos::SUPPORTED_CASES and Morphos::SUPPORTED_GENDERS before use.English Irregular Plurals
mouse → mice) may not follow standard rules.$morphos->pluralize('mouse'); // Returns "mice" (built-in) but verify edge cases.
Performance
try {
$result = $morphos->declension($name, $case, $gender);
} catch (\InvalidArgumentException $e) {
Log::warning("Unsupported morphos combo: {$name}, {$case}, {$gender}");
}
phpunit) as a reference for valid inputs.Wapmorgan\Morphos\Russian\Names to add custom names:
$morphos->addName('Смирнов', 'мужской', ['именительный' => 'Смирнов']);
Morphos class.docker run --rm wapmorgan/morphos:latest php -r '$morphos = new \Wapmorgan\Morphos\Morphos(); echo $morphos->declension("Иванов", "именительный");'
config/morphos.php (if using the service provider):
'default_language' => 'ru',
$morphos->setFallbackStrategy(function ($input) {
return "[$input]"; // Wrap unsupported inputs
});
How can I help you explore Laravel packages today?