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 . Автозазагрузка - один из многих способов, которым 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!" ,
//...
}
} Пример конечной точки API для вашего бэкэнда с RXN может выглядеть так:
https://yourapp.tld/v2.1/order/doSomething
Где:
v2.1 - version конечной точкиorder - controllerdoSomething - это action контроллера (публичный метод) Теперь, если вы хотите добавить пару Get Key-Value в запрос, где id = 1234 , в 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 и т. Д.), Вы можете легко отдохнуть, зная, что не собираетесь случайно сломать свой фронт, когда вы изменяете поведение конечной точки бэкэнд. Кроме того, управление версиями также помогает сохранить вашу документацию в порядке; Разработчики Frontend могут просто создать документацию, и все будет работать .
Таким образом, для конечной точки с версией v2.1 первое число ( 2 ) является версией контроллера , а второе число ( 1 ) - версия действия . Приведенный ниже пример - как мы объявили версию контроллера 2 с помощью версии 1 :
namespace Organization Product Controller v2 ;
class Order extends Rxn Framework Http Controller
{
public function doSomething_v1 () {
//...
}
}Это позволяет поддерживать документацию по истинной реальности, которую могут отстоять как фронтальные, так и бэкэнд-разработчики.
Хотите поэкспериментировать и исследовать с новой бэкэнд -архитектурой? Нет проблем, если у вас есть схема базы данных, у вас есть набор 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 без версий и предназначены для того, чтобы позволить разработчикам Froderend полный доступ к бэкэнд в форме создания, чтения, обновления и удаления (CRUD) операций и поисков. Их главное преимущество заключается в том, что вам не нужно тратить кучу времени вручную на создание конечных точек 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 нет необходимости каждый раз экземпляры предпосылки! Используйте контейнер, чтобы упростить вашу жизнь.
Просто тип класса, который вам нужен в качестве параметра, и POOF , контейнер DI, контейнер DI угадает все зависимости для вас и автоматически загружать и вводить их. Нет грязного не требует. Вам не нужно вводить зависимости вручную!
До (ручная экземпляра):
// 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 ' );
//...
}Увидеть разницу?