morphTo는 type과 type_id를 가진, 여러 테이블로 연결되어야할 테이블에서 사용하는 릴레이션 메소드이다.
공식 문서에는 데이터를 가져온 뒤 릴레이션을 연결하는 예시만 있고, Eager 로딩 (With 구문을 사용하는 방법) 후 specific한 필드를 사용하게 변경하는 경우에 대한 정보는 없다.
타입과 인덱스를 명시하면 드디어 오류메세지가 노출된다.
내가 정의한 type명을 가진 Class가 없다 라는 내용인데, 이제 타입과 모델을 연결시켜보자.
이 때 사용할 수 있는 메소드가 공식 문서에서 조금 스크롤을 내리면 있는 Custom Polymorphic Types에 잘 설명되어 있다.
하지만 등록하는 부분에 대한 설명이 **You may register the morphMap in the boot function of your AppServiceProvider or create a separate service provider if you wish.**라고 되어있다. 즉 AppServiceProvider에 넣던지 Service Provider로 생성이다.
한 모델에만 쓸 건데 전체에 등록을 할 필요가 없으니, 사용할 모델에 기능을 넣어보자.
YourModel.php
// Relation을 사용해야한다. useIlluminate\Database\Eloquent\Relations\Relation; <?php classYourModelextendsModel{ // 이 메소드는 모델이 initialize될 때 실행된다. protectedstaticfunctionboot(){ parent::boot(); // 여기에 타입 별로 모델을 바인딩한다. Relation::morphMap([ // type이 product일 경우 id는 product_id를 가리킨다. 'product'=>'App\Models\Product', // type이 order일 경우 id는 order_id를 가리킨다. 'order'=>'App\Models\Order' ]); } publicfunctiondata(){ // morphTo의 paremeter로 null, 타입필드명, 타입인덱스 필드명을 넘긴다. return$this->morphTo(null,'type','type_idx'); } }
위키를 참조해보면 iso-2022는 문자열을 7bit 또는 8bit로 표현하는 기술이다. 근데, 소프트뱅크 문서에 7bit로 달란다.
메일 폼을 열어서 build시에 인코딩 바이트를 변경하자.
app/Mail/YourMailForm.php
<?php ... useSwift_Mime_ContentEncoder_PlainContentEncoder; classYourMailFormextendsMailable { ... publicfunctionbuild(){ return$this->subject('ご注文を承りました。') ->view('mail.your_mail_view') ->withSwiftMessage(function($message){ // 전 역으로 설정한 뒤에 이 메소드를 빼보고 테스트를 못 해봤다. // 다음 분이 빼고 테스트 부탁드려요 : ) $message->setCharset('iso-2022-jp') // 인코딩 바이트를 바꿔준다. ->setEncoder(newSwift_Mime_ContentEncoder_PlainContentEncoder('7bit')); }); } }
<?php // authenticated 메소드를 Override protectedfunctionauthenticated(Request$request,$user){ // 인증이 된 경우 페이지 전환이 아닌 전환될 페이지를 json으로 반환한다. if($request->ajax()){ returnresponse()->json([ 'href'=>url()->previous() ]); }else{ returnabort(405); } }