Skip to main content

LanguageExistRule

The LanguageExistRule validates that a given language ID exists and matches the expected locale.

Namespace

JobMetric\Language\Rules\LanguageExistRule

Overview

This rule ensures that:

  • Language ID exists in the languages table
  • Language matches the expected locale
  • Can optionally allow zero (0) to bypass validation

Usage

use JobMetric\Language\Rules\LanguageExistRule;

$request->validate([
'language_id' => ['required', new LanguageExistRule('fa')],
]);

// Disallow zero
$request->validate([
'language_id' => ['required', new LanguageExistRule('en', false)],
]);

Parameters

  • $locale (string): Two-letter lowercase locale (e.g., 'fa', 'en')
  • $allowZero (bool): Whether to allow 0 to bypass validation (default: true)

Behavior

  • Skips null/empty values (let 'required' handle them)
  • Allows 0 if $allowZero is true
  • Validates that ID exists with the given locale
  • Works with both string and integer values

When to Use LanguageExistRule

Primary Use Cases

When: You have models that reference languages via language_id foreign key.

Why:

  • Ensures the language actually exists
  • Validates the language matches expected locale
  • Prevents orphaned records
  • Maintains referential integrity

Example:

// app/Models/Post.php - Post has a language_id
// app/Http/Requests/StorePostRequest.php
use JobMetric\Language\Rules\LanguageExistRule;

public function rules(): array
{
return [
'title' => 'required|string',
'content' => 'required|string',
'language_id' => ['required', 'integer', new LanguageExistRule('fa')],
];
}

Real-World Scenario: Blog post creation form. User selects language - rule ensures the selected language exists and is Persian (fa).

2. User Language Preference

When: Users can set their preferred language in their profile.

Why: Ensures the selected language exists in the system.

Example:

// app/Http/Requests/UpdateUserProfileRequest.php
use JobMetric\Language\Rules\LanguageExistRule;

public function rules(): array
{
return [
'name' => 'required|string',
'preferred_language_id' => [
'nullable',
'integer',
new LanguageExistRule(app()->getLocale(), false) // Don't allow 0
],
];
}

Real-World Scenario: User settings page where user can change their preferred language. Rule validates the selection.

3. Content Localization

When: Creating/updating content that must be associated with a specific language.

Why: Ensures content is linked to a valid, active language.

Example:

// app/Http/Requests/StoreProductRequest.php
use JobMetric\Language\Rules\LanguageExistRule;

public function rules(): array
{
return [
'name' => 'required|string',
'description' => 'required|string',
'language_id' => [
'required',
'integer',
new LanguageExistRule('en') // Must be English
],
];
}

Real-World Scenario: E-commerce product creation. Products must be in English - rule enforces this.

4. Multi-Language Content Management

When: Managing translations where each translation must reference a valid language.

Why: Prevents creating translations for non-existent languages.

Example:

// app/Http/Requests/StoreTranslationRequest.php
use JobMetric\Language\Rules\LanguageExistRule;

public function rules(): array
{
$locale = $this->input('locale', app()->getLocale());

return [
'key' => 'required|string',
'value' => 'required|string',
'language_id' => [
'required',
'integer',
new LanguageExistRule($locale)
],
];
}

Real-World Scenario: Translation management system. Each translation must reference a valid language matching the locale.

5. Optional Language Selection

When: Language selection is optional (can be null or 0).

Why: The allowZero parameter allows 0 to bypass validation for optional fields.

Example:

// app/Http/Requests/StoreCategoryRequest.php
use JobMetric\Language\Rules\LanguageExistRule;

public function rules(): array
{
return [
'name' => 'required|string',
'language_id' => [
'nullable',
'integer',
new LanguageExistRule('en', true) // Allow 0 for "no language"
],
];
}

Real-World Scenario: Category creation where language is optional. Rule allows 0 (no language) or validates existing language.

When NOT to Use

  • Direct Model Queries: Don't use for checking existence in code - use Language::find() instead
  • API Responses: Not needed when returning language data
  • Display Logic: Don't use for showing language information
  • Locale Validation: Use CheckLocaleRule for locale format validation, not this rule

Decision Tree

Do you need to validate a language_id input?
├─ Yes → Is the language_id required?
│ ├─ Yes → Use LanguageExistRule($locale, false) // Don't allow 0
│ └─ No → Use LanguageExistRule($locale, true) // Allow 0
└─ No → Don't use this rule

Common Mistakes to Avoid

  1. Wrong locale parameter:

    // ❌ Wrong - locale doesn't match expected language
    new LanguageExistRule('en') // When expecting 'fa'

    // ✅ Correct - locale matches expected language
    new LanguageExistRule('fa')
  2. Not allowing zero when needed:

    // ❌ Wrong - will fail if user selects "no language"
    'language_id' => [new LanguageExistRule('en', false)]

    // ✅ Correct - allows 0 for optional language
    'language_id' => ['nullable', new LanguageExistRule('en', true)]
  3. Using for locale validation:

    // ❌ Wrong - this rule validates language_id, not locale
    'locale' => [new LanguageExistRule('en')]

    // ✅ Correct - use CheckLocaleRule for locale
    'locale' => [new CheckLocaleRule]
  4. Missing 'required' or 'nullable':

    // ❌ Wrong - unclear if field is required
    'language_id' => [new LanguageExistRule('en')]

    // ✅ Correct - explicit requirement
    'language_id' => ['required', 'integer', new LanguageExistRule('en')]

Comparison with CheckLocaleRule

RuleValidatesUse Case
CheckLocaleRuleLocale format and uniquenessCreating/updating language records
LanguageExistRuleLanguage ID existence and locale matchForeign key validation in related models