뷰에 전달될 변수를 준비하기 위해 많은 작업을 수행해야 하는 컨트롤러를 만든 적이 있습니까? 이러한 종류의 작업을 소위 뷰 모델로 이동할 수 있습니다. 본질적으로 뷰 모델은 일부 데이터를 가져와 뷰에 사용할 수 있는 것으로 변환하는 간단한 클래스입니다.
Stitcher.io의 이 블로그 게시물에서 더 자세한 설명과 몇 가지 좋은 예를 찾을 수 있습니다.
Laravel의 기본 뷰 작성기는 이 패키지에서 제공하는 뷰 모델과 동일하지 않습니다. 차이점에 대해 자세히 알아보려면 Stitcher.io의 이 블로그 게시물을 참조하세요.
우리는 동급 최고의 오픈 소스 패키지를 만드는 데 많은 리소스를 투자합니다. 유료 제품 중 하나를 구매하여 우리를 지원할 수 있습니다.
귀하가 사용하고 있는 당사 패키지를 언급하면서 귀하의 고향에서 엽서를 보내주셔서 진심으로 감사드립니다. 연락처 페이지에서 주소를 확인하실 수 있습니다. 우리는 수신된 모든 엽서를 가상 엽서 월에 게시합니다.
작곡가를 통해 패키지를 설치할 수 있습니다.
composer require spatie/laravel-view-models
뷰 모델은 뷰에 복잡한 논리를 넣을 수 있는 클래스입니다. 이렇게 하면 컨트롤러가 좀 더 가벼워질 것입니다. 제공된 SpatieViewModelsViewModel
확장하여 뷰 모델을 생성할 수 있습니다.
class PostViewModel extends ViewModel
{
public $ user ;
public $ post ;
public $ indexUrl = null ;
public function __construct ( User $ user , Post $ post = null )
{
$ this -> user = $ user ;
$ this -> post = $ post ;
$ this -> indexUrl = action ([PostsController::class, ' index ' ]);
}
public function post (): Post
{
return $ this -> post ?? new Post ();
}
public function categories (): Collection
{
return Category:: canBeUsedBy ( $ this -> user )-> get ();
}
}
그런 다음 컨트롤러에서 다음과 같이 뷰 모델 클래스를 사용할 수 있습니다.
class PostsController
{
public function create ()
{
$ viewModel = new PostViewModel (
current_user ()
);
return view ( ' blog.form ' , $ viewModel );
}
public function edit ( Post $ post )
{
$ viewModel = new PostViewModel (
current_user (),
$ post
);
return view ( ' blog.form ' , $ viewModel );
}
}
보기에서는 다음을 수행할 수 있습니다.
< input type = " text " value = " {{ $post -> title } } " />
< input type = " text " value = " {{ $post -> body } } " />
< select >
@foreach ( $categories as $category )
< option value = " {{ $category -> id } } " > {{ $category -> name } } </ option >
@endforeach
</ select >
< a href = " {{ $indexUrl } } " >Back</ a >
뷰 모델의 모든 공용 메서드와 속성은 자동으로 뷰에 노출됩니다. 뷰에서 특정 메서드를 사용하지 않으려면 이를 무시할 수 있습니다.
class PostViewModel extends ViewModel
{
protected $ ignore = [ ' ignoredMethod ' ];
/ / …
public function ignoredMethod () { / * … * / }
}
모든 PHP 내장 매직 메소드는 자동으로 무시됩니다.
컨트롤러에서 뷰 모델을 직접 반환하는 것이 가능합니다. 기본적으로 데이터가 포함된 JSON 응답이 반환됩니다.
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return new PostViewModel ( $ post );
}
}
이 접근 방식은 AJAX 제출 양식으로 작업할 때 유용할 수 있습니다.
뷰를 직접 반환하는 것도 가능합니다:
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return ( new PostViewModel ( $ post ))-> view ( ' post.form ' );
}
}
요청의 Content-Type
헤더가 JSON으로 설정된 경우 이 접근 방식은 렌더링된 보기 대신 JSON 데이터도 반환합니다.
뷰 모델은 추가 매개변수가 필요한 기능을 노출할 수 있습니다.
class PostViewModel extends ViewModel
{
public function formatDate ( Carbon $ date ): string
{
return $ date -> format ( ' Y-m-d ' );
}
}
다음과 같이 뷰에서 이러한 기능을 사용할 수 있습니다.
{{ $ formatDate ( $post -> created_at ) } }
패키지에는 새 뷰 모델을 생성하는 artisan 명령이 포함되어 있습니다.
php artisan make:view-model HomepageViewModel
이 뷰 모델은 AppViewModels
네임스페이스를 가지며 app/ViewModels
에 저장됩니다.
또는 AppBlog
같은 사용자 정의 네임스페이스에
php artisan make:view-model " Blog/PostsViewModel "
이 뷰 모델은 AppBlogViewModels
네임스페이스를 가지며 app/Blog/ViewModels
에 저장됩니다.
최근 변경된 사항에 대한 자세한 내용은 변경 로그를 참조하세요.
자세한 내용은 CONTRIBUTING을 참조하세요.
보안 관련 버그를 발견한 경우 이슈 트래커를 사용하는 대신 [email protected]로 메일을 보내주세요.
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.