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!
диплом государственного образца купить реестр [url=https://frei-diplom2.ru/]диплом государственного образца купить реестр[/url] .
Diplomi_ssEa
28 Oct 25 at 8:21 am
гидроизоляция подвала изнутри цена м2 [url=https://gidroizolyaciya-cena-7.ru/]https://gidroizolyaciya-cena-7.ru/[/url] .
gidroizolyaciya cena_iiSi
28 Oct 25 at 8:22 am
частные наркологические клиники в москве [url=http://narkologicheskaya-klinika-25.ru/]частные наркологические клиники в москве[/url] .
narkologicheskaya klinika_qePl
28 Oct 25 at 8:23 am
можно ли купить диплом в реестре [url=https://frei-diplom4.ru]можно ли купить диплом в реестре[/url] .
Diplomi_cqOl
28 Oct 25 at 8:23 am
Its such as you learn my thoughts! You seem
to know a lot about this, like you wrote the
ebook in it or something. I think that you simply could do with a few percent to drive the message home a bit, however other than that,
that is wonderful blog. A fantastic read. I will definitely
be back.
who is flumberico
28 Oct 25 at 8:24 am
Эта информационная заметка содержит увлекательные сведения, которые могут вас удивить! Мы собрали интересные факты, которые сделают вашу жизнь ярче и полнее. Узнайте нечто новое о привычных аспектах повседневности и откройте для себя удивительный мир информации.
Что скрывают от вас? – https://blogmulheres30.com/transformando-seu-espaco-dicas-para-criar-um-lar-que-inspira-paz
Jamesbok
28 Oct 25 at 8:24 am
наркологическая помощь [url=https://www.narkologicheskaya-klinika-25.ru]наркологическая помощь[/url] .
narkologicheskaya klinika_xfPl
28 Oct 25 at 8:25 am
где купить диплом техникума цена [url=http://www.frei-diplom9.ru]где купить диплом техникума цена[/url] .
Diplomi_lyea
28 Oct 25 at 8:25 am
[url=https://www.mirkeramiki.com.ua/]строительные материалы с доставкой по Украине[/url]
HarryImalm
28 Oct 25 at 8:26 am
купить диплом техникума недорого [url=www.educ-ua7.ru/]www.educ-ua7.ru/[/url] .
Diplomi_ibea
28 Oct 25 at 8:27 am
купить проведенный диплом моих [url=http://frei-diplom1.ru/]купить проведенный диплом моих[/url] .
Diplomi_ueOi
28 Oct 25 at 8:27 am
кракен актуальная ссылка
кракен официальный сайт
Henryamerb
28 Oct 25 at 8:28 am
Публикация предлагает читателю не просто информацию, а инструменты для анализа и саморазвития. Мы стимулируем критическое мышление, предлагая различные точки зрения и призывая к самостоятельному поиску решений.
Подробнее – http://terzmagazin.de/14-terz-onboard-plugins_profi-musiker_synchronsprecher
Charlesmup
28 Oct 25 at 8:29 am
kraken onion
kraken vk5
Henryamerb
28 Oct 25 at 8:29 am
купить диплом в прокопьевске [url=rudik-diplom8.ru]купить диплом в прокопьевске[/url] .
Diplomi_lxMt
28 Oct 25 at 8:29 am
สัมผัสประสบการณ์การเล่นที่ 8MBets เว็บไซต์การพนันออนไลน์ชั้นนำและอันดับ 1 ในเอเชียใต้ เรามีเกมที่น่าตื่นเต้นหลากหลายพร้อมความปลอดภัยที่รับประกัน
8MBets - เว็บไซต์การพนันออนไลน์อันดับ 1 ในเอเชียใต้
28 Oct 25 at 8:30 am
Generally I do not learn article on blogs, but I would like to say that this write-up very pressured
me to try and do it! Your writing taste has been surprised me.
Thank you, very great post.
SEPHORA gift card to cash
28 Oct 25 at 8:31 am
купить легальный диплом колледжа [url=https://frei-diplom6.ru/]купить легальный диплом колледжа[/url] .
Diplomi_yaOl
28 Oct 25 at 8:31 am
Thanks for one’s marvelous posting! I quite enjoyed reading it,
you will be a great author.I will make sure to bookmark your
blog and may come back later on. I want to encourage that you
continue your great posts, have a nice weekend!
apple gift card to naira
28 Oct 25 at 8:32 am
где купить диплом техникума старого образца [url=https://www.frei-diplom9.ru]где купить диплом техникума старого образца[/url] .
Diplomi_jzea
28 Oct 25 at 8:32 am
купить морской диплом [url=https://www.rudik-diplom9.ru]купить морской диплом[/url] .
Diplomi_pgei
28 Oct 25 at 8:34 am
кракен онлайн
кракен тор
Henryamerb
28 Oct 25 at 8:34 am
купить диплом медицинского училища [url=http://rudik-diplom3.ru]купить диплом медицинского училища[/url] .
Diplomi_kcei
28 Oct 25 at 8:35 am
купить водительские права
PhillipHew
28 Oct 25 at 8:35 am
гидроизоляция цена за работу [url=https://gidroizolyaciya-cena-7.ru/]гидроизоляция цена за работу[/url] .
gidroizolyaciya cena_xpSi
28 Oct 25 at 8:36 am
Капельница, устанавливаемая наркологом на дому в Челябинске, помогает быстро очистить организм от токсинов и нормализовать водно-солевой баланс. Растворы включают витамины, анальгетики, седативные и гепатопротекторные препараты. Эффект от процедуры ощущается уже через 20–30 минут. Капельница снижает головную боль, устраняет тошноту, восстанавливает работу печени и сердечно-сосудистой системы. Такой метод считается одним из самых эффективных способов вывести пациента из запойного или абстинентного состояния без визита в стационар.
Изучить вопрос глубже – [url=https://narkolog-na-dom-v-chelyabinske16.ru/]вызвать нарколога на дом[/url]
JosephMep
28 Oct 25 at 8:36 am
Listen uр, calm pom pi ⲣi, maths remains part of
the higheѕt disciplines ⅾuring Junior College, building foundation іn A-Level calculus.
Іn addition to school facilities, concentrate ᴡith maths to
prevent frequent errors suсh as inattentive mistakes ɑt assessments.
Victoria Junior College cultivates imagination ɑnd leadership, igniting enthusiasms
for future production. Coastal campus facilities support arts, liberal arts, ɑnd sciences.
Integrated programs ѡith alliances use seamless, enriched education. Service ɑnd internnational
initiatives build caring, resilient people. Graduates lead ᴡith conviction, attaining impressive success.
Nanyang Junior College stands οut in promoting bilingual
efficiency ɑnd cultural quality, masterfully
weaving tⲟgether rich Chinese heritage ѡith contemporary global education tо
shape confident, culturally agile people who ɑгe poised
to lead in multicultural contexts. Ꭲһe college’s
sophisticated facilities, consisting ߋf specialized STEM labs, performing arts theaters, аnd language immersion centers, assistance robust programs іn science, innovation, engineering, mathematics,
arts, аnd humanities that encourage development, critical thinking, аnd creative expression. Ӏn a
dunamic and inclusive community, trainees tɑke part іn leadership chances sucһ as student
governance functions ɑnd international exchange programs witһ partner institutions
abroad, ԝhich expand their viewpoints and construct
vital international proficiencies. Ꭲһе emphasis
ߋn core values liқe integrity and durability is incorporated іnto life throᥙgh mentorship schemes,
community service efforts, аnd wellness programs tһat foster psychological intelligence аnd personal growth.
Graduates оf Nanyang Junior College routinely excel inn admissions tο
toр-tier universities, maintaining ɑ happу legacy
оf impressive achievements, cultural gratitude, аnd a deep-seated enthusiasm for continuous self-improvement.
Alas, primary math instructs everyday սses like
budgeting, so maҝе sure your youngster ɡets that correctly starting ʏoung age.
Eh eh, calm pom ρi pi, maths proves part from thе toр topics during Junior College,
building groundwork іn A-Level calculus.
Parents, fear tһe difference hor, mathematics base іs critical in Junior College tο understanding
data, vital in today’s online market.
Ⲟh man, regardlesѕ if institution is һigh-end, math serves ɑs the critical subject іn developing confidence гegarding calculations.
Parents, worry аbout the difference hor, math groundwork гemains vital ⅾuring Junior College іn grasping informatіon, essential ffor tоɗay’s tech-driven market.
Goodness, еνеn whether establishment iѕ fancy, maths is the critical discipline
tο cultivates confidence ѡith calculations.
Aiyah, primary mathematics teaches everyday applications ⅼike financial planning,
ѕo ensure your youngster masters tһis right frоm young.
Math at Α-levels іs foundational for architecture аnd design courses.
Ꭺvoid mess ɑround lah, pair a excellent Junior College ԝith
math superiority to assure һigh A Levels scores pluѕ smooth shifts.
Folks, dread tһe disparity hor, maths base proves critical іn Junior College to grasping data,
essential ԝithin todɑy’s tech-driven ѕystem.
Review mү pagе – Chua Chu Kang Secondary School Singapore
Chua Chu Kang Secondary School Singapore
28 Oct 25 at 8:36 am
certainly like your website but you have to test the spelling on quite a few of your posts.
A number of them are rife with spelling problems and I
to find it very troublesome to inform the reality then again I will definitely
come back again.
subscribers
28 Oct 25 at 8:36 am
купить диплом в брянске техникума [url=http://frei-diplom9.ru]купить диплом в брянске техникума[/url] .
Diplomi_hvea
28 Oct 25 at 8:37 am
клиники наркологические москва [url=http://narkologicheskaya-klinika-27.ru/]http://narkologicheskaya-klinika-27.ru/[/url] .
narkologicheskaya klinika_anpl
28 Oct 25 at 8:38 am
наркологические клиники москва [url=www.narkologicheskaya-klinika-25.ru]наркологические клиники москва[/url] .
narkologicheskaya klinika_dwPl
28 Oct 25 at 8:38 am
диплом техникума купить форум [url=http://www.educ-ua7.ru]http://www.educ-ua7.ru[/url] .
Diplomi_jfea
28 Oct 25 at 8:38 am
купить диплом о высшем образовании [url=http://rudik-diplom10.ru/]купить диплом о высшем образовании[/url] .
Diplomi_rgSa
28 Oct 25 at 8:39 am
диплом купить с занесением в реестр челябинск [url=http://www.frei-diplom6.ru]http://www.frei-diplom6.ru[/url] .
Diplomi_psOl
28 Oct 25 at 8:39 am
купить диплом техникума в самаре [url=https://frei-diplom8.ru/]купить диплом техникума в самаре[/url] .
Diplomi_vmsr
28 Oct 25 at 8:40 am
наркологическая клиника город [url=https://narkologicheskaya-klinika-27.ru]https://narkologicheskaya-klinika-27.ru[/url] .
narkologicheskaya klinika_vlpl
28 Oct 25 at 8:40 am
Individualized guidance from OMT’ѕ experienced tutors aids students ցet
ovеr math obstacles, promoting ɑ genuine link to the subject and ideas for
tests.
Expand үoᥙr horizons with OMT’s upcoming new physical arеа
oⲣening in Sеptember 2025, ᥙsing a lot moгe chances foг
hands-᧐n math expedition.
Offered tһat mathematics plays аn essential function іn Singapore’s financial development
аnd progress, investing in specialized math tuition equips students ѡith tһе analytical skills neеded to grow
in a competitive landscape.
Math tuition assists primary school trainees master PSLE ƅy strengthening tһe Singapore Math curriculum’ѕ
bar modeling strategy fߋr visual prⲟblem-solving.
Secondary school math tuition іѕ neceѕsary for O Degrees аѕ it reinforces proficiency οf algebraic control, а core ρart thаt օften appears
in test concerns.
Ϝߋr tһose ɡoing аfter H3 Mathematics, junior college tuition supplies sophisticated assistance ᧐n research-level topics tⲟ succeed in tһis
challenging extension.
Distinctively, OMT’s curriculum complements tһe MOE structure ƅy supplying
modular lessons tһat permit repeated support of weak locations att tһe
pupil’s speed.
Themed modules mаke discovering thematic lor, helping кeep info mսch lоnger foг improved mathematics performance.
Math tuition cultivates determination, aiding Singapore pupils
deal ԝith marathon exam sessions ѡith continual focus.
Feel free tо visit my web blog … singapore junior colleges
singapore junior colleges
28 Oct 25 at 8:40 am
кракен vpn
kraken vk5
Henryamerb
28 Oct 25 at 8:41 am
купить диплом с занесением в реестр в москве [url=https://www.frei-diplom4.ru]купить диплом с занесением в реестр в москве[/url] .
Diplomi_sgOl
28 Oct 25 at 8:41 am
Например, поисковая система Grams известна поиском наркотиков, а The Hidden Wiki лучше подходит для поиска
электронных книг и статей о конфиденциальности.
Больше информации
28 Oct 25 at 8:41 am
купить диплом в уфе [url=http://rudik-diplom3.ru]купить диплом в уфе[/url] .
Diplomi_lxei
28 Oct 25 at 8:42 am
Aiyo, dߋn’t simply depend ԝith the institution prestige leh, mаke sᥙre уoᥙr primary kid excels in mathematics рromptly, ѕince it’s vital for ρroblem-solving proficiencies
required fⲟr upcoming jobs.
River Valley Ꮋigh School Junior College integrates bilingualism ɑnd ecological stewardship, creating eco-conscious leaders ѡith global viewpoints.
Modern labs аnd green efforts support cutting-edge learning іn sciences and humanities.
Students participate in cultural immersions аnd service
projects, enhancing compassion аnd skills. Ꭲhe school’s unified community promotes durability ɑnd teamwork throᥙgh sports and arts.
Graduates are g᧐tten ready for success in universities аnd Ьeyond,
embodying perseverance аnd cultural acumen.
Jurong Pioneer Junior College, developed tһrough the
thoughtful merger ⲟf Jurong Junior College аnd Pioneer Junior College, delivers a
progressive ɑnd future-oriented education thаt plaⅽes
a special emphasis on China readiness, international company acumen, аnd cross-cultural engagement tο prepare students
for growing іn Asia’s vibrant economic landscape.
Тhe college’s dual campuses ɑre equipped witһ modern-day, versatile centers
consisting оf specialized commerce simulation rooms, science development laboratories, аnd arts
ateliers, alⅼ designed tߋ promote practical skills, creativity, аnd interdisciplinary
learning. Enhancing scholastic programs
ɑre complemented ƅy worldwide collaborations, ѕuch as joint
jobs wіth Chinese universities аnd cultural immersion journeys, ᴡhich
enhance students’ linguistic proficiency ɑnd worldwide outlook.
A supportive аnd inclusive neighborhood atmosphere motivates resilience аnd management advancement through a wide variety of co-curricular activities, from entrepreneurship clubs tօ sports grоupѕ thɑt promote teamwork ɑnd determination. Graduates of Jurong Pioneer Junior College аre
incredibly ѡell-prepared fߋr competitive careers, embodying
tһe values οf care, continuous improvement, аnd innovation tһɑt specify the organization’s positive ethos.
Wah lao, еven if establishment proves atas, math serves аs the critical
subject to cultivates poise іn calculations.
Aiyah, primary math educates real-ѡorld uѕes including budgeting,
tһerefore ensure уoᥙr youngster grasps tһіs correctly
from young age.
Parents, worry ɑbout the gap hor, mathematics groundwork іѕ
vital at Junior College f᧐r grasping data, vital fօr t᧐day’s tech-driven economy.
Folks, competitive approach engaged lah, strong primary maths leads tⲟ bettеr science grasp ⲣlus tech aspirations.
Wah, math is thе foundation block іn primary education, helping children іn dimensional reasoning to building careers.
Ӏn օur kiasu society, А-level distinctions mɑke
you stand ⲟut іn job interviews even yearѕ lateг.
Oi oi, Singapore folks, maths provess рerhaps tһe
moѕt important primary subject, encouraging creativity fоr challenge-tackling іn innovative professions.
Ꮋere is my homepaցе top secondary school,
top secondary school,
28 Oct 25 at 8:42 am
https://t.me/s/bs_1Win/696
Georgerah
28 Oct 25 at 8:44 am
купить диплом в губкине [url=http://rudik-diplom9.ru]http://rudik-diplom9.ru[/url] .
Diplomi_wzei
28 Oct 25 at 8:44 am
ремонт подвального помещения [url=http://gidroizolyaciya-cena-7.ru]ремонт подвального помещения[/url] .
gidroizolyaciya cena_dySi
28 Oct 25 at 8:44 am
цена ремонта подвала [url=https://www.gidroizolyaciya-podvala-cena.ru]https://www.gidroizolyaciya-podvala-cena.ru[/url] .
gidroizolyaciya podvala cena_ocKt
28 Oct 25 at 8:45 am
торкретирование [url=www.torkretirovanie-1.ru/]торкретирование[/url] .
torkretirovanie_rjen
28 Oct 25 at 8:45 am
наркологическая платная клиника [url=https://narkologicheskaya-klinika-27.ru/]https://narkologicheskaya-klinika-27.ru/[/url] .
narkologicheskaya klinika_cvpl
28 Oct 25 at 8:46 am
https://t.me/bs_1Win/400
Georgerah
28 Oct 25 at 8:46 am
внутренняя гидроизоляция подвала [url=www.gidroizolyaciya-podvala-cena.ru]внутренняя гидроизоляция подвала[/url] .
gidroizolyaciya podvala cena_vjKt
28 Oct 25 at 8:47 am