저희 회사에서는 현재 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과 같은 논리 계층 클래스의 재사용 문제를 어떻게 해결하는지 묻고 싶습니다.
0x0 서문
흥미로운 질문입니다. Yii는 업계에서도 Laravel보다 성능이 뛰어난 프레임워크로 인정받고 있습니다. 그래서 저는 ActiveRecord의 구조에서 두 가지 주요 프레임워크의 구체적인 구현을 살펴보고 싶었습니다.
0x1 Laravel용 Eloquent 프레임워크
Laravel에서는 관계형 쿼리를 사용하기 쉽습니다:
으아악User 클래스에서 find 메소드를 찾지 못했는데 WTF, 무슨 일이 일어난 걸까요! ?
User의 기본 클래스는 정적 호출을 사용하는 Model이므로 Model의 __callStatic 매직 메서드가 호출됩니다.
으아악사실 __call 매직 메서드를 다시 호출하는 것입니다:
으아악소스를 다시 추적해 보면 find 메소드가 실제로 IlluminateDatabaseEloquentBuilder에서 왔으며 이 클래스는 내부적으로 IlluminateDatabaseQueryBuilder의 구현을 사용한다는 것을 발견했습니다.
잠깐만요. IlluminateDatabaseEloquentBuilder와 IlluminateDatabaseQueryBuilder의 차이점은 무엇인가요?
사실 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()를 호출하세요