2017-05-06 1 views
3

Repository Pattern (내 생각에는 그 패턴에 익숙하지 않음) 프로젝트 Laravel 5.4에서 작업 중입니다. 나는 웹에 이것에 대해 빨간색을 많이했습니다하지만, 난 여전히 두 가지 중요한 질문이 있습니다Laravel 저장소 패턴 설명

> 질문 # 1 :

내가 Laravel ORM Eloquent 사용하고 난이처럼 보이는 인터페이스를 가지고 상상을 :

<?php 

namespace App\Repositories\User; 

interface UserRepoInterface 
{ 
    /** 
    * @param array $user 
    */ 
    public function update(array $request, User $user); 
} 

당신은 내가 매개 변수와 같은 웅변 User 모델을 지정했는지 확인할 수 있습니다.

웅변 구현은 다음과 같습니다

public function update(array $request, User $user) 
{ 
    $user->name    = $request['name']; 
    $user->last_name  = $request['last_name']; 
    $user->email   = $request['email']; 
    $toUpdate->save(); 
} 

그래서 내 질문 :

내 인터페이스의 웅변 User 모델을 하드 코딩 잘못인가? 웹에서 많은 예제를 통해이 작업을 수행하는 사람들을 볼 수 있지만 파일 기반 구현으로 웅장한 구현을 바꾸고 싶다면 어떻게해야할까요? 업데이트 방법에 User 모델을 전달해야하므로 문제가됩니다.

User $user 대신 $user 만 선언하면이 문제의 해결책은 무엇입니까?

> 질문 # 2 :

어떻게 매김을 처리해야합니까? 예를 들어

내 웅변 UserRepository 나는 다음과 같다 방법했습니다 :

public function index() 
{ 
    return User::orderBy('name', 'asc') 
     ->withCount('messages') 
     ->with('corporation') 
     ->paginate(10); 
} 

이 잘못인가? 내 컨트롤러에서만 페이지 매김을해야합니까?

좋은 설명은 나에게 많은 도움이 될 것입니다.

답변

2

질문 1

Laravel는 모델 + 데이터 액세스 계층에 액티브 패턴을 사용한다.

이 패턴은 객관적으로 일을 더 쉽고 빠르게 만듭니다. 리포지토리 패턴을 사용하면 멀리 떨어져 나갈 수 있습니다.

실제 리포지토리 패턴을 사용하려면 데이터 전송 개체 인 DAT (자바에서는 POJO라고 함)를 만들어야합니다. 그런 다음 Eloquent 엔티티를 Entity Manager로 사용하십시오.

POPO

class User { 

    private $id; 
    private $a; 

    public setId ($id) { $this->id = $id; } 
    public getId() { return $this->id; } 

    public setA ($a) { $this->a = $a; } 
    public getA() { return $this->a; } 
} 

엔티티 관리자는

class UserEloquent extends Eloquent { 
    protected $_table = 'user'; 
} 

는 저장소

class EloquentUserRepository implements UserReposistory { 
    private $em; 

    public __constructor (UserEloquent $em) { $this->em = $em; } 

    public update (User $dat) { 
    $user = $em->find($dat->getId()); 
    $user->a = $dat->getA(); 
    $user->save(); 
    } 
} 

당신은 자세한 방법을 볼 수 일 것이다? 이 접근 방식을 실제로 사용하려면 Doctrine을 사용하는 것이 좋습니다.

그러나 ActiveRecord를 그대로 사용하고 싶다면 레일즈 프로젝트에 루비를 보길 추천합니다! 그들은이 패턴에서 정말 훌륭합니다.

저는 정말로 생각합니다 : 프로젝트에 좋은 것을 만드십시오. 간단하게 생각하고 팀과 함께 생각하고 최상의 방법을 구축하십시오. 누군가 당신에게 말했기 때문에 항상 같은 패턴을 사용하지 마십시오.

프로젝트가 작고 빠르면 프레임 워크에서 제공하는 것을 사용하십시오. (긴장을 풀고 잘못된 코드를 작성하는 것은 아닙니다). 큰 프로젝트 인 경우 팀에 많은 개발자가 있으며 결국 데이터 액세스 계층을 변경하려는 경우 저장소 패턴에 대해 생각해보십시오.

물론 때로는 잘못된 아키텍처 결정을 내릴 수 있지만, 우리가 배우는 방법입니다! 그리고 패턴에 대한 책을 읽은 유지, 당신은 훌륭한 건축가 :

질문 2

그것은 당신이 위의 결정했는지에 따라 결정이 될 수있는 좋은 경로를 따르고 있습니다 생각합니다. ActiveRecord를 그대로 사용하는 Eloquent가 어디에서 호출해야하는지 (컨트롤러 또는 중간 클래스)는 중요하지 않습니다. 그냥 몇 가지 패턴을 따르십시오. 컨트롤러 을 항상 호출하면 컨트롤러에서 수행하십시오. 그렇지 않으면 코드에서 길을 잃을 수 있습니다.

리포지토리를 사용하면 저장소 내부에서 문제가없는 것으로 생각됩니다.