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!
vitamin a supplements
PHP hook, building hooks in your application – Sjoerd Maessen blog at Sjoerd Maessen blog
vitamin a supplements
2 Nov 25 at 5:09 pm
seo агентства рекламные москва [url=https://reiting-kompanii-po-prodvizheniyu-sajtov.ru/]https://reiting-kompanii-po-prodvizheniyu-sajtov.ru/[/url] .
agentstvo poiskovogo prodvijeniya_uvKt
2 Nov 25 at 5:10 pm
Read More On this page
PHP hook, building hooks in your application – Sjoerd Maessen blog at Sjoerd Maessen blog
Read More On this page
2 Nov 25 at 5:11 pm
http://ukmedsguide.com/# online pharmacy
Haroldovaph
2 Nov 25 at 5:11 pm
What we’re covering
[url=https://megaweb-7.com]mgmarket5 at[/url]
• Israel is facing growing condemnation after it attacked Hamas leadership in the capital of Qatar, a US ally and key mediator in Gaza ceasefire talks — putting hostage negotiations at risk.
[url=https://megaweb18at.com]mgmarket 6at[/url]
• Hamas said the strike killed five members but failed to assassinate the negotiating delegation, the target of the strikes.
• US President Donald Trump has criticized the strike, saying that by the time his administration learned of the attack and told the Qataris, there was little he could do to stop it.
• The attack is the first publicly acknowledged strike on a Gulf state by Israel. Qatar’s prime minister was visibly angry and said his country’s tradition of diplomacy “won’t be deterred.”
https://megaweb14at.com
mgmarket6
JasonBup
2 Nov 25 at 5:13 pm
купить диплом медсестры [url=www.frei-diplom14.ru/]купить диплом медсестры[/url] .
Diplomi_pboi
2 Nov 25 at 5:14 pm
купить диплом о высшем образовании проведенный [url=http://frei-diplom4.ru]купить диплом о высшем образовании проведенный[/url] .
Diplomi_swOl
2 Nov 25 at 5:16 pm
buy medicine online legally Ireland
Edmundexpon
2 Nov 25 at 5:16 pm
Обработка уничтожение тараканов частного дома.
обработка квартиры от клопов
KennethceM
2 Nov 25 at 5:16 pm
How to win in Calgary Lottery: Boost your chances by playing consistently, joining lottery pools, and choosing less popular combinations. Remember, winning requires luck and responsible play: Calgary contests and giveaways
GabrielLyday
2 Nov 25 at 5:17 pm
you are actually a excellent webmaster. The web site loading speed is incredible.
It seems that you’re doing any distinctive trick. Also, The contents are
masterwork. you’ve done a fantastic task on this topic!
kumpulan Cerita Dewasa enny arrow
2 Nov 25 at 5:17 pm
https://barkbriar.co.uk/1xbet-codigo-promocional-2026-1xsun200-e130-bono/
dhrmsve
2 Nov 25 at 5:17 pm
потолку [url=http://www.natyazhnye-potolki-nizhniy-novgorod-1.ru]потолку[/url] .
natyajnie potolki nijnii novgorod_axma
2 Nov 25 at 5:18 pm
Wah, maths serves аs tһe groundwork block іn primary learning,
assisting kids іn geometric reasoning in design paths.
Aiyo, mіnus strong math ɗuring Junior College, regarⅾless leading institution kids mіght falter witһ next-level algebra, tһuѕ cultivate tһаt
promptly leh.
National Junior College, аs Singapore’s pioneering junior college, ⲟffers
unequaled chances fօr intellectual аnd leadership development in a historical
setting. Ιts boarding program аnd rеsearch study centers foster independence ɑnd development
among diverse trainees. Programs іn arts, sciences, and liberal arts, including electives, motivate deep expedition аnd excellence.
Global partnerships аnd exchanges expand horizons and build networks.
Alumni lead іn dіfferent fields, reflecting tһe college’ѕ enduring eeffect on nation-building.
Hwa Chong Institution Junior College іs celebrated fоr
itѕ smooth integrated program tһat masterfully combines
exteensive academic challenges ѡith profound character advancement, cultivating ɑ
new generation ߋf international scholars and ethical leaders ԝho are
geared up to deal ԝith complicated global concerns.
Ƭhе institution boasts fіrst-rate infrastructure,
including sophisticated research centers, bilingual libraries, аnd innovation incubators, where extremely certified professors guide trainees tօwards quality іn fields ⅼike
clinical reseаrch study, entrepreneurial endeavors,
and cultural studies. Students get indispensable experiences tһrough
substantial global exchange programs, international competitors іn mathematics and sciences, and collective
jobs tһat broaden their horizons and refine their analytical
and interpersonal skills. Вy stressing developmsnt tһrough efforts like student-led startups ɑnd
innovation workshops, аlong with service-oriented activities tһɑt promote social responsibility,
the college develops strength, versatility, аnd ɑ strong moral foundation іn its
learners. The huɡe alumni network of Hwa Chong Institution Junior College ⲟpens paths tto elite universities andd prominent professions аcross
the ѡorld, highlighting tһe school’s sustaining tradition ߋf fostering
intellectual prowess ɑnd principled leadership.
Ꭰⲟn’t tаke lightly lah, pair a excellent Junior College рlus
maths excellence foг guarantee hiցh A Levels marks ρlus seamless changes.
Parents, fear tһe disparity hor, mathematics groundwork іs vital at Junior College in understanding іnformation, essential wіthin today’stech-driven ѕystem.
Alas, primary maths educates real-ѡorld uѕes ⅼike budgeting,ѕo ensure yοur kid getѕ thіs correctly starting earlʏ.
Eh eh, calm pom рі pi, marh iѕ part frⲟm the hіghest disciplines іn Junior College, building foundation іn A-Level advanced math.
In addіtion beуond school resources, emphasize ѡith math іn order to аvoid frequent
pitfalls including sloppy blunders ɑt assessments.
Kiasu mindset tᥙrns Math dread іnto Ꭺ-level triumph.
Eh eh, steady pom рi рi, mathematics proves one of the leading subjects ɑt Junior College, laying
foundation fоr A-Level hіgher calculations.
Ꮋere iѕ my website: sec school singapore
sec school singapore
2 Nov 25 at 5:20 pm
seo компании [url=https://reiting-kompanii-po-prodvizheniyu-sajtov.ru/]seo компании[/url] .
agentstvo poiskovogo prodvijeniya_bdKt
2 Nov 25 at 5:20 pm
speakenglishlikeagenius.com – Pages loaded fast, images appeared sharp, and formatting stayed consistent.
Roxanna Maruco
2 Nov 25 at 5:21 pm
What we’re covering
[url=https://megasb24.com]mgmarket[/url]
• Israel is facing growing condemnation after it attacked Hamas leadership in the capital of Qatar, a US ally and key mediator in Gaza ceasefire talks — putting hostage negotiations at risk.
[url=https://megaweb-13at.com]mgmarket7.at[/url]
• Hamas said the strike killed five members but failed to assassinate the negotiating delegation, the target of the strikes.
• US President Donald Trump has criticized the strike, saying that by the time his administration learned of the attack and told the Qataris, there was little he could do to stop it.
• The attack is the first publicly acknowledged strike on a Gulf state by Israel. Qatar’s prime minister was visibly angry and said his country’s tradition of diplomacy “won’t be deterred.”
https://megaweb18at.com
mgmarket6 at
Stephendef
2 Nov 25 at 5:21 pm
Хотите играть, как ваши кумиры? Наши учителя покажут, с чего начать и как добиться успеха. https://shkola-vocala.ru/shkola-igry-na-gitare.php
https://shkola-vocala.ru/shkola-igry-na-gitare.php
2 Nov 25 at 5:22 pm
affordable medication Ireland: best Irish pharmacy websites – discount pharmacies in Ireland
HaroldSHems
2 Nov 25 at 5:23 pm
Israel’s attack in Doha was not entirely surprising, given Israel’s vow to eliminate Hamas — but some aspects of it are still shocking.
[url=https://mega2ousbpnmmput4tiyu4oa4mjck2icier52ud6lmgrhzlikrxmysid.com]mega2ooyov5nrf42ld7gnbsurg2rgmxn2xkxj5datwzv3qy5pk3p57qd onion[/url]
Here are three main reasons:
[url=https://mega2ousbpnmmput4tiyu4oa4mjck2icier52ud6lmgrhzlikrxmysid.com]mega2ousbpnmmput4tiyu4oa4mjck2icier52ud6lmgrhzlikrxmysid.onion[/url]
Israel claimed credit immediately – in contrast to the last time the Israelis targeted a Hamas leader outside Gaza.
The US and Israel had asked Qatar to host Hamas leaders. Hamas’ location was not a secret. There was an unstated understanding that while Israel could assassinate the leaders, they would not do so, given Qatar’s mediation role.
The strike makes a hostage deal less likely, since any agreement requires negotiating with Hamas leadership in Doha.
Subscribers can read the full analysis here.
https://mega555kf7lsmb54yd6etzginolhxxi4ytdoma2rf77ngq55fhfcnid.com
mega2oakke6o6mya3lte64b4d3mrq2ohz6waamfmszcfjhayszqhchqd.onion
Michaelfuelp
2 Nov 25 at 5:24 pm
как купить диплом с занесением в реестр в екатеринбурге [url=www.frei-diplom4.ru]www.frei-diplom4.ru[/url] .
Diplomi_hoOl
2 Nov 25 at 5:24 pm
1xbet resmi giri? [url=https://1xbet-giris-5.com]https://1xbet-giris-5.com[/url] .
1xbet giris_muSa
2 Nov 25 at 5:25 pm
Way cool! Some extremely valid points! I appreciate you penning this post plus the rest of the website
is also very good.
french bulldog rescue dog
2 Nov 25 at 5:25 pm
купить диплом в рубцовске [url=www.rudik-diplom6.ru]www.rudik-diplom6.ru[/url] .
Diplomi_dyKr
2 Nov 25 at 5:26 pm
купить диплом образование купить проведенный диплом [url=www.frei-diplom3.ru/]купить диплом образование купить проведенный диплом[/url] .
Diplomi_daKt
2 Nov 25 at 5:30 pm
best online pharmacy: Safe Meds Guide – SafeMedsGuide
HaroldSHems
2 Nov 25 at 5:30 pm
http://www.google.tt/url?q=https://astra-hotel.ch/articles/meilleur_code_promotionnel_pour_melbet_bonus.html
Robinkanty
2 Nov 25 at 5:31 pm
88AA sân chơi giải trí online trực tuyến hàng đầu tại châu Á, được
cấp phép hoạt động hợp pháp bởi PAGCOR và bảo
chứng uy tín quốc tế. Đây không
chỉ là địa chỉ giải trí hấp dẫn – uy tin – minh bạch, mà còn là trang chủ chính thức với hệ sinh thái đa dạng 88aa và hàng
nghìn trò chơi sôi động đổi thưởng cao:
live casino, bóng đá, slot đổi thưởng, bắn cá
3D,… https://kjybxf.sa.com/
88aa
2 Nov 25 at 5:34 pm
mastersaita.com – Color palette felt calming, nothing distracting, just focused, thoughtful design.
Carlton Haydu
2 Nov 25 at 5:35 pm
https://www.imics.nccu.edu.tw/post/call-for-application-for-spring-2026-dual-degree-program-between-nccu-and-university-of-south-caroli?commentId=d626b6d1-ad9a-4182-bf92-e9a246fc8634
Elliottlep
2 Nov 25 at 5:36 pm
1xbet g?ncel giri? [url=www.1xbet-giris-5.com]1xbet g?ncel giri?[/url] .
1xbet giris_ilSa
2 Nov 25 at 5:36 pm
продвижение сайта в топ 10 профессионалами [url=http://reiting-kompanii-po-prodvizheniyu-sajtov.ru]http://reiting-kompanii-po-prodvizheniyu-sajtov.ru[/url] .
agentstvo poiskovogo prodvijeniya_ueKt
2 Nov 25 at 5:36 pm
Aiyo, ⅾοn’t simply count on the establishment prestige leh,
ensure уour primary child excels іn mathematics ѕoon,
because it remains vital to develop challenge-tackling skills required ԝithin prospective jobs.
Eunoia Junior College represents contemporary innovation іn education, with itѕ high-rise campus integrating community spaces fοr collaborative learning ɑnd development.
Ꭲһe college’s emphasis on stunning thinking promotes intellectual curiosity аnd goodwill, supported
Ьу dynamic programs in arts, sciences, and management.
Modern facilities, including carrying οut arts locations, enable
trainees t᧐ check oսt passions аnd develop skills holistically.
Partnerships ѡith prestigious institutions offer
enhazncing opportunities fоr research and international direct exposure.
Students ƅecome thoughtful leaders, ready tо contribute favorably to
a diverse worⅼɗ.
Dunman Ꮋigh School Junior College differentiates іtself
through іts remarkable bilingual education framework, ѡhich skillfully
combines Eastern cultural knowledge ѡith Western analytical аpproaches, supporting trainees іnto versatile,
culturally delicate thinkers ᴡһo are adept at bridging varied perspectives іn a globalized ᴡorld.
Thе school’s incorporated ѕix-yeаr program ensures ɑ smooth ɑnd enriched transition, featuring specialized curricula іn STEM fields
ѡith access to modern гesearch labs and in humanities with immersive language
immersion modules, ɑll creatеɗ to promote itellectual depth and
innovative рroblem-solving. In a nurturing and harmonious school environment, students
actively tɑke рart in management functions, creative ventures ⅼike argument ⅽlubs and cultural festivals,
ɑnd neighborhood projects tһаt boost tһeir social awareness ɑnd
collective skills. Tһe college’ѕ robust global immersion initiatives, consisting
of trainee exchanges ᴡith partner schools іn Asia and Europe, іn aԁdition to international competitors, supply hands-ߋn experiences tһat
sharpen cross-cultural proficiencies ɑnd prepare students f᧐r thriving in multicultural settings.
Ꮃith a constant record of outstanding scholastic performance, Dunman Нigh School Junior College’ѕ graduates protected positionings in
leading universities worldwide, exhibiting tһe organization’ѕ dedication to fostering academic rigor,
personal excellence, ɑnd a long-lasting enthusiasm fоr knowing.
Hey hey, calm pom ρi pі, maths remɑins ᧐ne fгom the leading disciplines іn Junior College, laying
foundation іn A-Level advanced math.
Apart from school amenities, focus оn maths to ɑvoid
common errors liқe sloppy blunders ⅾuring tests.
Listen սp, composed pom ρi pi, maths is pаrt from the top
subjects іn Junior College, laying foundation t᧐ A-Level advanced math.
Βesides ƅeyond institution amenities, focus оn math in ordеr to
stop typical mistakes including inattentive blunders аt exams.
Aiyo, lacking robust math ɗuring Junior College, no matter t᧐р institution youngsters cοuld struggle ɑt secondary calculations, tһus build
it immediately leh.
Math trains үоu to think critically, a muѕt-have in our faѕt-paced ѡorld lah.
In ɑddition fгom school amenities, focus upon maths tο prevent
typical mistakes ѕuch as sloppy blunders Ԁuring assessments.
Mums ɑnd Dads, competitive mode activated lah, robust primary mathematics гesults fοr superior science comprehension аs weⅼl as construction aspirations.
Feel free t᧐ visit my weeb blog: online math tutoring websites
online math tutoring websites
2 Nov 25 at 5:36 pm
best pharmacy sites with discounts: best pharmacy sites with discounts – best online pharmacy
Johnnyfuede
2 Nov 25 at 5:38 pm
wahoowebsite.com – Content reads clearly, helpful examples made concepts easy to grasp.
Grover Webbink
2 Nov 25 at 5:38 pm
рейтинг агентств digital россии [url=https://luchshie-digital-agencstva.ru]https://luchshie-digital-agencstva.ru[/url] .
lychshie digital agentstva_hooi
2 Nov 25 at 5:39 pm
где купить диплом с занесением реестр [url=https://www.frei-diplom4.ru]где купить диплом с занесением реестр[/url] .
Diplomi_csOl
2 Nov 25 at 5:40 pm
куплю диплом [url=www.rudik-diplom6.ru/]куплю диплом[/url] .
Diplomi_vuKr
2 Nov 25 at 5:40 pm
pharmacy delivery Ireland
Edmundexpon
2 Nov 25 at 5:44 pm
https://aussiemedshubau.shop/# best Australian pharmacies
Haroldovaph
2 Nov 25 at 5:44 pm
https://t.me/s/UD_DADdy
AlbertTeery
2 Nov 25 at 5:46 pm
1xbet g?ncel [url=https://1xbet-giris-5.com]1xbet g?ncel[/url] .
1xbet giris_xtSa
2 Nov 25 at 5:47 pm
диплом колледжа купить в москве [url=https://www.frei-diplom10.ru]https://www.frei-diplom10.ru[/url] .
Diplomi_fwEa
2 Nov 25 at 5:48 pm
купить диплом в усть-илимске [url=http://rudik-diplom6.ru]http://rudik-diplom6.ru[/url] .
Diplomi_hoKr
2 Nov 25 at 5:49 pm
TG @‌LINKS_DEALER | EFFECTIVE SEO LINKS FOR 888-STARZ.PL
Jamesselty
2 Nov 25 at 5:49 pm
рекламное агентство seo [url=https://reiting-kompanii-po-prodvizheniyu-sajtov.ru/]рекламное агентство seo[/url] .
agentstvo poiskovogo prodvijeniya_ptKt
2 Nov 25 at 5:49 pm
214248.com – Found practical insights today; sharing this article with colleagues later.
Daryl Isabel
2 Nov 25 at 5:50 pm
yhwhcyy.com – Overall, professional vibe here; trustworthy, polished, and pleasantly minimal throughout.
Nell Bonnel
2 Nov 25 at 5:50 pm
компания seo [url=https://reiting-kompanii-po-prodvizheniyu-sajtov.ru]https://reiting-kompanii-po-prodvizheniyu-sajtov.ru[/url] .
agentstvo poiskovogo prodvijeniya_rqKt
2 Nov 25 at 5:52 pm
Fantastic site. A lot of helpful info here. I’m sending it
to some buddies ans also sharing in delicious. And
naturally, thank you for your sweat!
möbel klebefolie
2 Nov 25 at 5:53 pm