입력표 설치가 힘들다면

10723 단어 PHPLaravelblade

자기소개


프로 프로그래머는 약 반년, PHP는 약 반년을 겪었고 라벨의 존재는 입사 전에 알았던 새끼 프로그래머였다.제가 Qiita에 투고한 것은 이번이 처음입니다.따뜻한 눈으로 볼 수 있다면 좋겠다.

배경


회사의 서비스가 사용하는 프레임워크가 라벨이기 때문에 어떤 입력 형식을 이식하기로 했다.'프로젝트 수도 적고 그렇게 오래 걸리지는 않겠지'라고 생각하다가 의외로 귀찮은 일을 발견하고 다양한 기법을 조합해 겨우 해냈다.
이 보도는 그 요약판이다.(실제로 더 고전하거나 턴진한의 설치)

규격

  • DB
  • tableX: 사용자 계정과 쌍을 이루지만 존재하지 않을 수 있습니다.
  • 입력 페이지
  • 사용자 계정 로그인 시에만 접근 가능 = 방문자에 해당하는 사용자 계정이 방문 시에는 반드시 존재합니다
  • 사용자 계정에 tableX와 관련된 정보가 존재하면 규정된 값을 입력한 폼을 표시합니다
  • 사용자 계정에 tableX와 관련된 정보가 없으면 빈 폼 보이기
  • 확인 페이지로 가기 버튼
  • 확인 페이지에서 반환할 때 입력 값 유지
  • 확인 페이지
  • 입력 페이지의 양식 내용 보이기
  • 입력 페이지로 돌아가는 단추, 내용을 확인하는 단추
  • <input type="hidden"> 내용 유지 금지(대책 왜곡 등)
  • 어떻게 실시합니까


    tableX 정보 가져오기


    우선 다음과 같은 느낌을 썼다.(라우팅 및 중간부품 생략)
    App\User.php
    // ...
        public function tableX(): HasOne
        {
            return $this->hasOne('App\TableX', 'userno')
        }
    // ...
    
    App\Http\Controllers\SomeformController.php
    Class SomeformController extends Controller
    {
        public function edit()
        {
            $tableX = Auth::user()->tableX();
            return view('someform.edit', ['tableX' => $tableX]);
        }
    }
    
    resources\views\someform\edit.blade.php
    {{-- ... --}}
    <form method="..." action="...">
      @csrf
      <div>
        <h4>項目A</h4>
        <input name="item_a" value="{{ $tableX->item_a }}" />
      </div>
      {{-- ... --}}
      <input type="submit" name="confirm" value="確認する" />
    </form>
    {{-- ... --}}
    
    이렇게 설치한 결과...
    ErrorException (E_ERROR)
    Trying to get property 'item_a' of non-object
    
    안전
    원인도 위에 적혀 있다…が、存在しないこともある.아래와 같이 개작하여 없앴다.
    resources\views\someform\edit.blade.php
      {{-- ... --}}
        <input name="item_a" value="{{ $tableX->item_a ?? '' }}"/>
      {{-- ... --}}
    
    $tableXnull, 통상적인 곳에 $tableX->item_a 쓰면 Trying to get property 'b' of non-object 나타나지만 null합체산자??의 왼쪽에 쓰면 isset 때처럼 잘 처리될 것 같다.

    확인 화면에 입력 값 표시


    상당히 고전했던 기억이 나지만 결국 다음과 같은 동작을 취했다.
    App\Http\Controllers\SomeformController.php
    // ...
        public function confirm(Request $request)
        {
            $request->flash();
            return view('someform.confirm');
        }
    // ...
    
    resources\views\someform\confirm.blade.php
    <div>
      <div>
        <h4>項目A</h4>
        <div>{{ old('item_a') }}</div>
      </div>
      {{-- ... --}}
      <form method="..." action="...">
        @csrf
        <input type="submit" name="submit" value="保存"/>
      </form>
      <form method="..." action="...">
        <input type="submit" name="back" value="戻る">
      </form>
    </div>
    
    old()$request->flash()의사용법은잘 이해되지 않는것 같은데...

    확인 화면에서 반환할 때 입력 값을 지우지 않음


    이 코드의 경우 반환 버튼을 눌렀을 때 입력한 값이 재설정됩니다
    나는 이곳도 최적해를 찾는 데 오랜 시간이 걸렸던 것을 기억하지만, 결국은 아래의 글을 통해 해결되었다.
    resources\views\someform\edit.blade.php
    {{-- ... --}}
        <input name="item_a" value="{{ old('item_a', $tableX->item_a ?? '') }}"/>
    {{-- ... --}}
    

    저장 처리 구현


    여기에 쓴 후 저장 처리만 설치하면 쉽게 승리할 수 있습니다!
    App\Http\Controllers\SomeformController.php
    // ...
        public function submit()
        {
            $tableX = Auth::user()->tableX;
            $tableX->fill(old())->save();
            return redirect('...');
        }
    // ...
    
    Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
    Call to a member function fill() on null
    

    원인도 처음에 나타났다…が、存在しないこともある.
    결국 다음과 같은 내용을 써서 해결했다.
    App\Http\Controllers\SomeformController.php
    // ...
        public function submit()
        {
            $tableX = TableX::firstOrNew(['userno' => Auth::user()->id]);
            $tableX->fill(old())->save();
            return redirect('...');
        }
    // ...
    
    "TableX표와 User표는 관련이 있기 때문에 User모델의 대상에서...TableX대상의 생각을 고집하면 무의미한 복잡한 코드가 된다.(실제가 되었다.)

    끝내다


    본문에서 말한 바와 같이 완성되기 전에 상당히 고전했다.완성되기 전에 무의식중에 복잡하고 긴 코드가 되어 때로는 "라벨이 귀찮아"하기도 한다.그러나 보도에서 라벨은 firstOrNew 함수 등 번잡한 설명을 없애는 도구를 준비했다.이런 도구를 능숙하게 사용할 수 있도록 앞으로도 배우고 싶다.
    여기까지 읽어주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기