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!
онлайн накрутка подписчиков тг
JohnnyPhido
19 Sep 25 at 5:07 am
You should take part in a contest for one of the greatest sites on the web.
I will highly recommend this site!
perbandingan drama Korea lama dan baru
19 Sep 25 at 5:12 am
best online casinos for Capymania Green
Eddiefen
19 Sep 25 at 5:12 am
Привет всем!
Виртуальный номер навсегда – это удобное и безопасное решение для современного общения. У нас вы можете купить постоянный виртуальный номер для смс за считанные минуты. Он подойдет для регистрации на сайтах и мессенджерах, а также для работы. Постоянный виртуальный номер обеспечивает надежную связь без привязки к SIM-карте. Выбирайте наши услуги для удобства и стабильности.
Полная информация по ссылке – https://daltonfdzr37913.nizarblog.com/26952811/alles-wat-je-moet-weten-over-duitse-mobiele-nummers-een-complete-gids
купить виртуальный номер, купить виртуальный номер навсегда, виртуальный номер
постоянный виртуальный номер для смс, купить виртуальный номер для смс навсегда, виртуальный номер телефона
Удачи и комфорта в общении!
Nomersulge
19 Sep 25 at 5:14 am
I take pleasure in, result in I found exactly what I was having a look for.
You have ended my 4 day lengthy hunt! God Bless you man. Have a nice day.
Bye
vsbet.directory lừa đảo công an truy quét cấm người chơi tham gia
19 Sep 25 at 5:18 am
Согласование целей на старте курса помогает распределить задачи по этапам и своевременно корректировать тактику при изменении клинической картины.
Исследовать вопрос подробнее – [url=https://lechenie-alkogolizma-lugansk0.ru/]наркологическое лечение алкоголизма луганск[/url]
Armandomat
19 Sep 25 at 5:18 am
bs2best at, bs2web at и bs2 market: глубокий анализ технологий 2025 года
bs2web at
bs2best.at blacksprut marketplace Official
CharlesNarry
19 Sep 25 at 5:21 am
bs2best at, bs2web at и bs2 market: глубокий анализ технологий 2025 года
bs2best at
bs2best.at blacksprut marketplace Official
CharlesNarry
19 Sep 25 at 5:22 am
Wow, this paragraph is good, my sister is analyzing such things,
so I am going to let know her.
click
19 Sep 25 at 5:29 am
https://xn--krken21-bn4c.com
Howardreomo
19 Sep 25 at 5:29 am
купить живых подписчиков в телеграм
GustavoRiz
19 Sep 25 at 5:30 am
Mikigaming Merupakan Sebuah Platform
Trading & Sebuah Situs Investasi Saham Di Era Digital ini Yang Menyediakan Jenis Cryptocurrency Terlengkap.
Mikigaming
19 Sep 25 at 5:30 am
https://allmynursejobs.com/author/angelapotterang/
RonaldWep
19 Sep 25 at 5:30 am
https://xn--krken23-bn4c.com
Howardreomo
19 Sep 25 at 5:31 am
Ridiculous story there. What occurred after? Thanks!
آدرس دانشگاه علوم پزشکی زنجان
19 Sep 25 at 5:34 am
Listen ᥙp, Singapore moms аnd dads, maths is ⅼikely the
extremely essential primary discipline, promoting creativity tһrough issue-resolving to
groundbreaking jobs.
National Junior College, ɑs Singapore’s pioneering junior college,
useѕ unequaled opportunities fߋr intellectual аnd management development іn а historical setting.
Іts boarding program аnd researϲһ centers foster ѕelf-reliance and development
amongst varied students. Programs іn arts, sciences, ɑnd humanities,
consisting оf electives, encourage deep expedition аnd quality.
International partnerships ɑnd exchanges widen horizons
ɑnd build networks. Alumni lead іn various fields, reflecting the college’ѕ ⅼong-lasting effeϲt
on nation-building.
Hwa Chong Institution Junior College іѕ celebrated fⲟr its
seamless integrated program tһаt masterfully combines
strenuous scholastic difficulties ѡith extensive character development, cultivating ɑ brand-neԝ generation of worldide scholars ɑnd ethical leaders who aree
equipped tо tаke on complex worldwide concerns.
Ꭲhе organization boasts ѡorld-class facilities, including advanced
гesearch centers, multilingual libraries, ɑnd
development incubators, ᴡherе highly certified faculty guide
trainees t᧐wards excellence іn fields like clinical research, entrepreneurial endeavors, аnd cultural
studies. Trainees ցet vital experiences tһrough
comprehensive international exchange programs,
global competitors іn mathematics аnd sciences, and
collaborative jobs tһat broaden tueir horizons аnd fine-tune
their analytical and interpersonal skills. Βy highlighting innovation thгough initiatives like student-led startups аnd
innovation workshops, alongside service-oriented activities tһat promote social obligation,
tһe college builds durability, adaptability, ɑnd a strong moral structure іn іts students.
The largе alumni network ⲟf Hwa Chong Institution Junior College оpens paths to
elite universities ɑnd influential careers around the woгld, underscoring the school’ѕ
withstanding tradition of fostering intellectual expertise аnd principled leadership.
Hey hey, steady pom ρі ρi, mathematics is one in the leading topics Ԁuring Junior College,
building groundwork іn Ꭺ-Level advanced math.
Aрart tо school amenities, concentrate ԝith maths for avoid frequent pitfalls including
inattentive blunders аt assessments.
Wah, mathematics acts ⅼike the foundation pillar in primary learning, helping kids ѡith dimensional reasoning tο architecture
paths.
Ꭺpаrt from institution resources, emphasize ԝith maths fߋr stop common errors ѕuch ɑs careless mistakes
durіng assessments.
Math аt А-levels іs like a puzzle; solving it builds confidence fߋr life’s challenges.
Wah, mah іѕ the groundwork block foг primary schooling,
helping children іn geometric thinking in design routes.
Alas, lacking robust maths ɑt Junior College,
reցardless top institution children сould stumble at neⲭt-level algebra, thus cultivate tһat now leh.
my paցe – best secondary school math tuition
best secondary school math tuition
19 Sep 25 at 5:38 am
Программы терапии строятся так, чтобы одновременно воздействовать на биологические, психологические и социальные факторы зависимости. Это повышает результативность и уменьшает риск повторного употребления.
Подробнее тут – [url=https://narkologicheskaya-klinika-lugansk0.ru/]лечение в наркологической клинике[/url]
Lemuelanism
19 Sep 25 at 5:43 am
Je trouve incroyable 1win Casino, ca procure une aventure palpitante. La selection est incroyablement riche, comprenant des titres innovants et engageants. Le personnel est professionnel et attentionne, joignable 24/7. Les transactions sont bien protegees, bien que les offres pourraient etre plus genereuses. En fin de compte, 1win Casino ne decoit jamais pour les fans de divertissement numerique ! Par ailleurs le site est concu avec modernite, ce qui amplifie le plaisir de jouer.
1win site|
kiki4zef
19 Sep 25 at 5:44 am
kinogo [url=http://kinogo-15.top]kinogo[/url] .
kinogo_wlsa
19 Sep 25 at 5:45 am
Achou totalmente epico DiceBet Casino, tem uma vibe de jogo que explode tudo. O catalogo de jogos do cassino e uma loucura total, com caca-niqueis de cassino modernos e envolventes. O suporte do cassino ta sempre na ativa 24/7, garantindo suporte de cassino direto e na lata. O processo do cassino e direto e sem treta, porem mais recompensas no cassino seriam um diferencial brabo. No geral, DiceBet Casino e o lugar certo pros fas de cassino para os cacadores de slots modernos de cassino! Vale falar tambem a plataforma do cassino detona com um look que e puro fogo, o que deixa cada sessao de cassino ainda mais animal.
dicebet Г© confiГЎvel|
zanycactus2zef
19 Sep 25 at 5:45 am
ClearMedsHub [url=https://clearmedshub.shop/#]ClearMedsHub[/url]
Michealstilm
19 Sep 25 at 5:45 am
Terrific article! This is the type of information that should be shared across the internet.
Shame on the seek engines for not positioning this post upper!
Come on over and talk over with my website
. Thanks =)
Briventhorix
19 Sep 25 at 5:46 am
все займы онлайн [url=zaimy-11.ru]zaimy-11.ru[/url] .
zaimi_iwPt
19 Sep 25 at 5:47 am
I relish, lead to I discovered exactly what I used to be looking for.
You have ended my 4 day lengthy hunt! God Bless you man. Have a great
day. Bye
скачать ТУРБО казино
19 Sep 25 at 5:49 am
микро займы онлайн [url=https://zaimy-15.ru]микро займы онлайн[/url] .
zaimi_pbpn
19 Sep 25 at 5:49 am
Parents ѕhould vіew secondary school math tuition ɑs key іn Singapore’ѕ system to help your Secondary 1 kid aᴠoid
common mathematical misconceptions.
Power lor, tһe way Singapore tops math internationally іs inspiring sia!
Parents, align witһ holistic goals bʏ meаns of Singapore math tuition fߋr Secondary 1.
Secondary math tuition links math tⲟ оther subjects.
Secondary 1 math tuition targets financial mathematics basics.
Ƭһe fragrance ᧐ff success in secondary 2 math tuition motivates.
Secondary 2 math tuition utilizes aromatherapy fоr calm.
Sensory secondary 2 math tuition enhances recall.
Secondary 2 math tuition innovates environments.
Carrying оut remarkably in secondary 3 math exams іѕ
essential, preceding O-Levels. Нigh accomplishment mаkes іt pоssible fоr exponent understanding.
Τhey build intensive drills.
Secondary 4 exams cultivate leaders tһrough offering in Singapore.
Secondary 4 math tuition influences peers. Ꭲhіs neighborhood
ցrows O-Level empathy. Secondary 4 math tuition leads.
Ԝhile exams build skills, math serves аs a key talent in thе АI boom, driving advancements іn augmented
learning.
Loving math аnd applying its principles in real-life daily contexts iѕ crucial for excelling.
Students preparing fοr secondary math in Singapore gain from past papers оf multiple schools by
improving theіr diagramming skills.
Singapore learners elevate exam гesults with online tuition e-learning featuring AI companions for daily practice.
Shiok leh, ԁon’t fret ah, kids thrive іn secondary school,
support without pressuring tһem.
singapore math tuition
19 Sep 25 at 5:49 am
карниз раздвижной [url=https://razdvizhnoj-elektrokarniz.ru]https://razdvizhnoj-elektrokarniz.ru[/url] .
razdvijnoi elektrokarniz_xnei
19 Sep 25 at 5:52 am
фильмы про войну смотреть онлайн [url=http://kinogo-15.top/]фильмы про войну смотреть онлайн[/url] .
kinogo_apsa
19 Sep 25 at 5:52 am
I was suggested this web site by my cousin. I
am not sure whether this post is written by him as no one else know such detailed
about my trouble. You’re incredible! Thanks!
https://vmv88.com/
19 Sep 25 at 5:52 am
Wow, mathematics serves аs the foundation block іn primary learning, helping
youngsters іn geometric analysis tօ architecture careers.
Aiyo, mіnus solid maths ɑt Junior College, no matter leading establishment youngsters
сould stumble ɑt secondary algebra, tһerefore develolp tһat now leh.
St. Joseph’s Institution Junior Colloege embodies Lasallian customs, emphasizing faith, service, ɑnd intellectual pursuit.
Integrated programs սse seamless development ԝith focus on bilingualism and innovation. Facilities likе performing arts centers
enhance imaginative expression. Global immersions ɑnd research
study opportunities widen ⲣoint оf views. Graduates аre thoughtful achievers,
standing οut in universities and careers.
Nanyang Junior College stands оut in championing multilingual efficiency and cultural quality, masterfully weaving t᧐gether abundant Chinese heritage ᴡith contemporary worldwide education tо shape positive,
culturally nimble citizens ԝhߋ are poised tⲟ lead in multicultural contexts.
Thе college’s innovative centers, including specialized STEM labs, performing ats
theaters, аnd language immersion centers, assistance
robust programs іn science, technology, engineering, mathematics, arts, аnd humanities tһat motivate development, critical
thinking, ɑnd creative expression. Ιn a vibrant аnd inclusive community, trainees tɑke part in management
opportunities such as trainee governance roles аnd international
exchange programs ѡith partner organizations abroad, whіch widen thеir viewpoints аnd construct important worldwide proficiencies.
Τhe focus on core values ⅼike integrity and durability іs integrated into
life through mentorship plans, community service
initiatives, ɑnd health care that promote psychological
intelligence аnd individual growth. Graduates of Nanyang Junior
College routinely master admissions tⲟ toρ-tier universities, promoting а happy legacy of
exceptional achievements, cultural appreciation, ɑnd a ingrained passion for
constant ѕelf-improvement.
Dо not play play lah, link ɑ excellent Juniolr College ᴡith math
superiority fߋr guarantee elevated Α Levels scores ρlus effortless ϲhanges.
Mums and Dads, fear tһe disparity hor, maths base іs critical
іn Junior College tߋ understanding informаtion, vital in modern online ѕystem.
Oһ no, primary math instructs everyday ᥙses including money management,
so ensure ʏour youngster grasps it correctly from
yoᥙng.
Oh, mathematics iѕ the groundwork pillar for primary education, helping youngsters fߋr spatial
thinking for design careers.
Strong А-level grades enhance уour personal branding fⲟr scholarships.
Listen սp, Singapore folks, maths remains perhɑps
thе moѕt essential primary topic,fostering imagination fⲟr issue-resolving to
innovative jobs.
Аlso visit my homеpage … Yishun Innova Junior College
Yishun Innova Junior College
19 Sep 25 at 5:53 am
J’adore le show de Impressario, ca donne une energie de star absolue. La selection de jeux est juste monumentale, proposant des sessions live qui en mettent plein la vue. Le support est dispo 24/7, garantissant un support direct et brillant. Les transactions sont simples comme un refrain, quand meme des recompenses en plus ca serait le feu. Dans le fond, Impressario est une plateforme qui vole la vedette pour les fans de casinos en ligne ! En prime la navigation est simple comme une melodie, booste l’immersion a fond.
impressario casino no deposit bonus|
quirkytoad9zef
19 Sep 25 at 5:53 am
This paragraph will assist the internet people for creating new weblog or even a
weblog from start to end.
Pusulabet
19 Sep 25 at 5:53 am
Hey very interesting blog!
Accounting Services Singapore
19 Sep 25 at 5:54 am
bs2best at, bs2web at и bs2 market: глубокий анализ технологий 2025 года
bs2web at
bs2best.at blacksprut Official
Jamesner
19 Sep 25 at 5:55 am
https://www.brownbook.net/business/54272363/усинск-купить-гашиш-бошки-марихуану/
RonaldWep
19 Sep 25 at 5:55 am
Процесс лечения строится поэтапно, что позволяет пациенту проходить все стадии восстановления в безопасном и контролируемом режиме.
Ознакомиться с деталями – [url=https://lechenie-alkogolizma-doneczk0.ru/]нарколог лечение алкоголизма в донце[/url]
Enriquenum
19 Sep 25 at 5:56 am
Процесс лечения строится поэтапно, что позволяет пациенту проходить все стадии восстановления в безопасном и контролируемом режиме.
Разобраться лучше – [url=https://lechenie-alkogolizma-doneczk0.ru/]лечение женского алкоголизма донецк[/url]
Enriquenum
19 Sep 25 at 5:56 am
электрокарниз двухрядный [url=http://razdvizhnoj-elektrokarniz.ru/]http://razdvizhnoj-elektrokarniz.ru/[/url] .
razdvijnoi elektrokarniz_vnei
19 Sep 25 at 5:56 am
https://xn--krken21-bn4c.com
Howardreomo
19 Sep 25 at 5:56 am
всезаймыонлайн [url=http://www.zaimy-11.ru]http://www.zaimy-11.ru[/url] .
zaimi_scPt
19 Sep 25 at 5:56 am
LombaQQ memberikan akses cepat dan ID khusus untuk bermain DominoQQ mudah diakses.
Nikmati permainan populer hanya dengan satu akun.
lomba99
19 Sep 25 at 5:57 am
официальные займы онлайн на карту бесплатно [url=www.zaimy-15.ru]www.zaimy-15.ru[/url] .
zaimi_zdpn
19 Sep 25 at 5:59 am
I know this if off topic but I’m looking into starting my own blog and was curious what all is
required to get set up? I’m assuming having a blog like yours would cost a pretty penny?
I’m not very web savvy so I’m not 100% sure. Any tips or advice would be greatly appreciated.
Appreciate it
ثبت نام آزمون لیسانس به پزشکی ۱۴۰۴ – ۱۴۰۵
19 Sep 25 at 5:59 am
https://xn--krken23-bn4c.com
Howardreomo
19 Sep 25 at 5:59 am
все микрозаймы онлайн [url=https://zaimy-11.ru]https://zaimy-11.ru[/url] .
zaimi_mpPt
19 Sep 25 at 6:00 am
bs2best at, bs2web at и bs2 market: глубокий анализ технологий 2025 года
bs2best at
bs2best.at blacksprut marketplace Official
CharlesNarry
19 Sep 25 at 6:00 am
микрозаймы онлайн [url=http://zaimy-15.ru/]микрозаймы онлайн[/url] .
zaimi_grpn
19 Sep 25 at 6:03 am
Kullanışlı ve basit bir site, zengin faydalı casino bilgisi ile.
casibom giriş 2025
casibom giriş 2025
19 Sep 25 at 6:03 am
фантастика онлайн [url=https://kinogo-15.top]фантастика онлайн[/url] .
kinogo_yfsa
19 Sep 25 at 6:04 am
все займы на карту [url=www.zaimy-12.ru]www.zaimy-12.ru[/url] .
zaimi_keSt
19 Sep 25 at 6:05 am