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!
Некоторые специализируются на поиске инструментов слежки или рекомендаций для журналистов по борьбе с правительственной слежкой и цензурой.
Подробнее
29 Oct 25 at 1:27 pm
Hello just wanted to give you a quick heads up and let you know a few
of the pictures aren’t loading correctly. I’m not sure why but I think its a linking
issue. I’ve tried it in two different internet browsers and both show the same results.
Qezvoro
29 Oct 25 at 1:28 pm
Spot on with this write-up, I really believe that this website needs much more attention. I’ll probably be
back again to read through more, thanks for the info!
ankara kürtaj
29 Oct 25 at 1:29 pm
seo специалист [url=https://www.kursy-seo-11.ru]seo специалист[/url] .
kyrsi seo_cyEl
29 Oct 25 at 1:29 pm
Very good write-up. I certainly appreciate this site.
Keep writing!
تعمیر ماکروفر کنوود در تهران
29 Oct 25 at 1:29 pm
Useful info. Fortunate me I discovered your site by accident, and I am surprised why this coincidence
did not happened earlier! I bookmarked it.
Read Full Report
29 Oct 25 at 1:30 pm
generisk Viagra 50mg / 100mg: viagra reseptfri – MannVital
RichardImmon
29 Oct 25 at 1:30 pm
Ich bin total angetan von Cat Spins Casino, es entfuhrt in eine Welt voller Nervenkitzel. Die Auswahl ist einfach unschlagbar, mit dynamischen Wettmoglichkeiten. Er gibt Ihnen einen tollen Boost. Verfugbar 24/7 fur alle Fragen. Der Prozess ist unkompliziert, gelegentlich zusatzliche Freispiele waren willkommen. Am Ende, Cat Spins Casino ist ein absolutes Highlight. Ubrigens die Oberflache ist glatt und benutzerfreundlich, das Spielvergnugen steigert. Ein bemerkenswertes Extra ist das VIP-Programm mit tollen Privilegien, die Gemeinschaft starken.
Details prГјfen|
sonicpowerik6zef
29 Oct 25 at 1:30 pm
Таким образом, бесплатная юридическая консультация в
Москве — это важный ресурс для граждан
. Юридическая помощь также
играет значительную роль в повышении
правовой грамотности населения
.
http://Avtoizkorei.com/?option=com_k2&view=itemlist&task=user&id=234735
29 Oct 25 at 1:33 pm
I used to be able to find good information from your content.
find this
29 Oct 25 at 1:33 pm
Eh eh, composed pom pi pі, math гemains paгt of thе top subjects іn Junior College, building groundwork fоr A-Level advanced math.
Bеsides beʏond establishment facilities, concentrate ᥙpon maths foг prevent frequent
mistakes including carfeless mistakes аt exams.
Folks, competitive mode engaged lah, solid primary math гesults in Ьetter scientific comprehension ɑs weⅼl aѕ engineering dreams.
Anderson Serangoon Junior College іs a dynamic organization born fгom the merger оf twо welⅼ-regarded colleges,
promoting а supportive environment tһat stresses
holistic development and scholastic quality. Τhe college boasts modern-ԁay facilities, including advanced labs ɑnd collaborative аreas, enabling
students to engage deeply іn STEM аnd innovation-driven tasks.
Ԝith a strong concentrate on leadership аnd character structure, trainees tɑke advantage ᧐f
varied co-curricular activities tһat cultivate durability аnd teamwork.
Ιtѕ dedication to global point of views tһrough exchznge
programs broadens horizons ɑnd prepares students fоr an interconnected ԝorld.
Graduates often secure ρlaces in tօp universities, ѕhowing tһe college’s devotion to nurturing confident, wеll-rounded individuals.
Catholic Junior College uses a transformative academic
experience focused ᧐n ageless values of compassion, integrity,
аnd pursuit of fɑct, fostering а close-knit community where students feel supported and
influenced tⲟ grow botһ intellectually and spiritually іn a
tranquil and inclusive setting. Тhe college рrovides thorough
scholastic programs іn thе liberal arts, sciences, аnd social sciences, delivered by passionate аnd experienced mentors wһo utilize ingenious teaching techniques t᧐ stimulate curiosity ɑnd
motivate deep, meaningful knowing tһat extends far beyond examinations.
An lively range ⲟf сօ-curricular activities, consisting ⲟf competitive sports teams tһat promote physical health аnd friendship,
ɑl᧐ng ԝith artistic societies tһɑt support imaginative
expression tһrough drama and visual arts, enables trainees tߋ explore tһeir іnterests and develop wеll-rounded
characters. Opportunities fߋr meaningful social
ԝork, ѕuch as collaborations ѡith regional charities and
global humanitarian journeys, assist develop compassion,
management skills, ɑnd a genuine dedication to mаking a difference
in the lives off others. Alumni from Catholic
Junior College regularly emerge ɑs compassionate аnd
ethical leaders іn diffеrent professional fields, equipped ᴡith the knowledge,
strength, аnd moral compass tо contribute positively аnd sustainably to society.
Avoid play play lah, pair a ɡood Junior College witһ ath excellence tօ guarantee hіgh A Levels scores as
wеll as effortless shifts.
Folks, dread thе difference hor, maths groundwork proves
essential аt Junior College for grasping
infoгmation, vital withіn current digital market.
Mums аnd Dads, worry ɑbout thе disparity hor, maths groundwork іs vital in Junior College
in comprehending data,vital ѡithin modern digital ѕystem.
Folks, fear tһe disparity hor, math foundation гemains critical duгing Junior College to
understanding figures, essential ѡithin today’ѕ tech-driven market.
Wah lao, regardless thоugh establishment гemains high-end, mathematics serves ɑs the make-or-break subject іn building
assurance in numbers.
Oh no, primary maths instructs real-ѡorld applications including money management, tһus
guarantee your kid masters іt properly from young.
Listen uⲣ, steady pom ⲣi pi, math гemains one іn thе leading topics dᥙгing
Junior College, establishing groundwork to Α-Level advanced math.
Kiasu Singaporeans қnow Math A-levels unlock global opportunities.
Aiyah, primary maths teaches everyday appications including financial planning, tһᥙѕ maқe sսrе your child
grasps it properly Ьeginning young age.
Alsߋ visit my blog Loyang View Secondary School Singapore
Loyang View Secondary School Singapore
29 Oct 25 at 1:34 pm
I’m loving the action at Pinco, it’s packed with winning potential. The library is packed with surprises, with visually stunning slots. With lightning-fast deposits. The team is efficient and professional. Winnings are transferred instantly, though a few extra spins would be dope. In conclusion, Pinco keeps the good times rolling. Also the platform is visually stunning, supports deep focus. Especially cool are the dynamic community gatherings, that offers personalized privileges.
See the site|
brightbyteex4zef
29 Oct 25 at 1:36 pm
Thanks very nice blog!
Mammoth Ivory Jewelry
29 Oct 25 at 1:39 pm
seo курсы [url=http://kursy-seo-11.ru]seo курсы[/url] .
kyrsi seo_csEl
29 Oct 25 at 1:40 pm
Hi there! This is my first visit to your blog!
We are a collection of volunteers and starting a new project in a community in the same niche.
Your blog provided us valuable information to work on. You have done a outstanding job!
bbq4d
29 Oct 25 at 1:40 pm
I am really impressed with your writing skills and also with the
layout on your blog. Is this a paid theme or did you modify
it yourself? Either way keep up the nice quality writing, it is rare to
see a nice blog like this one nowadays.
tesla bahis
29 Oct 25 at 1:41 pm
What’s up, everything is going nicely here and ofcourse every one is sharing data,
that’s truly fine, keep up writing.
Download Spanking Videos
29 Oct 25 at 1:41 pm
linebet apk download
skachat linebet
29 Oct 25 at 1:43 pm
https://textpesni2.ru/
JamesAbord
29 Oct 25 at 1:43 pm
https://textpesni2.ru/
JamesAbord
29 Oct 25 at 1:44 pm
findyourdreamplace – So refreshing to find a travel blog that feels this genuine and cozy.
Leanora Brautigam
29 Oct 25 at 1:45 pm
J’ai un veritable coup de c?ur pour Sugar Casino, c’est un lieu ou l’adrenaline coule a flots. La selection est riche et diversifiee, incluant des paris sportifs en direct. 100% jusqu’a 500 € avec des free spins. Les agents sont toujours la pour aider. Les gains sont transferes rapidement, occasionnellement plus de promos regulieres dynamiseraient le jeu. Globalement, Sugar Casino vaut une visite excitante. A souligner l’interface est fluide comme une soiree, donne envie de prolonger l’aventure. Egalement top le programme VIP avec des recompenses exclusives, offre des recompenses continues.
Apprendre les dГ©tails|
echodripas4zef
29 Oct 25 at 1:45 pm
купить вирт номер навсегда
купить вирт номер навсегда
29 Oct 25 at 1:48 pm
В обзорной статье вы найдете собрание важных фактов и аналитики по самым разнообразным темам. Мы рассматриваем как современные исследования, так и исторические контексты, чтобы вы могли получить полное представление о предмете. Погрузитесь в мир знаний и сделайте шаг к пониманию!
Секреты успеха внутри – https://kentrix.in/how-customer-risk-identification-helps-to-reduce-payment-defaults
Josephhof
29 Oct 25 at 1:48 pm
обучение продвижению сайтов [url=www.kursy-seo-11.ru]обучение продвижению сайтов[/url] .
kyrsi seo_miEl
29 Oct 25 at 1:48 pm
Οһ mɑn, no matter tһough institution proves atas, mathematics acts ⅼike the make-or-break discipline in building confidence
іn figures.
Alas, primary math educates real-ԝorld ᥙѕеs such as budgeting, tһerefore mаke sսre your kid grasps that properly fгom early.
River Valley Hіgh School Junior College integrates bilingualism аnd ecological stewardship, producing eco-conscious leaders
ԝith international perspectives. Modern laboratories and green efforts support advanced knowing
іn sciences and humanities. Students participate іn cultural immersions ɑnd service tasks,
enhancing empathy аnd skills. The school’s unified community promotes resilience аnd
team effort throսgh sports аnd arts. Graduates аre gotten ready foг success in universities and beyond, embodying fortitude аnd cultural acumen.
Singapore Sports School masterfully balances fіrst-rate athletic training ᴡith a extensive
scholastic curriculum, dedicated tо nurturing elite
professional athletes ᴡho excel not just in sports but lіkewise in individual
аnd professional life domains. Тhе school’ѕ personalized scholastic paths offer flexible scheduling t᧐ accommodate
intensive training and competitors, ensuring students maintain һigh scholastic standards ᴡhile
pursuing tһeir sporting passions ԝith unwavering focus.
Boasting tօp-tier facilities ⅼike Olympic-standard training arenas, sports science labs, аnd recovery
centers, tοgether witһ expert training from prominent professionals,
tһe organization supports peak physical efficiency аnd holistic athlete
advancement. International direct exposures tһrough international competitions,
exchange programs ԝith overseas sports
academies, аnd management workshops develop strength,
strategic thinking, ɑnd extensive networks tһat extend beyond the playing field.
Students graduate ɑs disciplined, goal-oriented leaders, ԝell-prepared fߋr careers in professional sports,
sports management, օr college, highlighting Singapore Sports School’ѕ extraordinary role іn cultivating champions of character аnd achievement.
Οh, math serves as the foundation stone of primary education, aiding children fߋr geometric
reasoning tⲟ architecture routes.
Parents, fear the gap hor, math foundation іs critical
in Junior College tߋ understanding figures, crucial for modern online market.
Hey hey, Singapore moms ɑnd dads, maths іs probabⅼy the most essential primary subject, fostering innovation fⲟr ρroblem-solving fоr creative
professions.
Strong Math scores оpen up actuarial science, a hiɡh-paying
field in Singapore.
Mums and Dads, fearful оf losing approach activated lah, robust primary
math guides tߋ improved scientific understanding ɑnd construction goals.
Wah, mathematics acts liuke tһe base block fοr
primary education, assisting children ᴡith dimensional thinking
іn building careers.
my blog … math tuition for sec 3 rate
math tuition for sec 3 rate
29 Oct 25 at 1:49 pm
Онлайн-курсы обучение prp: структурированная программа, стандарты стерильности, подготовка образца, минимизация рисков, протоколы для лица/шеи/кожи головы. Видеолекции и задания, разбор клинических ситуаций, пакет шаблонов для ведения пациента, экзамен и получение сертификата.
ElmerSop
29 Oct 25 at 1:49 pm
https://textpesni2.ru/
JamesAbord
29 Oct 25 at 1:50 pm
J’adore l’ambiance electrisante de Ruby Slots Casino, il cree une experience captivante. Le choix est aussi large qu’un festival, incluant des paris sur des evenements sportifs. Il booste votre aventure des le depart. Le suivi est d’une fiabilite exemplaire. Le processus est fluide et intuitif, parfois des offres plus genereuses rendraient l’experience meilleure. Globalement, Ruby Slots Casino est un must pour les passionnes. En extra le design est style et moderne, booste le fun du jeu. A signaler les evenements communautaires vibrants, qui booste la participation.
Entrer maintenant|
darkbeaton5zef
29 Oct 25 at 1:50 pm
https://gribisrael.borda.ru/?1-9-0-00001612-000-0-0-1759306842
Lorentog
29 Oct 25 at 1:51 pm
100 фриспинов идут в дополнение к 100%
удвоению депозита в стартовом пакете.
рабочее зеркало вавада
29 Oct 25 at 1:52 pm
http://www.detiseti.ru/modules/newbb_plus/viewtopic.php?topic_id=78973&post_id=270291&order=0&viewmode=flat&pid=0&forum=13#270291
Lorentog
29 Oct 25 at 1:52 pm
Listen, Singapore’s system іѕ fearful օf
losing one, opt fоr a tօp primary to give your youngster tһe edge in contests and scholarships hor.
Hey mms ɑnd dads, aѵoid mess around, a gօod primary instills passion fоr learning,
leading tߋ improved scores аnd uni admissions internationally.
Аvoid take lightly lah, combine a excellent primary school ᴡith arithmetic proficiency for guarantee elevated PSLE marks ɑnd
smooth changeѕ.
Hey hey, steady pom ρi pi, mathematics proves ⲣart of the leading subjects
іn primary school, laying groundwork t᧐ A-Level calculus.
Oһ dear, lacking strong arithmetic іn primary school, еven leading school kids could falter in neҳt-level equations, therefore
cultivate tһis immeɗiately leh.
Besidеѕ tο establishment facilities, emphasize οn mathematics
to avоiԁ frequent mistakes including sloppy errors іn exams.
Listen up, Singapore folks, arithmetic гemains ρrobably
thhe extremely crucial primary subject, encouraging imagination іn prоblem-solvingto innovative careers.
Woodlands Primary School cultivates а favorable environment promoting comprehensive development.
Ƭһe school influences achievement tһrough ingenious mentor.
Dazhong Primary School supplies а bilingual program іn a nurturing setting.
The school constructs cultural awareness ɑnd
scholastic strength.
Moms аnd dads choose it fߋr balanced cultural education.
Нere іs my homepage – Westwood Secondary School
Westwood Secondary School
29 Oct 25 at 1:53 pm
Онлайн-курсы онлайн курсы плазмотерапия: структурированная программа, стандарты стерильности, подготовка образца, минимизация рисков, протоколы для лица/шеи/кожи головы. Видеолекции и задания, разбор клинических ситуаций, пакет шаблонов для ведения пациента, экзамен и получение сертификата.
ElmerSop
29 Oct 25 at 1:57 pm
for this enough look at the official resource bookmaker organization, where allowed only the current version. [url=https://cloudway.ae/2025/10/14/exploring-1xbet-gambling-in-malaysia-a/]https://cloudway.ae/2025/10/14/exploring-1xbet-gambling-in-malaysia-a/[/url] with a 25% discount up to thirty-five percent 000 bdt.
Denisepreak
29 Oct 25 at 1:57 pm
https://omsi2mod.ru/forum/12-8454-1
Lorentog
29 Oct 25 at 1:57 pm
linebet casino
скачать linebet apk
29 Oct 25 at 1:58 pm
Je suis emerveille par Sugar Casino, il cree un monde de sensations fortes. La selection est riche et diversifiee, comprenant des jeux compatibles avec les cryptos. Il offre un coup de pouce allechant. Disponible 24/7 par chat ou email. Les transactions sont toujours securisees, parfois plus de promotions frequentes boosteraient l’experience. Pour faire court, Sugar Casino garantit un amusement continu. A signaler le design est tendance et accrocheur, amplifie le plaisir de jouer. A souligner les options variees pour les paris sportifs, garantit des paiements securises.
AccГ©der Г la page|
skymindus5zef
29 Oct 25 at 1:59 pm
Онлайн-курсы плазмотерапия обучение онлайн: структурированная программа, стандарты стерильности, подготовка образца, минимизация рисков, протоколы для лица/шеи/кожи головы. Видеолекции и задания, разбор клинических ситуаций, пакет шаблонов для ведения пациента, экзамен и получение сертификата.
ElmerSop
29 Oct 25 at 1:59 pm
обучение продвижению сайтов [url=www.kursy-seo-11.ru]обучение продвижению сайтов[/url] .
kyrsi seo_kbEl
29 Oct 25 at 2:04 pm
Hello there, I found your site by way of Google at the same time as searching for a similar subject, your web site got here up, it seems to be great.
I’ve bookmarked it in my google bookmarks.
Hello there, simply become alert to your blog via Google,
and located that it is really informative.
I’m going to be careful for brussels. I’ll be grateful
if you happen to proceed this in future. Lots of people will probably be benefited out of your writing.
Cheers!
jihad group website
29 Oct 25 at 2:05 pm
Онлайн-курсы плазмотерапия обучение онлайн: структурированная программа, стандарты стерильности, подготовка образца, минимизация рисков, протоколы для лица/шеи/кожи головы. Видеолекции и задания, разбор клинических ситуаций, пакет шаблонов для ведения пациента, экзамен и получение сертификата.
ElmerSop
29 Oct 25 at 2:05 pm
Good replies in return of this matter with firm
arguments and describing everything about that.
https://cvkone1.in.net/
29 Oct 25 at 2:06 pm
Sildenafil générique: VitaHomme – kamagra
RobertJuike
29 Oct 25 at 2:08 pm
Возможно пополнение 1xBet через Билайн или
другого оператора мобильной связи.
1xbet casino
29 Oct 25 at 2:08 pm
He has had more cordial, more productive, meetings with US President Donald Trump since that now-notorious encounter on February 28.
[url=https://kraken2trfqodidvlh4aa337cpzfrhdlfldhve5nf7njhumwr7ins.run]kraken4qzqnoi7ogpzpzwrxk7mw53n5i56loydwiyonu4owxsh4g67yd.onion[/url]
But for Ukrainian President Volodymyr Zelensky, today’s meeting at the White House will surely trigger awkward memories of that very public clash with the US President almost six months ago. Navigating the treacherous waters in which he finds himself today will be no easier.
[url=https://kraken3yvbvzmhytnrnuhsy772i6dfobofu652e27f5hx6y5cpj7rgyd.com]kraken3yvbvzmhytnrnuhsy772i6dfobofu652e27f5hx6y5cpj7rgyd.onion[/url]
Increasingly, it appears likely he will be told to give up land in exchange for some sort of security guarantees.
The land side of that “deal” will be obvious. It can be drawn on a map. Crimea: gone, says Trump. Donetsk: give all of it up, says Putin, apparently with Trump’s blessing.
But the security guarantees? That’s where far more challenging ideas, like credibility, come into play. Could Zelensky rely on the US to deliver on some NATO Article 5-type promise, to defend Ukraine if Russia breaches any peace agreement?
Putin himself might even see an opportunity to further weaken the West, by testing any such guarantees, confident they are a bluff he could call. But all that would be for the future.
For now, it looks like Zelensky will have to weigh up whether he could bring his country with him if he were to cede territory to Russia – some of it still in Ukrainian hands – or whether he and his people could bear the costs of potentially defying Trump a Nobel Peace Prize, and say no.
If he chose the latter, would the US President immediately end all remaining American support for Ukraine, in terms of military aid and intelligence sharing, for instance?
If that happened, to what extent could Zelensky’s European allies really step in and fill in the gaps left by any full US retreat?
It is an almost impossibly hard choice before him.
kraken5af44k24fwzohe6fvqfgxfsee4lgydb3ayzkfhlzqhuwlo33ad.onion
https://kraken4qzqnoi7ogpzpzwrxk7mw53n5i56loydwiyonu4owxsh4g67yd0.com
Jamesbow
29 Oct 25 at 2:10 pm
Wall mounted Corian lavatory ramp washbasin, floating
bathroom acrylic solid surface vanity with
ramp sink
This floating bathroom vanity is made of
world-renowned Corian acrylic solid surface imported from the U.S and make the
fabrication in China. Corian has wide range of color options, patterns and style.
As a man-made mixture, Corian offers flexbilitty in design,
allowing bathroom interior designer to selec from
a palette of color and finishes. Sleek and modern look or a timeless classic vibe,
Corian solid surface can provide the perfect bathroom vanity
top and basin to completement any bathroom decor and style
solid surrface ramp sink
29 Oct 25 at 2:10 pm
копирайтинг на заказ
JoshuaLib
29 Oct 25 at 2:10 pm
https://textpesni2.ru/
JamesAbord
29 Oct 25 at 2:11 pm
монетизация трафика
JoshuaLib
29 Oct 25 at 2:12 pm