Пишу про Go, Vim, и про то, как я медленно ползу в сторону FAANG.
С предложениями: @junsenpub
Post #215
1.07K
DE @junsenior
Showing posts older than #216 · Back to latest
Forwarded from PHP Digest
new в инициализаторах (и вложенные атрибуты);🔹 final константы в классах;never для (не)возвращаемых значений;0o;... поддерживает массивы со строковыми ключами;float в int, где теряется дробная часть;Serializable объявлен устаревшим;$GLOBALS;null в параметры встроенных функций, которые не nullable;#[ReturnTypeWillChange]);finfo, IMAP\Connection, FTP\Connection, PgSql\Connection, PgSql\Result.

service OrderService {
rpc createOrder(CreateOrderRequest) returns (CreateOrderReply) {}
rpc cancelOrder(CancelOrderRequest) returns (CancelOrderReply) {}
rpc reviseOrder(ReviseOrderRequest) returns (ReviseOrderReply) {}
}
message CreateOrderRequest {
int64 restaurantId = 1;
int64 consumerId = 2;
repeated LineItem lineItem = 3;
}
message LineItem {
string menuItemId = 1;
int32 quantity = 2;
}
message CreateOrderReply {
int64 orderId = 1;
}
Преимущества протокола gRPC:
* Он позволяет легко спроектировать API с богатым набором операций
* Он имеет эффективный компактный механизм IPC, что особенно явно проявляется при обмене крупными сообщениями
* Поддержка двунаправленных потоков
Недостатки:
* Для JS, например, процесс описания API на gRPC более трудоёмок, нежели для REST из-за особенностей типизации
* Старые брандмауэры не поддерживают HTTP/2services.yaml. Например, мы создали интерфейс, у коготорого есть 3 реализации. Массив реализаций нам нужно передать куда-то в конструктор. У нас есть autowiring, и мы хотим его использовать. Переходим в services.yaml:App\Service\SightingScorer:Где каждый из перечисленных классов реализует интерфейс
arguments:
$scoringFactors:
- '@App\Scoring\TitleFactor'
- '@App\Scoring\DescriptionFactor'
- '@App\Scoring\CoordinatesFactor'
ScoringFactorInterface.Kernel.php, там переопределяем метод build, и в нём добавляем одну строчку:protected function build(ContainerBuilder $container)Всё, после этого все реализации будут помечены тегом "scoring.factor", и в services.yaml нам достаточно один раз прописать:
{
parent::build($container);
$container->registerForAutoconfiguration(ScoringFactorInterface::class)
->addTag('scoring.factor');
}
App\Service\SightingScorer:Такой подход называется тегированный итератор, и о нём можно почитать более подробно: https://symfony.com/doc/current/service_container/tags.html
arguments:
$scoringFactors: !tagged_iterator scoring.factor
private iterable $scoringFactors;Очень крутая штука, как по мне. И, в теории, что-то подобное можно реализовать и для других языков и фреймворков.
public function __construct(iterable $scoringFactors)
{
$this->scoringFactors = $scoringFactors;
}
Организация, проектирующая системы, обречена воспроизводить архитектуру, имитирующую структуру собственных коммуникаций.