كيف يمكنني تمرير القيم بين القوالب في لارافيل?[مغلق]

StackOverflow https://stackoverflow.com//questions/25007377

  •  20-12-2019
  •  | 
  •  

سؤال

أنا باستخدام إطار لارافيل 4.1.30.

كيف يمكنك تمرير البيانات من قالب واحد إلى آخر دون المرور عبر الطريق أو وحدة تحكم?

تفاصيل:حصلت على قالب شفرة " رئيسي "يتم تمديده بواسطة قالب شفرة" تسجيل الدخول".هدفي هو وضع أي أخطاء تظهر في قالب" تسجيل الدخول "وعرضها في قسم تذييل القالب" الرئيسي".

الرموز الخاصة بي للقالب الرئيسي داخل علامة "الجسم" هي كما يلي (لاحظ وجود بعض الرموز بينهما لتنسيق وجهة نظري):

<!-- Serving as Header -->
@include('layout.navigation')

<!-- Serving as left content/status displays -->
@include('layout.frameleft') 

<!-- Serving as right content/entry point -->
@yield('content')

<!-- Serving as Error Notification/footer -->
@if (Session::has('global'))
      {{ Session::get('global') }}
@endif

يتم ترميز قالب شفرة استدعاء الرئيسي مثل ذلك:

@extends('layout.main')

@section('content')

    ... more code here / input fields ...

    {{ $errors->first('email')}}

    ... more code here / input fields ...

@stop

كما أفهمها (جديد إلى حد ما لارافيل) المحتوى يحصل على أن تقرأ أولا قبل عرض الدورة العالمية.

كنت آمل أن يكون متغير بسيط يمر بين القالب كافيا (إن وجد) لحل المشكلة.أرغب في تمرير قيمة الخطأ من المحتوى مرة أخرى إلى القالب الرئيسي في جزء قسم التذييل دون الرجوع إلى وحدة التحكم.

أدرك أن هناك حلولا ، مثل بدلا من انتظار وحدة التحكم لإخراج الأخطاء إلى القالب ، يمكنني تمرير الأخطاء مباشرة إلى المتغير العام عبر الجلسة (أو التخطيط) من وحدة التحكم.حاليا رمز العمل التالي هو ما قمت بتنفيذه ولكن أنا فقط أتساءل ماذا لو تم تمرير البيانات بالفعل إلى القالب.

public function postSignin() {

        $validator = Validator::make(Input::all(),
            array(
                    'email'     => 'required|email',
                    'password'  => 'required'
            )
        ); 

        if ($validator->fails()) {

            $errors = $validator->errors();
            $formErrors = 'Errors: ';

            foreach($errors->all() as $error ) {
                $formErrors .= sprintf("%s", $error);
            }

            return Redirect::route('account-sign-in')
                ->withErrors($validator)
                ->withInput()
                ->with('global',$formErrors);

        } else {

        ...more codes here...

لماذا أفعل ذلك هو أن في الأصل رمز بلدي في وحدة تحكم هو تماما مثل..

        if ($validator->fails()) {

           return Redirect::route('account-sign-in')
              ->withErrors($validator)
              ->withInput();

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

هل كانت مفيدة؟

المحلول

من وثائق لارافيل (التأكيد عليهم):

ومع ذلك، لاحظ أنه ليس من الضروري أن نربط رسائل الخطأ بشكل صريح بالعرض في مسار GET الخاص بنا.وذلك لأن Laravel سيتحقق دائمًا من الأخطاء في بيانات الجلسة، ويربطها تلقائيًا بالعرض إذا كانت متوفرة. لذلك، من المهم أن نلاحظ أن أ $errors سيكون المتغير متاحًا دائمًا في جميع طرق عرضك، وفي كل طلب, ، مما يسمح لك بافتراض أن المتغير $errors محدد دائمًا ويمكن استخدامه بأمان.ال $errors المتغير سيكون مثالا ل MessageBag.

لأن لارافيل Redirect... withErrors() الطريقة تفعل ذلك، فلن تحتاج إلى إضافة الأخطاء إلى الجلسة مرة أخرى يدويًا.بدلا من التحقق من if (Session::has('global')), ، فقط افعل هذا:

<!-- Serving as Error Notification/footer -->
@foreach ($errors as $error)
    <p>{{ $error }}</p>
@endforeach

هذا يجب أن يعمل بالرغم من إنه في layout وليس في العرض الفعلي، لأن الربط ينطبق errors داخل القالب ينطبق أيضًا على خارجه.

إذا لم تكن هناك أخطاء، فسيقوم Laravel بتخطي تلك الكتلة.إذا كانت هناك أخطاء، فسيتم ربطها تلقائيًا بـ $errors متغير وسيتم تقديمه كما هو متوقع.

نصائح أخرى

كنت أكتب في الأصل إجابة موصى بها عرض الملحنين, ، ولكن بعد ذلك إعادة قراءة السؤال وأعتقد أن ما عليك القيام به هو مجردة من التحقق من صحة النموذج إلى فئة 'نموذج':

interface FormInterface {
    public function isValid($input);
    public function errors();
}

الفكرة الأساسية التي حصلت عليها من سؤالك هي أنك تريد أن تبدو وحدة التحكم الخاصة بك مثل هذا:

public function postSignIn()
{
    if(!$this->_signinForm->isValid(Input::all())) {
        return Redirect::route('account-sign-in')
            ->withErrors($this->_signinForm->errors())
            ->withInput()
        ;
    }

    // Non-error logic branch
}

ستحتوي فئة النموذج بشكل أساسي على مرجع إلى كائن المدقق.كل ال isValid طريقة يجب القيام به هو في الأساس استدعاء passes() على المدقق ، وجميع error سوف الطريقة ببساطة إرجاع نتائج الدعوة errors() على المدقق.

بصراحة ليس لدي أي فكرة عن سبب قيامك بالفعل بدمج جميع رسائل الخطأ في متغير واحد ، أفترض ذلك لأنك تريد عرضها جميعا في نفس المكان.إذا كان هذا هو الحال وهذه هي الطريقة التي تريد أن تعمل بها الأخطاء ، فيمكنك إنشاء ذلك في النموذج الخاص بك errors الطريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top