PHP hook, building hooks in your application
Introduction
One of the real challenges in building any type of framework, core or application is making it possible for the developers to hook into the business logic at specific points. Since PHP is not event based, nor it works with interrupts you have to come up an alternative.
The test case
Lets assume we are the main developers of a webshop framework. Programmers can use our framework to build complete webshops. Programmers can manage the orders that are placed on the webshop with the order class. The order class is part of our framework and we don’t want it to be extended by any programmer. However we don’t want to limit to programmers in their possibilities to hook into the orders process.
For example programmers should be able to send an email to the webshopowner if an order changes from one specific delivery status to another. This functionality is not part of the default behavior in our framework and is custom for the progammers webshop implementation.
Like said before, PHP doesn’t provide interrupts or real events so we need to come up with another way to implement hooks into our application. Lets take a look at the observer pattern.
Implementing the Observer pattern
The observer pattern is a design-pattern that describes a way for objects to be notified to specific state-changes in objects of the application.
For the first implementation we can use SPL. The SPL provides in two simple objects:
SPLSubject
- attach (new observer to attach)
- detach (existing observer to detach)
- notify (notify all observers)
SPLObserver
- update (Called from the subject (i.e. when it’s value has changed).
iOrderRef = $iOrderRef;
// Get order information from the database or an other resources
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param SplObserver $oObserver
* @return void
*/
public function attach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param SplObserver $oObserver
* @return void
*/
public function detach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notify()
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function delete()
{
$this->notify();
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notify();
// ...
$this->iStatus = $iStatus;
// ...
$this->notify();
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements SplObserver
{
/**
* Previous orderstatus
* @var int
*/
protected $iPreviousOrderStatus;
/**
* Current orderstatus
* @var int
*/
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oSubject
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(SplSubject $oSubject)
{
if(!$oSubject instanceof Order) {
return;
}
if(is_null($this->iPreviousOrderStatus)) {
$this->iPreviousOrderStatus = $oSubject->getStatus();
} else {
$this->iCurrentOrderStatus = $oSubject->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oSubject->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attach(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->delete();
?>
There are several problems with the implementation above. To most important disadvantage is that we have only one update method in our observer. In this update method we don’t know when and why we are getting notified, just that something happened. We should keep track of everything that happens in the subject. (Or use debug_backtrace… just joking, don’t even think about using it that way ever!).
Taking it a step further, events
Lets take a look at the next example, we will extend the Observer implementation with some an additional parameter for the eventname that occured.
Finishing up, optional data
iOrderRef = $iOrderRef;
// Get order information from the database or something else...
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function attachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function detachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notifyObserver($sEvent, $mData=null)
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this, $sEvent, $mData);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function add($aOrder = array())
{
$this->notifyObserver('onAdd');
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notifyObserver('onBeforeUpdateStatus');
// ...
$this->iStatus = $iStatus;
// ...
$this->notifyObserver('onAfterUpdateStatus');
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements Observer_Interface
{
protected $iPreviousOrderStatus;
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oObservable
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(Observable_Interface $oObservable, $sEvent, $mData=null)
{
if(!$oObservable instanceof Order) {
return;
}
switch($sEvent) {
case 'onBeforeUpdateStatus':
$this->iPreviousOrderStatus = $oObservable->getStatus();
return;
case 'onAfterUpdateStatus':
$this->iCurrentOrderStatus = $oObservable->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oObservable->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attachObserver(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->add();
?>
Now we are able to take action on different events that occur.
Disadvantages
Although this implementation works quite well there are some drawbacks. One of those drawbacks is that we need to dispatch an event in our framework, if we don’t programmers can’t hook into our application. Triggering events everywhere give us a small performance penalty however I do think this way of working gives the programmers a nice way to hook into your application on those spots that you want them to hook in.
Just for the record
Notice that this code is just an example and can still use some improvements, for example: each observer is initialized even it will maybe never be notified, therefore I suggest to make use of lazy in some cases for loading the objects. There are other systems to hook into an application, more to follow!
https://www.zapolarye.ru/
Jameslox
25 Oct 25 at 11:53 am
kraken vk6
kraken вход
JamesDaync
25 Oct 25 at 11:55 am
Hey hey, composed pom pі рi, math proves ߋne in tһe highest disciplines іn Junior College, building foundation іn A-Level higher calculations.
Аpart beyond school resources, concentrate ԝith math for prevent common mistakes ⅼike
careless mistakes during assessments.
Anderson Serangoon Junior College іѕ a lively organization born fгom tһe merger of 2 well-regarded
colleges, promoting ɑn encouraging environment tһat highlights holistic development аnd
academic excellence. The college boasts modern-ɗay facilities, including cutting-edge labs ɑnd collaborative spaces, allowing trainees tⲟ engage
deeply іn STEM and innovation-driven tasks. Wіth a strong concentrate ᧐n leadership and character building, trainees benefit from varied ϲo-curricular activities tһаt cultivate durability ɑnd team effort.
Ιtѕ commitment tⲟ global viewpoints tһrough exchange programs broadens horizons
ɑnd prepares trainees fοr an interconnected ᴡorld.
Graduates frequently protected ρlaces iin tօp universities, reflecting tһe college’s commitment to supporting positive, ᴡell-rounded individuals.
Ꮪt. Andrew’s Junior College wеlcomes Anglican values tо promote
holistic development, cultivating principled individuals
ѡith robust character characteristics tһrough a blend of spiritual
assistance, academic pursuit, аnd neighborhood participation in a
warm and inclusive environment. Τhe college’s modern amenities, including interactive classrooms, sports complexes,
аnd imaginative arts studios, һelp with quality througһοut
academic disciplines, sports programs tһat highlight physical fitness and reasonable play, and creative
ventures tһat encourage ѕеlf-expression and innovation. Community service initiatives, ѕuch aѕ volunteer partnerships
with regional companies ɑnd outreach projects, impart compassion, social duty, ɑnd a sense
of purpose, enriching trainees’ academic journeys. Α diverse range
օf co-curricular activities, fгom argument
societies tօ musical ensembles, fosters team effort, leadership skills, ɑnd
personal discovery, permitting every student
to shine in thеіr picked аreas. Alumni ᧐f St.
Andrew’s Junior College regularly become ethical,
resilient leaders ԝho maҝe meaningful contributions tօ society, showing tһe organization’s profound influence
оn establishing well-rounded, ѵalue-driven people.
Aiyah, primary math instructs real-ᴡorld սѕes ѕuch as money management,
tһerefore mаke sure yoսr child ɡets tһis rigһt from young.
Eh eh, composed pom рі pі, math iѕ among оf the highest topics іn Junior College, establishing base in A-Level hіgher calculations.
Hey hey, steady pom pi pi, maths is among іn tһe top topics Ԁuring Junior College, building base
tⲟ A-Level calculus.
Besides to establishment facilities, concentrate ߋn mathematics in order
to stop frequent mistakes such аs sloppy errors dսring tests.
Parents, dread the difference hor, math foundation proves essential аt
Junior College іn comprehending informatіon, crucial ᴡithin modern online system.
Oһ man, no matter whether institution is high-еnd, maths acts ⅼike the decisive topic іn cultivates confidence with calculations.
Aiyah, primary math educates real-ᴡorld applications ⅼike budgeting, so makе ѕure
yoսr kid grasps tһat right from early.
Be kiasu аnd start eаrly; procrastinating іn JC leads to mediocre A-level resսlts.
Parents, fearful оf losing approach on lah, strong
primary maths leads fоr better science understanding аnd
tech aspirations.
Wow, mathematics serves аs the groundwork block in primary schooling, aiding kids with
geometric thinking fоr architecture paths.
mу web page … h2 math tuition bukit timah –odysseymathtuition.com
–
odysseymathtuition.com
25 Oct 25 at 11:59 am
kdjfjks.site – Navigation felt smooth, found everything quickly without any confusing steps.
Gilbert Gehler
25 Oct 25 at 12:03 pm
Ahaa, its fastidious discussion concerning this piece of writing at this place at this
website, I have read all that, so at this time me also commenting here.
amateur webcams
25 Oct 25 at 12:03 pm
Спасибо за выведение клопов! Всё чисто и безопасно.
уничтожение тараканов горячим туманом
KennethceM
25 Oct 25 at 12:05 pm
comprar Sildenafilo sin receta: farmacia confiable en España – Confia Farmacia
Jesuskax
25 Oct 25 at 12:05 pm
https://www.zapolarye.ru/
Jameslox
25 Oct 25 at 12:06 pm
Great information. Lucky me I came across your blog by accident
(stumbleupon). I have bookmarked it for later!
qqalfa138
25 Oct 25 at 12:06 pm
Нужна дезинфекция для автомобиля, посоветуйте.
уничтожение муравьев
KennethceM
25 Oct 25 at 12:06 pm
кракен vk2
kraken onion
JamesDaync
25 Oct 25 at 12:09 pm
binaryoptionstrade.xyz – Overall, professional vibe here; trustworthy, polished, and pleasantly minimal throughout.
Shirley Kolppa
25 Oct 25 at 12:11 pm
Encontrar el mejor casino onlline no siempre es
fácil.
Internet está lleno de páginas que dicen lo mismo, pero lo que realmente importa
es elegir sitios legales, que paguen rápido y ofrezcan un solorte que responda cuando lo necesites.
En esta guíacomparto mmi selección de los mejores casinos
online y los puntos clave que deberías tener
een cuenta antes de registrarte.
my blog – Casino Es Online
Casino Es Online
25 Oct 25 at 12:12 pm
WOW just what I was searching for. Came here by searching
for Pur Finrevoux
Pur Finrevoux
25 Oct 25 at 12:14 pm
кракен актуальная ссылка
кракен вход
JamesDaync
25 Oct 25 at 12:15 pm
eyelle-paris.com – Color palette felt calming, nothing distracting, just focused, thoughtful design.
Wally Lachut
25 Oct 25 at 12:15 pm
Hey just wanted to give you a quick heads up. The words in your post seem
to be running off the screen in Ie. I’m not sure if this is a format issue
or something to do with internet browser compatibility but I
thought I’d post to let you know. The layout look
great though! Hope you get the problem solved soon. Thanks
ankara kürtaj
25 Oct 25 at 12:16 pm
zakolata.xyz – Content reads clearly, helpful examples made concepts easy to grasp.
Garry Adels
25 Oct 25 at 12:18 pm
Поделитесь отзывами о дезинфекция после потопа! Как качество и цена?
дезинсекция цена
KennethceM
25 Oct 25 at 12:19 pm
https://zfit-sochi.ru/
Justinodons
25 Oct 25 at 12:19 pm
cryptocurrencytrade.pw – Content reads clearly, helpful examples made concepts easy to grasp.
Edgar Cliff
25 Oct 25 at 12:20 pm
https://www.zapolarye.ru/
Jameslox
25 Oct 25 at 12:21 pm
1xbet t?rkiye [url=https://1xbet-15.com/]1xbet t?rkiye[/url] .
1xbet_anpl
25 Oct 25 at 12:23 pm
Juggling the demands of the fiat and crypto ecosystems has always been a complex challenge for many in the GSA community.
The constant friction and opaque processes between fiat and
crypto platforms can severely compromise financial agility.
This is precisely why the Paybis fintech platform is
worth a closer look. They aren’t just another crypto exchange; they’ve built
a truly unified gateway that masterfully consolidates both fiat and cryptocurrency banking.
Imagine executing trades across USD, EUR, and a vast selection of
major digital assets—all from a single, secure dashboard.
Their focus on regulatory compliance means you can operate at scale.
A brief comment can’t possibly do justice to the full scope of their offerings, especially their advanced tools for high-volume traders.
To get a complete picture of how Paybis is solving the fiat-crypto problem, you absolutely need to
read the detailed analysis in the full article. It breaks down their
KYC process, supported regions, and API integration in a way that
is incredibly insightful. I highly recommend check out the piece to see if their platform aligns with your strategic
financial goals. It’s a fantastic deep-dive for anyone in our field looking to leverage modern fintech.
The link is in the main post—go give it
a read.
full review
25 Oct 25 at 12:24 pm
kraken сайт
kraken СПб
JamesDaync
25 Oct 25 at 12:24 pm
1xbet yeni giri? adresi [url=https://www.1xbet-10.com]https://www.1xbet-10.com[/url] .
1xbet_lhea
25 Oct 25 at 12:27 pm
mostbet baixar [url=https://www.mostbet12032.ru]https://www.mostbet12032.ru[/url]
mostbet_kg_nrmt
25 Oct 25 at 12:28 pm
В клинике применяются комплексные программы, охватывающие все стадии терапии. Такой подход позволяет обеспечить пациенту полный спектр помощи — от первой консультации до социальной адаптации.
Ознакомиться с деталями – [url=https://narcologicheskaya-klinika-omsk0.ru/]наркологическая клиника цены в омске[/url]
Michaelmoire
25 Oct 25 at 12:30 pm
officiële Sildenafil webshop [url=http://herengezondheid.com/#]goedkope Viagra tabletten online[/url] Heren Gezondheid
Davidduese
25 Oct 25 at 12:31 pm
kraken darknet
kraken ios
JamesDaync
25 Oct 25 at 12:32 pm
1x bet [url=http://www.1xbet-12.com]http://www.1xbet-12.com[/url] .
1xbet_geSr
25 Oct 25 at 12:35 pm
Link exchange is nothing else but it is only placing
the other person’s website link on your page at proper place and other person will also do similar for you.
### Article 6: Navigating US Fashion Trends Through Yupoo.website Promotion
Understanding and promoting US fashion trends is simplified with Yupoo.website,
a B2B2C platform for wholesale branded goods since Yupoo’s 2006
start.
Trends like athleisure shoes, minimalist bags, smart-casual watches, sustainable clothing,
and themed soccer jerseys are highlighted.
Promotion strategies include trend reports distributed via newsletters, drawing
in retailers.
Social media challenges, encouraging users to style Yupoo-sourced items, create buzz.
Influencer collaborations for trend-focused hauls promote the site organically.
SEO content on “2025 US Fashion via Yupoo” improves rankings.
Webinars on trend forecasting using the platform engage professionals.
Direct WhatsApp marketing for trend alerts personalizes promotion.
By aligning promotion with trends, Yupoo.website becomes indispensable for fashion-forward
businesses.
(Word count: 498)
### Article 7: Building a Successful Wholesale Business
with Yupoo.website
Yupoo.website empowers entrepreneurs to build thriving wholesale businesses
in fashion, offering shoes, bags, watches, clothing, and jerseys through its B2B2C framework.
Since 2006, it has provided visual albums for easy sourcing.
Promotion tips: Use LinkedIn for B2B networking, sharing success stories.
Create podcasts discussing “Wholesale Wins with Yupoo.”
Targeted ads on fashion forums highlight unique offerings.
Customer loyalty programs, like discounts for referrals, boost promotion.
Integrate with e-commerce tools for seamless sales.
The site’s global network and trend insights ensure business scalability.
Promoting Yupoo.website means promoting growth for all users.
(Word count: 501)
YUPOO China Sellers Wholesale Supplier soccer Venezia jerseys, add our whatsapp | YUPOO
website
25 Oct 25 at 12:35 pm
1 xbet [url=www.1xbet-16.com/]1 xbet[/url] .
1xbet_nwOn
25 Oct 25 at 12:35 pm
kraken зеркало
kraken вход
JamesDaync
25 Oct 25 at 12:38 pm
Read the Full Version: https://alhudapk.com
SamuelTauro
25 Oct 25 at 12:41 pm
Details at the Link: https://billi-walker.jp
PhillipJat
25 Oct 25 at 12:42 pm
Full Version Here: https://strannik36.ru
DanielIllup
25 Oct 25 at 12:42 pm
kraken vk2
kraken сайт
JamesDaync
25 Oct 25 at 12:42 pm
The directives largely roll back efforts made over the last decade attempting to eradicate toxic culture in the military, both to decrease harmful behaviors like harassment, but also to meet practical needs of getting people in uniform and keeping them there longer as the military branches faced years of struggles filling the ranks.
[url=https://sefy.ru/kra41at.html]kra46[/url]
Many major reforms were described by the officials who implemented them as driven by that need; when former Defense Secretary Ash Carter opened up combat roles to women in 2015, he said the military “cannot afford to cut ourselves off from half the country’s talents and skills” if it wanted to succeed in national defense.
[url=https://kra-42.ru]kra42 сс[/url]
And while the military had made changes in recent years in an attempt to lessen instances of harassment, discrimination or toxic leadership by creating reporting mechanisms so that troops would come forward, Hegseth said those efforts went too far and were undercutting commanders.
“The definition of ‘toxic’ has been turned upside down, and we’re correcting that,” Hegseth vowed on Tuesday, adding that the Defense Department would be undertaking a review of words like “hazing” and “bullying” which he said had been “weaponized.”
kra49
https://sefy.ru/kra41at.html
ClydeBlomo
25 Oct 25 at 12:45 pm
The Oktoberfest beer festival in Munich will remain shut on Wednesday until at least 5 pm (1500 GMT) after police said they discovered explosives in a residential building in the north of the city that caught fire and left one person dead.
[url=https://kra39сc-c.ru]kra40[/url]
As part of a major operation that police earlier said posed no danger to the public, special forces were investigating an area in the north of Munich where Bild newspaper and multiple other reports said shots and explosions had been heard.
[url=https://at-kra37cc.ru]kra41 at[/url]
Police said the residential building had been deliberately set on fire in a family dispute and one person who was found there had died and another was missing, but not believed to be in danger.
[url=https://at-kra40cc.ru]kra39 сс[/url]
Special forces had to be brought in to defuse booby traps found in the building, according to police.
“We are currently investigating all possibilities. Possible connections to other locations in Munich are being examined, including the Theresienwiese (where the Oktoberfest is located),” said Munich police on the WhatsApp messaging service.
“For this reason, the opening of the festival grounds has been delayed,” police added.
kra39 cc
https://at-kra41cc.ru
Rodneynen
25 Oct 25 at 12:47 pm
The scale of these recent attacks means Ukraine needs any help it can get to minimize the impacts – and volunteers are playing an increasingly important role in the defensive mix.
[url=https://at-kra41.cc ]kra47[/url]
Civilians are forming units tasked with shooting down smaller drones with machine guns or, most recently, specially developed interceptor drones.
[url=https://kra40.at-kra40.cc ]kra46[/url]
The chief of staff of one of Kyiv’s volunteer formation legions, Andriy, whose call-sign is Stolyar, said his unit is composed of people from all walks of life – from construction workers to businessmen to poets.
He told CNN the training for his legion lasts for about six weeks and includes basic knowledge, simulator practice and topography lessons. Andriy asked for his last name not to be published for security reasons.
“A person must understand how to operate an aircraft. Drones are becoming increasingly complex – this is aviation, and it requires constant attention, knowledge, and skills,” he said.
kra49 сс
https://kra47.net
Edwardheicy
25 Oct 25 at 12:47 pm
1xbet g?ncel adres [url=http://1xbet-13.com/]1xbet g?ncel adres[/url] .
1xbet_lvKa
25 Oct 25 at 12:47 pm
кракен vk3
кракен онион
JamesDaync
25 Oct 25 at 12:47 pm
дезинфекция медицинских учреждений с гарантией – это важно, нашли такую фирму.
дератизация
KennethceM
25 Oct 25 at 12:48 pm
Вызывали санобработка предприятий ночью, приехали быстро!
дезинфекция после животного
KennethceM
25 Oct 25 at 12:49 pm
The directives largely roll back efforts made over the last decade attempting to eradicate toxic culture in the military, both to decrease harmful behaviors like harassment, but also to meet practical needs of getting people in uniform and keeping them there longer as the military branches faced years of struggles filling the ranks.
[url=https://zhong-yao.ru/kra42cc.html]kra49[/url]
Many major reforms were described by the officials who implemented them as driven by that need; when former Defense Secretary Ash Carter opened up combat roles to women in 2015, he said the military “cannot afford to cut ourselves off from half the country’s talents and skills” if it wanted to succeed in national defense.
[url=https://ckmosstroy.ru/]kra49 сс[/url]
And while the military had made changes in recent years in an attempt to lessen instances of harassment, discrimination or toxic leadership by creating reporting mechanisms so that troops would come forward, Hegseth said those efforts went too far and were undercutting commanders.
“The definition of ‘toxic’ has been turned upside down, and we’re correcting that,” Hegseth vowed on Tuesday, adding that the Defense Department would be undertaking a review of words like “hazing” and “bullying” which he said had been “weaponized.”
kra44 cc
https://kra–43-cc.ru/kra40.cc
ClydeBlomo
25 Oct 25 at 12:49 pm
купить диплом о среднем образовании [url=https://www.educ-ua7.ru]https://www.educ-ua7.ru[/url] .
Diplomi_axea
25 Oct 25 at 12:50 pm
The scale of these recent attacks means Ukraine needs any help it can get to minimize the impacts – and volunteers are playing an increasingly important role in the defensive mix.
[url=https://at-kra48.cc ]kra48 at[/url]
Civilians are forming units tasked with shooting down smaller drones with machine guns or, most recently, specially developed interceptor drones.
[url=https://kra47-at.cc ]kra47 at[/url]
The chief of staff of one of Kyiv’s volunteer formation legions, Andriy, whose call-sign is Stolyar, said his unit is composed of people from all walks of life – from construction workers to businessmen to poets.
He told CNN the training for his legion lasts for about six weeks and includes basic knowledge, simulator practice and topography lessons. Andriy asked for his last name not to be published for security reasons.
“A person must understand how to operate an aircraft. Drones are becoming increasingly complex – this is aviation, and it requires constant attention, knowledge, and skills,” he said.
kra47 сс
https://kra45-at.cc
Edwardheicy
25 Oct 25 at 12:51 pm
диплом о высшем образовании купить с занесением в реестр [url=http://www.frei-diplom2.ru]диплом о высшем образовании купить с занесением в реестр[/url] .
Diplomi_hdEa
25 Oct 25 at 12:51 pm
Ich habe eine Leidenschaft fur Snatch Casino, es ladt zu unvergesslichen Momenten ein. Die Auswahl ist so gro? wie ein Casino-Floor, mit Slots in modernem Look. 100 % bis zu 500 € inklusive Freispiele. Der Service ist immer zuverlassig. Auszahlungen sind einfach und schnell, in manchen Fallen mehr Aktionen wurden das Erlebnis steigern. Abschlie?end, Snatch Casino bietet ein unvergleichliches Erlebnis. Ubrigens ist das Design stilvoll und einladend, zum Verweilen einladt. Ein bemerkenswertes Extra sind die schnellen Krypto-Transaktionen, kontinuierliche Belohnungen bieten.
snatch-casino.de|
blazesnakein1zef
25 Oct 25 at 12:52 pm