Laravel에서 모델을 재사용하는 방법
伊谢尔伦
伊谢尔伦 2017-05-16 16:53:44
0
5
759

저희 회사에서는 현재 Laravel开发项目,同时还增加了Biz层和Repositories层,来实现业务逻辑封装,反而model里面什么代码都没有。
Controller里写代码的时候,尝尝困扰我的问题是如果复用Biz对象,Repositories对象和Model对象。
以前用Yii开发项目的时候,有一个工厂模式,所以调用Model的时候,基本都不new XXX::model() 을 사용하여 바이트라고 하는 을 사용하고 있습니다. 객체가 한 번 새로워지면 충분하므로 메모리를 효과적으로 절약할 수 있습니다.
컨트롤러 코드:

으아악

정말 간단하죠?

Laravel에서는 Model에 팩토리가 없는 것 같습니다. 이를 호출하려면 Repositories에 5개의 메소드가 캡슐화되어 있는 경우, 각각은 Model로 사용되었으며, Controller에서 이 5가지 메서드를 호출했고 Model이 5번 새로 추가되었습니다. Laravel里,Model好像没有工厂,要调用,都需要实例,假如Repositories里面封装了5个方法,每个都使用了Model,那么我在Controller里调用了这5个方法,Model就被new了5次。
目前在网上看到一种办法,就是在Repositories현재 인터넷에서 Model 객체를 Repositories의 생성자에 삽입하고 이를 Repositories의 전용 멤버 변수에 넣는 방법을 봅니다. 이런 방식으로 다섯 가지 메서드 모두 현재 클래스의 개인 변수. 하지만 사용하기가 번거롭습니다. Controller에서 코드를 작성할 때는 다음과 같이 작성해야 합니다.

으아악

이것을 저장소에 작성해야 합니다:

으아악

new에 Biz的时候,还必须传入Repositories오브젝트가 있는데 네임스페이스가 아직 길어요. 기본적으로 문자열을 철자해서 작성하는 편이라 코드 작성 효율도 굉장히 낮습니다.

Laravel로 프로젝트를 개발할 때 Model과 같은 논리 계층 클래스의 재사용 문제를 어떻게 해결하는지 묻고 싶습니다.

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

모든 응답(5)
漂亮男人

0x0 서문

흥미로운 질문입니다. Yii는 업계에서도 Laravel보다 성능이 뛰어난 프레임워크로 인정받고 있습니다. 그래서 저는 ActiveRecord의 구조에서 두 가지 주요 프레임워크의 구체적인 구현을 살펴보고 싶었습니다.

0x1 Laravel용 Eloquent 프레임워크

Laravel에서는 관계형 쿼리를 사용하기 쉽습니다:

으아악

User 클래스에서 find 메소드를 찾지 못했는데 WTF, 무슨 일이 일어난 걸까요! ?

User의 기본 클래스는 정적 호출을 사용하는 Model이므로 Model의 __callStatic 매직 메서드가 호출됩니다.

으아악

사실 __call 매직 메서드를 다시 호출하는 것입니다:

으아악

소스를 다시 추적해 보면 find 메소드가 실제로 IlluminateDatabaseEloquentBuilder에서 왔으며 이 클래스는 내부적으로 IlluminateDatabaseQueryBuilder의 구현을 사용한다는 것을 발견했습니다.

잠깐만요. IlluminateDatabaseEloquentBuilderIlluminateDatabaseQueryBuilder의 차이점은 무엇인가요?

사실 EloquentBuilder는 관계형 개체 쿼리를 더 잘 구현하기 위해 QueryBuilder를 추가로 캡슐화한 것입니다.

실제 프로세스는 다음과 같습니다.

즉, Model 메서드를 정적으로 호출할 때마다 모델이 인스턴스화되고 프로세스가 완료됩니다.

0x2 Yii 1.1의 CActiveRecord

질문자는 모델 메소드를 사용하므로 버전 1.1이어야 합니다. 모듈은 CActiveRecord를 상속합니다(Yii2에서는 YiidbActiveRecord를 상속합니다).

좋아요, 이제 Yii를 사용하여 관계형 쿼리를 구현하고 먼저 다음을 정의하세요.

으아악

문의:

으아악

분명히 쿼리 개체는 모델에서 비롯됩니다. 상위 클래스가 이 기능을 어떻게 구현하는지 살펴보겠습니다.

으아악

findAllByPk 메소드는 CActiveRecord 내부에 직접 캡슐화됩니다.

으아악

프로세스는 다음과 같습니다.

0x3 Laravel을 사용한 종속성 주입

일반적인 상황(매개변수 없는 생성자 또는 주입된 매개변수가 구성됨)에서 Laravel은 자동으로 이를 인스턴스화합니다.

으아악

동일한 객체를 쉽게 재사용할 수 있습니다:

으아악

웨어하우스를 구현한 후 수동으로 인스턴스화해야 합니까?

으아악

아니요, 이것은 Laravel의 철학과 일치하지 않습니다. 다음과 같이 간단하게 할 수 있습니다:

으아악

예, 맞습니다. 수동으로 생성하거나 User 인스턴스를 전달할 필요가 없으며 모든 것이 간단한 자동 주입입니다. 그리고 질문자는 여기서 네임스페이스가 사용되므로 한 번만 사용하면 된다는 점을 알아냈습니다. (물론 이렇게 긴 네임스페이스를 입력하고 싶지 않다면 이제 IDE로 변경해야 할 때입니다. Alt + Enter를 사용하여 PhpStorm에서 빠르게 가져올 수 있습니다

0x4 드디어

정적 및 비정적 오버헤드 문제에 대해서는 StackOverflow에 대한 토론이 있습니다: http://stackoverflow.com/questions/14727...

그래서 최종 분석에서는 여전히 비즈니스 요구에 따라 다릅니다 23333

阿神

종속성 주입을 통해
컨트롤러에 직접 주입할 수 있습니다
이 글을 읽어보세요
http://slides.com/howtomakeaturn/model#/

小葫芦

아직 Laravel에 대해 잘 모르실 거라 생각합니다.

먼저, Laravel의 모델은 명시적인 인스턴스화가 필요하지 않은 모델이기도 합니다. 호출 방법은 다음과 같습니다(공식 문서에서 발췌):

으아악

둘째, 설명이 잘못되었습니다. 당신이 찾고 있는 것은 팩토리 패턴이 아니라 싱글톤 패턴입니다. 객체는 요청 수명 주기 동안 한 번만 인스턴스화하면 됩니다. Laravel에서는 IOC(Inversion of Control) 컨테이너나 서비스 컨테이너를 사용해야 합니다. 이렇게:

으아악

위 내용은 간단한 발췌 내용입니다. 자세한 사용법은 Laravel의 공식 우수 문서를 참조하세요. 링크는 다음과 같습니다.
Service Container(IOC 컨테이너/서비스 컨테이너)

洪涛

우리 회사는 BaseRepository에 정의된 BaseRepository를 상속받습니다

으아악

쿠폰 저장소

으아악

Biz와 유사하게 BaseBiz를 상속받아 메소드를 이렇게 작성합니다

으아악

Controller

에서 호출됨 으아악

컨트롤러 ---> 비즈니스 ---> 저장소

淡淡烟草味

저는 이렇게 했습니다. 기본 모델에서 이 함수를 만듭니다.
bootstrap/app.php 및 AppServiceProvider.php를 수정합니다.
자세한 내용은 서비스 공급자를 참조하세요

으아악

컨트롤러에서 Foo::load()를 호출하세요

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿