[Laavel] DI/웨어하우스 모드

25933 단어 LaravelPHPtech

떼어놓다

  • fatcontroller
  • fatModel
  • 창고 모델
  • 창고 모드


    데이터 조작과 관련된 논리를 분리하여 다른 추상층에 의뢰하는 설명
    확장성과 유지보수성을 높이다.이렇게 말하지만, 내 소감은
    · 개발 공정과 속도는 단기적으로 대폭 단축할 수 없다
    • 상황에 따라 마이너스일 수도 있다.
    • 장기적으로 관찰할 때 테스트 및 기타 디자인의 관계로 인해 규모가 어느 정도 이상이면 최종 원가가 떨어진다
    이런 인상.
    목적은 데이터 조작을 창고에 집중시키고 분리, 추상화를 통해 이익을 얻는 것이다. 예를 들어 너무 복잡한 테이블 업데이트와 오류 처리 등이 발생하기 쉽다.
    따라서 학급 증가에 유리한 점이 많으면 채용해야 한다.
    다만, 창고로만 나누면 효과가 적을 것 같다
    두 종류로 나뉘어 진화를 발휘할 수 있다
    우리 팀은 서비스에 추상화 처리와 테스트 등 관계를 쓰는 것이 장기적으로 보면 이익을 얻는 사상이라는 것을 깨달았다.
    물론 1 대 1 은 아니다.

    DI:Dependency Injection


    학급의 실례를 통일적으로 완성하였다.
    laavel에서 서비스 용기라고 부른다
    실례 생성을 서비스 용기에 결합시켜 사용하다.
    ex)Utility
    모든 곳에서 사용된 처리를 총결하였다(란은 주의해야 한다)
    facade를 등록하면 blade도 사용할 수 있습니다 (=Helper)
    다만 회사에 따라 유틸리티 금지령이 발령되기 때문에 사용을 검토해야 한다.

    물줄기


    프런트와 가방이 분리된 상태에서 고려해 보세요.
    흔히 볼 수 있는 이미지 등록의 대략적인 동작을 보십시오.

    Interface 설계


    • 사용자 정의형의 능력만 클래스에서 분리된 언어 기구.
    · 자바와 유사한 인터페이스 짝퉁.
    • 실례화할 수 없는 종류의 잘못된 행위
    HogeImageRepositoryInterface
    interface HogeImageRepositoryInterface
    {   
        public function getImages(int $hogeId): Collection;
    
        public function create(array $params): HogeImage;
    }
    
    실행 시 ORM에서 가져온 모드/조회 구축기에서 가져오기
    실장 모드를 바꿀 때 진화를 발휘한다.

    서비스 컨테이너에 로그인(자세한 내용은 아래와 같다)


    app/Providers/RepositoryServiceProvider.php
    // 略(register内)
    $this->app->bind(HogeImageRepositoryInterface::class, HogeImageRepository::class);
    

    Repository


    얻은 값만 허용
    /**
     * 画像取得
     * @param int $hogeId
     * @return Collection
     */
    public function getImages(int $hogeId): Collection
    {
        $hogeImages = HogeImage::query()->where('hoge_id', $hogeId)
            ->orderBy('id')->get();
    
        return $hogeImages;
    }
    
    /**
     * 画像登録
     * @param array $params
     * @return hogeImage
     */
    public function create(array $params = []): hogeImage
    {
        $hogeImage = new HogeImage();
    
        foreach ($params as $k => $v) {
            $hogeImage->$k = $v;
        }
        $hogeImage->save();
    
        return $hogeImage;
    }
    

    Service Provider


    서비스 용기 관리에 들어가기 위해 등록하기
    app/Providers/AppServiceProvider.php
    public function register()
    {
       // 略
       $this->app->bind('hogeImage', HogeImage::class);
    }   
    
    복잡한 의존관계에서 오류는 심각하지만 간단한 것을 정의하지 않아도 변화가 일어난다.
    왜 조작해야 하는지 이유는 다음과 같다.
    서비스 컨테이너에 관해서는 매우 완비되어 있으니 반드시 확인해 주십시오.
    https://reffect.co.jp/laravel/laravel-service-container-understand

    Service


    class hogeImageService
    {
        protected $uploadTo = 'uploads/hoges';
        protected $hogeImageRepository;
    
        /**
         * hogeImageService constructor.
         * @param hogeImageRepository $hogeImageRepository
         */
        public function __construct(hogeImageRepository $hogeImageRepository)
        {
            $this->hogeImageRepository = $hogeImageRepository;
        }
    
        /**
         * 画像 一覧取得
         * @param int $hogeId
         * @return JsonResponse
         */
        public function getImages(int $hogeId): JsonResponse
        {
            $hoges = $this->hogeImageRepository->getImages($hogeId);
    
            return response()->json($hoges, 200);
        }
    
        /**
         * 画像 登録機能
         * @param Request $request
         * @return JsonResponse
         */
        public function create(Request $request): JsonResponse
        {
            $comment = $request['comment'];
    
            $params = [
                'hoge_id' => $hogeId,
                'comment' => $comment,
            ];
    
            $hogeImage = $this->hogeImageRepository->create($params);
    
            if ($request->hasFile('file')) {
                // 画像圧縮&保存
                $file = $request->file('file');
    
                $fileName = $hogeId . '_'. $hogeImage->id . '.' . $file->getClientOriginalExtension();
                $path = Storage::disk('s3')->putFileAs($this->uploadTo, $file, $fileName,'public');
    
                $hogeImage->image = $path;
            }
    
            $hogeImage->save();
            $result = $hogeImage;
            return response()->json($result, 200);
        }
    }
    
    이미지 업로드에서도 같은 처리를 자주 사용하는 경우 서비스에서 추상화
    public function uploadFileToS3(int $id, string $uploadTo, Request $request): string
    {
        $path = '';
    
        if ($request->hasFile('image')) {
            $file = $request->file('image');
            $fileName = $id . '.' . $file->getClientOriginalExtension();
    
            $path = Storage::disk('s3')->putFileAs($uploadTo, $file, $fileName, 'public');
        } else {
            $path = '';
        }
    
        return $path;
    }    
    
    는 다음과 같이 얻을 수 있다.
    // protectedで宣言、constructでutilityなどサービスを読み込んだ上で
    $path = $this->utility->uploadFileToS($id, $this->uploadTo, $request);
    

    컨트롤러


    컨트롤러는 수치만
    protected $hogeImageService;
    
    public function __construct(HogeImageService $hogeImageService)
    {
        $this->hogeImageService = $hogeImageService;
    }
    
    /**
     * 画像 一覧取得
     * @param $hogeId
     * @return JsonResponse
     */
    public function getImages($hogeId): JsonResponse
    {
        return $this->hogeImageService->getImages($hogeId);
    }
    
    /**
     * 画像 登録処理
     * @param Request $request
     * @return JsonResponse
     */
    public function create(Request $request): JsonResponse
    {
        return $this->hogeImageService->create($request);
    }
    

    총결산


    솔직히 이 수준이라면 빚을 질 수밖에 없다
    대체적으로 같은 이미지 등록 처리를 반복하면 서버 전체를 추상화합니다
    보수적인 원가 절감과 가독성이 높아졌죠.오류 검증은 로그만 확인하면 됩니다.
    개인적으로 서비스 용기를 이해하지 못하면 쓸데없는 일이 많이 생길 것 같아요.
    그리고 멤버들의 힘이 너무 크면 오히려 감점된다고 하더라고요.
    단기적인 노동시간이 필요하지만 더 좋은 점이 있다면 열심히 쓰고 싶어요.

    좋은 웹페이지 즐겨찾기