RXN ( '반응'의 약어)는 PHP 생성 뷰의 복잡성과 혼란을 차단하기 위해 설계된 프레임 워크입니다.
RXN의 배후의 철학은 간단합니다 : 엄격한 백엔드 / 프론트 엔드 디커플링 .
베타에 대한 계획된 기능 포함 (확인되지 않은) :
RXN은 허용 및 무료 MIT 라이센스에 따라 릴리스됩니다.
RXN은 클래스 파일의 디렉토리 구조와 명시 적으로 일치하는 네임 스케이팅 구조를 사용합니다. 또한 편리하지만 주로 멋진 자동로드 기능을 구현하는 데 사용됩니다.
예를 들어, OrganizationProductModelMyAwesomeModel 이라는 클래스를 만들었습니다. 네임 스페이스 컨벤션 (예 : {root}/organization/product/model/MyAwesomeModel.php )에 따른 디렉토리 구조에 파일을 넣으십시오. 수업에 전화해야 할 때 클래스를 직접 호출하여 수업을 호출하십시오. 어디서나 require 를 할 필요가 없습니다.
이전 (자동로드 사용하지 않음) :
<?php
require_once ( ' /organization/product/model/MyAwesomeModel.php ' );
use Organization Product Model MyAwesomeModel ;
$ object = new MyAwesomeModel()
// object gets created!후 (자동로드 사용) :
<?php
use Organization Product Model MyAwesomeModel ;
$ object = new MyAwesomeModel()
// object gets created! RXN의 기본 클래스에 대해서도 동일한 패턴이 존재합니다. 예를 들어, 응답 클래스 ( RxnFrameworkHttpResponse )는 {root}/rxn/api/controller 디렉토리에 있습니다. Autoloading은 RXN이 오버 헤드를 줄이는 여러 가지 방법 중 하나입니다.
다음 파일 확장은 자동로드 기능에 의해 지원됩니다 ( RxnFrameworkConfig 에서 사용자 정의 확장을 정의 할 수도 있습니다) :
RXN은 예외를 살고 호흡하며 먹습니다. 다음 코드 스 니펫을 고려하십시오.
try {
$ result = $ databse -> query ( $ sql , $ bindings );
} catch ( PDOException $ exception ) {
throw new Exception ( " Something went terribly wrong! " , 422 );
} 응용 프로그램의 어느 곳에서나 Exception 던지면 RXN은 자체 종료하고 프로세스 중 데이터베이스 트랜잭션을 롤백 한 다음 JSON을 사용하여 우아하게 응답합니다.
{
"_rxn" : {
"success" : false ,
"code" : 422 ,
"result" : "Unprocessable Entity" ,
"message" : "Something went terribly wrong!" ,
//...
}
} RXN을 사용한 백엔드의 예제 API 엔드 포인트는 다음과 같습니다.
https://yourapp.tld/v2.1/order/doSomething
어디:
v2.1 엔드 포인트 version 입니다order controller 입니다doSomething 은 컨트롤러의 action (공개 방법)입니다. 이제 id = 1234 의 요청에 키 값 get get key value 쌍을 추가하려면 PHP에서 일반적으로 다음을 수행합니다.
전에:
https://yourapp.tld/v2.1/order/someAction?id=1234
RXN에서는 전방 슬래시 ( / )를 분리기로 사용하여 URL에 키와 값을 넣어서이를 단순화 할 수 있습니다.
후에:
https://yourapp.tld/v2.1/order/someAction/id/1234
version , controller 및 action 후 홀수 매개 변수로 인해 오류가 발생합니다.
엔드 포인트 URL (예 : v1.1 , v2.4 등)을 버전하면 백엔드 엔드 포인트 동작을 변경할 때마다 우연히 프론트 엔드를 깨지 않을 것이라는 것을 쉽게 알 수 있습니다. 또한 버전화는 문서를 순서대로 유지하는 데 도움이됩니다. 프론트 엔드 개발자는 문서를 구축 할 수 있으며 모든 것이 효과가있을 것입니다.
따라서 버전 v2.1 의 엔드 포인트의 경우 첫 번째 숫자 ( 2 )는 컨트롤러 버전 이고 두 번째 숫자 ( 1 )는 작업 버전 입니다. 아래의 예는 ACTION 버전 1 사용하여 컨트롤러 버전 2 선언하는 방법입니다.
namespace Organization Product Controller v2 ;
class Order extends Rxn Framework Http Controller
{
public function doSomething_v1 () {
//...
}
}이를 통해 Frontend와 Backend 개발자 모두가 뒤처 질 수있는 유지 관리 가능하고 진실성 문서가 허용됩니다.
새로운 백엔드 아키텍처를 실험하고 탐색하고 싶습니까? 문제 없습니다. 데이터베이스 스키마가있는 한, 장난감과 함께 스캐 폴딩 API 제품군이 있습니다! 스캐 폴딩 엔드 포인트는 다음과 유사한 URI를 사용하여 액세스합니다 (버전 번호 대신 api 참고 사항).
https://yourapp.tld/api/order/create
https://yourapp.tld/api/order/read/id/{id}
https://yourapp.tld/api/order/update/id/{id}
https://yourapp.tld/api/order/delete/id/{id}
https://yourapp.tld/api/order/search
스캐 폴딩 API는 버전없는 API이며 프론트 엔드 개발자가 CRUD (Create, Read, Update) 작업 및 검색 형태로 백엔드에 대한 전체 액세스를 허용하도록 설계되었습니다. 그들의 주요 이점은 애플리케이션 개발 초기 단계에서 Crud 엔드 포인트를 수동으로 제작하는 데 많은 시간을 소비 할 필요가 없다는 것입니다. (요구 사항이 변경 될 때 이러한 초기 개발 단계이므로 상황이 끊임없이 유동적입니다.)
경고 : 스캐 폴딩 API는 버전이 없기 때문에 버전없는 API와 관련된 모든 문제를 상속합니다. 백엔드가 변경 되 자마자이 API도 변경됩니다. 이것은 잠재적으로 예상치 못한 또는 숨겨진 방식으로 응용 프로그램을 중단 할 수 있습니다. 이러한 이유로 개발 프로세스가 완료되면 버전없는 API를 버전없는 API로 전환하는 것이 현명합니다.
대부분의 사람들은 그것에 대해 생각하지 않고 어떤 형태의 종속성 주입을 연습하지만, 사실은 수동으로 의존성을 가진 클래스를 수동으로 인스턴스화하고 주입하는 것이 매우 큰 번거 로움이 될 수 있습니다. 다음 예제는 컨테이너 컨테이너를 통한 자동 종속성 주입의 이점을 입증하는 데 도움이됩니다.
이전 (수동 DI) :
// instantiate the dependencies
$ config = new Config ();
$ database = new Database ( $ config );
$ registry = new Registry ( $ config , $ database );
$ filecache = new Filecache ( $ config );
$ map = new Map ( $ registry , $ database , $ filecache );
// call the action method
$ this -> doSomething_v1 ( $ registry , $ database , $ map );
public function doSomething_v1 ( Registry $ registry , Database $ database , Map $ map ) {
$ customer = new Customer ( $ registry , $ database , $ map );
//...
}후 (DI 컨테이너 컨테이너 사용) :
// call the action method
$ this -> doSomething_v1 ( $ app -> container );
public function doSomething_v1 ( Container $ container ) {
$ customer = $ container -> get (Customer::class);
//...
}바라건대 당신은 혜택을 볼 수 있기를 바랍니다. RXN을 사용하면 매번 전제 조건을 인스턴스화 할 필요가 없습니다! 컨테이너 컨테이너를 사용하여 삶을 편하게 만들 수 있습니다.
DI 컨테이너 컨테이너는 파라미터로 필요한 클래스를 타이핑하고 Poof 는 귀하의 모든 종속성을 추측하고 자동로드 및 주입합니다. 지저분한 요구가 없습니다. 의존성을 수동으로 주입 할 필요가 없습니다!
전 (수동 인스턴스화) :
// require the dependencies
require_once ( ' /path/to/Config.php ' );
require_once ( ' /path/to/Collector.php ' );
require_once ( ' /path/to/Request.php ' );
public function doSomething_v1 () {
// instantiate the dependencies
$ config = new Config ();
$ collector = new Collector ( $ config );
$ request = new Request ( $ collector , $ config );
// grab the id from the request
$ id = $ request -> collectFromGet ( ' id ' );
//...
}후 (자동 인스턴스화 및 주입) :
public function doSomething_v1 ( Request $ request ) {
// grab the id from the request
$ id = $ request -> collectFromGet ( ' id ' );
//...
}차이를 보시겠습니까?