لارافيل Validation - الجزء السابع - distinct,starts with,ends with,excludeـif,excludeـif,exclude_unless

لارافيل Validation - الجزء السابع - distinct,starts with,ends with,excludeـif,excludeـif,exclude_unless

2024-05-14 وقت القراءه : 4 دقائق

distinct

تستخدم في حال أن المدخلات على شكل مصفوفة، ولا أريد أن تتكرر قيم المدخلات

لو كان لدي الفورم التالي

<form action="{{route('validation.store')}}" method="POST">
    @csrf
    <div class="container">
        @if (count($errors) > 0)
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
        <input type="text" value="{{ old('score.0') }}" name="score[]" class="form-control"/>
        <input type="text" value="{{ old('score.1') }}" name="score[]" class="form-control"/>
        <button type="submit"  class="btn btn-primary">Add</button>
    </div>
</form>

كما نلاحظ أن score هي عباره عن مصفوفة، فإذا أردنا أن لا تتكرر قيم المدخلات، يمكن إستخدام distinct

$request->validate([
    'score'=>'required|array',
    'score.*'=>'distinct',
]);

أما في حال تكرار قيمة المدخلات فسوف نحصل على الخطأ التالي

لكن يجب الإنتباه، أنه غير حساس لحالة الأحرف فلو تم إدخال a في الحقل الأول و A في الحقل الثاني، فإن التحقق سوف يقبلها، ولجعلة حساس لحالة الأحرف نضيف إلى distinct خيار أخر وهو ignore_case

$request->validate([
    'score'=>'required|array',
    'score.*'=>'distinct:ignore_case',
]);



ends with

لفرض أن لدينا فورم لإدخال البريد الإلكتروني، وأريد أن يتم التسجيل فقط من خلال gmail أستخدم ends_with:gmail.com

فلو كان لدي الفورم التالي لإدخال البريد الإلكتروني وأريد التحقق أن البريد الإلكتروني يكون فقط Gmail

$request->validate([
    'email'=>'required|ends_with:gmail.com',
]);
<form action="{{route('validation.store')}}" method="POST">
    @csrf
    <div class="container">
        @error('email')
        <div class="alert alert-danger">{{$message}}</div>
        @enderror
        <input type="text" value="{{ old('email') }}" name="email" class="form-control"/>
        <button type="submit"  class="btn btn-primary">Add</button>
    </div>
</form>

وإذا كان البريد الإلكتروني ليس gmail فسوف أحصل على الخطأ التالي

أما إذا كنا نريد أن نسمح لأكثر من مزود بريد إلكتروني مثلا gmail.com, yahoo.com, hotmail.com

$request->validate([
    'email'=>'required|ends_with:gmail.com,yahoo.com,hotmail.com',
]);


starts with

هي عكس end_with، لفرض أن لدي حقل لتعبئة رقم الهاتف، وأريد أن أتأكد ان المدخل يبدأ بـ 00970

<form action="{{route('validation.store')}}" method="POST">
    @csrf
    <div class="container">
        @error('tel')
        <div class="alert alert-danger">{{$message}}</div>
        @enderror
        <input type="text" value="{{ old('tel') }}" name="tel" class="form-control"/>
        <button type="submit"  class="btn btn-primary">Add</button>
    </div>
</form>
$request->validate([
    'tel'=>'required|starts_with:00070',
]);

كذلك يمكن إضافة أكثر من قيمة للتحقق 

$request->validate([
    'tel'=>'required|starts_with:00070,00966,00962',
]);

وإذا كانت القيمة غيرر المسموح بها سوف أحصل على الخطأ التالي



Exclude_if

يتم إسخدامها في حال وجود أكثر من input بحيث يكون الحقل الثاني إجباري، إذا إحتوى الحقل الأول على قيمة معينة

 لفرض لدي الفورم التالي

<form action="{{route('validation.store')}}" method="POST">
    @csrf
    <div class="container">
        @error('Country')
        <div class="alert alert-danger">{{$message}}</div>
        @enderror
        <select name="Country" class="form-control">
            <option value="">الرجاء إختيار الدولة</option>
            <option value="Palestine">Palestine</option>
            <option value="Jordan">Jordan</option>
        </select>
        @error('tel')
        <div class="alert alert-danger">{{$message}}</div>
        @enderror
        <input type="text" value="{{ old('tel') }}" name="tel" class="form-control"/>
        <button type="submit"  class="btn btn-primary">Add</button>
    </div>
</form>

وأريد إذا تم تم إختيار Palestine في حقل Country ان يكون tel غير إجباري، أما إذا تم إختيار دولة أخرى أن يكون إجباري 

$request->validate([
    'Country'=>'required',
    'tel'=>'exclude_if:Country,Palestine|required',
]);


exclude_unless

هي عكس excluded_if بحيث لا يصبح حقل tel إجباري إلا إذا كانت قيمة Country=Palestine

$request->validate([
    'Country'=>'required',
    'tel'=>'exclude_unless:Country,Palestine|required',
]);



التعليقات
hasan
منذ سنتين

السلام عليكم اذا عندي حقل وليكن اسمه complete واخر اسمه feedback_status وكان هناك شرط لو قيمه حقل complete =100 وكان حقل feedback_status=PROCESSING اريد ينطي validation على انه حقل feedback_status لازم لايساوي PROCESSING انا حاليا عامله بهذه طريقه if($value[\'complete\'] == 100 && $value[\'feedback_status\'] ===\"PROCESSING\" ){ $value[\'feedback_status\']=\'\'; } وضعت في message \'feedback_status.required\' =>\"If complete is equal 100 the field feedback_status must be not set to PROCESSING\", الحاله الثانيه اذا كان يوزر ليس له لديه صلاحيه اريد امنعه من ادخال البيانات حاليا عامله بهذه طريقه $location=$value[\'location\']; if(in_array($location,$array_all_dgs,true)){ if(!$this->auth->hasPermission(\'electrical_database_\'.$location.\'-DGS\')){ $value[\'location\']=\'\'; } } وفي message \'location.required\' =>\"1-The field LOCATION required. 2-Maybe You don\'t have permission in this DGS you can\'t update\", سؤال هنا هل ب laravel توجد امكانيه وضع تلك شروط ضمن rules بحيث اريد اختصر كود واريده يصير نظامي اكثر

إضافة تعليق
Loading...