문제

Laravel Framework 4.1.30을 사용하고 있습니다.

경로나 컨트롤러를 통하지 않고 한 템플릿에서 다른 템플릿으로 데이터를 어떻게 전달합니까?

세부사항:"로그인" 블레이드 템플릿으로 확장된 "기본" 블레이드 템플릿이 있습니다.내 목표는 "로그인" 템플릿에 나타나는 모든 오류를 넣고 이를 "기본" 템플릿의 바닥글 섹션에 표시하는 것입니다.

"body" 태그 내부의 기본 템플릿에 대한 내 코드는 다음과 같습니다. 내 보기의 형식을 지정하기 위해 사이에 일부 코드가 존재합니다.

<!-- 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

Main을 호출하는 블레이드 템플릿은 다음과 같이 코딩됩니다.

@extends('layout.main')

@section('content')

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

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

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

@stop

내가 이해하는 바에 따르면(Laravel의 새로운 기능) 세션이 전역적으로 표시되기 전에 콘텐츠가 먼저 읽혀집니다.

나는 템플릿 사이에 전달되는 간단한 변수가 (존재하는 경우) 문제를 해결하기에 충분할 것이라고 기대했습니다.컨트롤러로 돌아가지 않고 콘텐츠의 오류 값을 바닥글 섹션 부분의 기본 템플릿으로 다시 전달하고 싶습니다.

컨트롤러가 템플릿에 오류를 출력할 때까지 기다리는 대신 컨트롤러의 세션(또는 레이아웃)을 통해 전역 변수에 직접 오류를 전달할 수 있는 해결 방법이 있다는 것을 알고 있습니다.현재 다음 작업 코드는 제가 구현한 코드이지만 데이터가 이미 템플릿에 전달된 경우 어떻게 되는지 궁금합니다.

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