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!
It’s very easy to find out any topic on web as compared to books, as I found this post
at this site.
new casinos online
16 Sep 25 at 7:05 am
порядок согласования перепланировки нежилого помещения [url=http://www.pereplanirovka-nezhilogo-pomeshcheniya1.ru]http://www.pereplanirovka-nezhilogo-pomeshcheniya1.ru[/url] .
pereplanirovka nejilogo pomesheniya_bgsi
16 Sep 25 at 7:05 am
Казино ПинАп слот Candy Jar Clusters
EdwardTix
16 Sep 25 at 7:05 am
I’d like to find out more? I’d love to find out more details.
vape factory
16 Sep 25 at 7:06 am
смотреть фильмы онлайн [url=https://www.kinogo-11.top]https://www.kinogo-11.top[/url] .
kinogo_zeMa
16 Sep 25 at 7:07 am
согласование перепланировки в нежилом помещении [url=pereplanirovka-nezhilogo-pomeshcheniya3.ru]pereplanirovka-nezhilogo-pomeshcheniya3.ru[/url] .
pereplanirovka nejilogo pomesheniya_pwsa
16 Sep 25 at 7:07 am
квартира на сутки Лида http://www.alwaha.ly/ministerstvo-po-chrezvychajnym-situacijam/
http://www.alwaha.ly/ministerstvo-po-chrezvychajnym-situacijam/
16 Sep 25 at 7:08 am
перепланировка и согласование [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya.ru]https://www.pereplanirovka-nezhilogo-pomeshcheniya.ru[/url] .
pereplanirovka nejilogo pomesheniya_lvKn
16 Sep 25 at 7:08 am
согласование перепланировки нежилого здания [url=http://pereplanirovka-nezhilogo-pomeshcheniya1.ru/]http://pereplanirovka-nezhilogo-pomeshcheniya1.ru/[/url] .
pereplanirovka nejilogo pomesheniya_bmsi
16 Sep 25 at 7:09 am
советские фильмы смотреть онлайн бесплатно [url=http://kinogo-11.top/]http://kinogo-11.top/[/url] .
kinogo_ndMa
16 Sep 25 at 7:10 am
согласование перепланировки нежилого помещения [url=http://www.pereplanirovka-nezhilogo-pomeshcheniya2.ru]согласование перепланировки нежилого помещения[/url] .
pereplanirovka nejilogo pomesheniya_pdEt
16 Sep 25 at 7:10 am
согласование перепланировки нежилых помещений [url=https://pereplanirovka-nezhilogo-pomeshcheniya.ru]https://pereplanirovka-nezhilogo-pomeshcheniya.ru[/url] .
pereplanirovka nejilogo pomesheniya_yyKn
16 Sep 25 at 7:11 am
согласование перепланировок нежилых помещений [url=www.pereplanirovka-nezhilogo-pomeshcheniya1.ru]www.pereplanirovka-nezhilogo-pomeshcheniya1.ru[/url] .
pereplanirovka nejilogo pomesheniya_xrsi
16 Sep 25 at 7:12 am
Its like you read my mind! You seem to know a lot about this, like you wrote the book in it or something.
I think that you could do with a few pics to drive the message home a bit,
but instead of that, this is fantastic blog. A fantastic read.
I’ll certainly be back.
Zarios
16 Sep 25 at 7:14 am
согласование перепланировок нежилых помещений [url=https://pereplanirovka-nezhilogo-pomeshcheniya3.ru]https://pereplanirovka-nezhilogo-pomeshcheniya3.ru[/url] .
pereplanirovka nejilogo pomesheniya_gssa
16 Sep 25 at 7:15 am
Аналитика финансовых рынков Депозиты – это деньги, размещенные клиентами в банке для хранения и получения процентов. Они являются относительно безопасным способом хранения сбережений и получения небольшого дохода. Процентные ставки по депозитам могут варьироваться в зависимости от срока депозита и текущей экономической ситуации.
JamesHophy
16 Sep 25 at 7:17 am
перевод документов онлайн бюро технических переводов
byuro-perevodov-810
16 Sep 25 at 7:17 am
квартира на сутки Лида http://musiconfire.6te.net/index.php/2025/09/10/kvartira-studija-bordo-na-sutki-v-centre-lidy-v/
http://musiconfire.6te.net/index.php/2025/09/10/kvartira-studija-bordo-na-sutki-v-centre-lidy-v/
16 Sep 25 at 7:18 am
согласование перепланировки нежилого помещения в нежилом здании [url=https://pereplanirovka-nezhilogo-pomeshcheniya3.ru]https://pereplanirovka-nezhilogo-pomeshcheniya3.ru[/url] .
pereplanirovka nejilogo pomesheniya_ilsa
16 Sep 25 at 7:18 am
Hi there to every one, the contents existing at this web page are really amazing for people
knowledge, well, keep up the nice work fellows.
Чемпион казино
16 Sep 25 at 7:20 am
перепланировка офиса согласование [url=pereplanirovka-nezhilogo-pomeshcheniya2.ru]pereplanirovka-nezhilogo-pomeshcheniya2.ru[/url] .
pereplanirovka nejilogo pomesheniya_qhEt
16 Sep 25 at 7:20 am
переустройство и перепланировка нежилого помещения [url=pereplanirovka-nezhilogo-pomeshcheniya.ru]pereplanirovka-nezhilogo-pomeshcheniya.ru[/url] .
pereplanirovka nejilogo pomesheniya_txKn
16 Sep 25 at 7:21 am
согласование перепланировки нежилого помещения [url=www.pereplanirovka-nezhilogo-pomeshcheniya1.ru/]www.pereplanirovka-nezhilogo-pomeshcheniya1.ru/[/url] .
pereplanirovka nejilogo pomesheniya_kzsi
16 Sep 25 at 7:21 am
Have you ever considered about adding a little bit more than just your articles?
I mean, what you say is important and everything. Nevertheless imagine if you added some great pictures or videos
to give your posts more, “pop”! Your content
is excellent but with pics and video clips, this blog could undeniably be one of the
best in its field. Awesome blog!
Velar Paynex
16 Sep 25 at 7:22 am
Building Backlinks, How To Draw In Massive In Order To Your
Blog For Free blog (Clarence)
Clarence
16 Sep 25 at 7:23 am
Listen up, Singapore parents, maths remains peгhaps tһe highly essential primary discipline, encouraging imagination tһrough issue-resolving іn innovative jobs.
Victoria Junior College cultivates creativity аnd
management, igniting enthusiasms for future production.
Coastal campus facilities support arts, liberal arts, аnd sciences.
Integrated programs ѡith alliances ᥙse smooth, enriched education. Service ɑnd
global initiatives build caring, resilient people. Graduates
lead ѡith conviction, attaining remarkable success.
Anglo-Chinese School (Independent) Junior College delivers ɑn enhancing education deeply rooted in faith, wherе intellectual expedition іs harmoniously stabilized witһ core ethical principles, guiding trainees tοward
ending up ƅeing understanding and гesponsible worldwide
residents equipped tо attend to complicated social
obstacles. Ƭһe school’s distinguished International Baccalaureate Diploma Programme promotes advanced vital thinking,
research study skills, ɑnd interdisciplinary learning, bolstered
ƅy remarkable resources liкe dedicated
development centers аnd professional faculty ѡһo
mentor students in achieving scholastic distinction. Ꭺ broad spectrum of сo-curricular offerings, fгom advanced robotics ⅽlubs that motivate technological creativity tο chamber orchestra tһat develop musical
talents, enables students tߋ fіnd and refine theiг unique capabilities іn ɑ
helpful ɑnd stimulating environment. By integrating service knowing efforts,
ѕuch aѕ community outreach jobs ɑnd volunteer programs bοth locally ɑnd internationally, the college cultivates а strong sense of social responsibility, compassion, ɑnd
active citizenship ɑmongst its trainee body. Graduates of Anglo-Chinese School (Independent) Junior
College аre remarkably ԝell-prepared fоr entry intⲟ elite universities аround the worⅼd, carrying wіth tһem a recognized
tradition ᧐f scolastic quality, personal stability,
аnd a commitment to long-lasting knowing аnd contribution.
Aiyo, lacking strong mathematics іn Junior College, гegardless leading establishment children сould struggle
wіth next-level algebra, tһerefore cultivate itt
noᴡ leh.
Oi oi, Singapore moms ɑnd dads, maths іs lіkely the mοst crucial
primary discipline, promoting innovation іn problem-solving fօr groundbreaking jobs.
Goodness, еven if institution proves fancy, math acts llike tһe critical subject іn developing assurance regarding numbeгѕ.
Oh no, primary mathematics educates everyday applications ⅼike financial
planning, ѕo guarantee your youngster grasps that correctly Ьeginning
ʏoung age.
Αpart from institution facilities, focus ߋn mathematics for prevent common mistakes including sloppy errors ɑt exams.
Α-level success stories inspire tһe next generation of kiasu JC students.
Hey hey, composed pom ρi pi, maths гemains one of the hіghest disciplines ɗuring Junior College, laying
foundation fоr А-Level calculus.
Ᏼesides from school amenities, emphasize օn maths for prevent frequent
pitfalls including sloppy errors іn exams.
Feel free to visit my homepage: Nanyang Junior College
Nanyang Junior College
16 Sep 25 at 7:24 am
регистрация перепланировки нежилого помещения [url=www.pereplanirovka-nezhilogo-pomeshcheniya2.ru]www.pereplanirovka-nezhilogo-pomeshcheniya2.ru[/url] .
pereplanirovka nejilogo pomesheniya_mgEt
16 Sep 25 at 7:24 am
согласовать перепланировку нежилого помещения [url=https://pereplanirovka-nezhilogo-pomeshcheniya3.ru/]https://pereplanirovka-nezhilogo-pomeshcheniya3.ru/[/url] .
pereplanirovka nejilogo pomesheniya_oysa
16 Sep 25 at 7:24 am
Эта статья предлагает живое освещение актуальной темы с множеством интересных фактов. Мы рассмотрим ключевые моменты, которые делают данную тему важной и актуальной. Подготовьтесь к насыщенному путешествию по неизвестным аспектам и узнайте больше о значимых событиях.
Открыть полностью – https://educamp.jp/5048
Gabrielrulse
16 Sep 25 at 7:25 am
перепланировка нежилых помещений [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya2.ru]перепланировка нежилых помещений[/url] .
pereplanirovka nejilogo pomesheniya_djEt
16 Sep 25 at 7:29 am
киного [url=http://kinogo-11.top/]http://kinogo-11.top/[/url] .
kinogo_ppMa
16 Sep 25 at 7:30 am
перепланировка нежилого помещения в нежилом здании [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya1.ru]https://www.pereplanirovka-nezhilogo-pomeshcheniya1.ru[/url] .
pereplanirovka nejilogo pomesheniya_brsi
16 Sep 25 at 7:31 am
узаконивание перепланировки нежилого помещения [url=http://pereplanirovka-nezhilogo-pomeshcheniya.ru/]http://pereplanirovka-nezhilogo-pomeshcheniya.ru/[/url] .
pereplanirovka nejilogo pomesheniya_nlKn
16 Sep 25 at 7:31 am
разрешение на перепланировку нежилого помещения не требуется [url=http://www.pereplanirovka-nezhilogo-pomeshcheniya3.ru]http://www.pereplanirovka-nezhilogo-pomeshcheniya3.ru[/url] .
pereplanirovka nejilogo pomesheniya_mtsa
16 Sep 25 at 7:32 am
кинопоиск смотреть онлайн [url=https://www.kinogo-11.top]https://www.kinogo-11.top[/url] .
kinogo_ayMa
16 Sep 25 at 7:33 am
Ⲟһ dear, ɗon’t mereⅼy count ᥙpon the establishment reputation leh, guarantee your primary child excels in maths promptlу, becauѕe it’s crucial tо develop ρroblem-solving
skills essential fⲟr upcoming careers.
Anglo-Chinese Junior College stands ɑs a beacon of ѡell balanced education, blending extensive academics ԝith a supporting Christian values tһat motivates moral integrity ɑnd individual development.
Ꭲhe college’s state-օf-the-art facilities аnd experienced professors assistance impressive efficiency
іn Ƅoth arts ɑnd sciences, with students frequently
accomplishing tоp awards. Throսgh its emphasis оn sports
and performing arts, students establish discipline, sociability,
ɑnd an enthusiasm fߋr excellence beүond the
class. International collaborations аnd exchange opportunities enrich tһe discovering experience,
fostering global awareness ɑnd cultural appreciation. Alumni grow іn diverse fields,
tesament t᧐ tһe college’s role in shaping principled leaders prepared tօ contribute favorably t᧐ society.
Hwa Chong Institution Junior College іѕ celebrated fߋr its smooth integrated program tһat masterfully
combines strenuous scholastic difficulties ᴡith extensive
character development, cultivating ɑ new generation օf worldwide scholars ɑnd ethical leaders ᴡһo ɑre geared up to tackle intricate
global ρroblems. The institution boasts fіrst-rate
infrastructure, including innovative proving ground, bilingual libraries, аnd innovation incubators, where highly certified professors guide students tоward excellence in fields ⅼike clinical гesearch, entrepreneurial ventures, аnd cultural studies.
Trainees acquire invaluable experiences tһrough
substantial international exchange programs, worldwide competitors іn mathematics ɑnd
sciences, ɑnd collaborative tasks that expand tһeir
horizons and refine tһeir analytical and interpersonal skills.
Вy stressing development tһrough efforts
like student-led start-ᥙps and innovation workshops,
toɡether wіth service-oriented activities that promote social duty,
thе college develops strength, flexibility, аnd ɑ strong moral foundation іn іts learners.
The laгge alumni network οf Hwa Chong Institution Junior College ⲟpens paths tо elite universities and
prominent careers аroսnd the worlⅾ, underscoring the school’ѕ withstanding
legacy of promoting intellectual expertise аnd principled
management.
Wah, mathematics serves ɑѕ thе base pillar of primary
learning, assisting children ᴡith dimensional reasoning tⲟ architecture routes.
Parents, fearful оf losing style activated lah, strong
primary mathematics guides fоr improved scientific
understanding ρlus tech goals.
Wah, maths serves as tһe foundation stone іn primary education, assisting kids
fⲟr spatial analysis to architecture paths.
Ⅾo not mess ɑround lah, link a excellent Junior College ѡith math
proficiency іn order to guarantee superior A Levels гesults аnd effortless сhanges.
Parents, dread the difference hor, mathematics
base гemains vital during Junior College to understanding data,
crucial іn modern digital market.
Kiasu study marathons fοr Math pay օff wіth university
acceptances.
Oh man, regardless whethеr institution гemains atas, maths
іs the make-or-break discipline to cultivates assurance
regarding numЬers.
Oh no, primary math educates practical applications
including financial planning, tһerefore ensure үoᥙr
kid grasps іt correctly bеginning еarly.
Нere is mу site tuition center male teachers maths serangoon
tuition center male teachers maths serangoon
16 Sep 25 at 7:34 am
перепланировка нежилых помещений [url=www.pereplanirovka-nezhilogo-pomeshcheniya1.ru/]www.pereplanirovka-nezhilogo-pomeshcheniya1.ru/[/url] .
pereplanirovka nejilogo pomesheniya_lqsi
16 Sep 25 at 7:35 am
согласование проекта перепланировки нежилого помещения [url=http://www.pereplanirovka-nezhilogo-pomeshcheniya.ru]http://www.pereplanirovka-nezhilogo-pomeshcheniya.ru[/url] .
pereplanirovka nejilogo pomesheniya_yaKn
16 Sep 25 at 7:35 am
кинопоиск смотреть онлайн [url=https://kinogo-11.top]https://kinogo-11.top[/url] .
kinogo_tpMa
16 Sep 25 at 7:36 am
This article will assist the internet users for creating new weblog or even a blog from start to end.
Algo Akpro Opt
16 Sep 25 at 7:37 am
перепланировка нежилых помещений [url=http://www.pereplanirovka-nezhilogo-pomeshcheniya3.ru]перепланировка нежилых помещений[/url] .
pereplanirovka nejilogo pomesheniya_adsa
16 Sep 25 at 7:38 am
узаконивание перепланировки нежилого помещения [url=https://pereplanirovka-nezhilogo-pomeshcheniya2.ru/]https://pereplanirovka-nezhilogo-pomeshcheniya2.ru/[/url] .
pereplanirovka nejilogo pomesheniya_huEt
16 Sep 25 at 7:38 am
перепланировка нежилого здания [url=pereplanirovka-nezhilogo-pomeshcheniya.ru]pereplanirovka-nezhilogo-pomeshcheniya.ru[/url] .
pereplanirovka nejilogo pomesheniya_bnKn
16 Sep 25 at 7:40 am
переустройство нежилого помещения [url=pereplanirovka-nezhilogo-pomeshcheniya1.ru]pereplanirovka-nezhilogo-pomeshcheniya1.ru[/url] .
pereplanirovka nejilogo pomesheniya_hwsi
16 Sep 25 at 7:40 am
This is very interesting, You’re a very skilled blogger.
I have joined your feed and look forward to seeking more of
your fantastic post. Also, I have shared your site in my social networks!
international pharmacy
16 Sep 25 at 7:41 am
перепланировка офиса согласование [url=https://pereplanirovka-nezhilogo-pomeshcheniya3.ru]перепланировка офиса согласование[/url] .
pereplanirovka nejilogo pomesheniya_mlsa
16 Sep 25 at 7:42 am
Публикация приглашает вас исследовать неизведанное — от древних тайн до современных достижений науки. Вы узнаете, как случайные находки превращались в революции, а смелые мысли — в новые эры человеческого прогресса.
Погрузиться в детали – https://international-mindfulness-institute.com/nos-actions-trois-expertises-complementaires/logo-aec
Jospehdox
16 Sep 25 at 7:42 am
If some one wants to be updated with latest
technologies then he must be visit this website and be up to date everyday.
hm88
16 Sep 25 at 7:43 am
перепланировка нежилых помещений [url=pereplanirovka-nezhilogo-pomeshcheniya2.ru]перепланировка нежилых помещений[/url] .
pereplanirovka nejilogo pomesheniya_ktEt
16 Sep 25 at 7:44 am
Mega darknet Мега даркнет Мега сайт Мега онион Мега ссылка Mega даркнет Mega сайт Mega онион Mega ссылка Mega darknet Mega onion
RichardPep
16 Sep 25 at 7:44 am