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 no secret how President Donald Trump feels about sports teams turning away from Native American mascots. He’s repeatedly called for the return of the Washington Redskins and Cleveland Indians, claiming their recent rebrands were part of a “woke” agenda designed to erase history.
But one surprising team has really gotten the president’s attention: the Massapequa Chiefs.
The Long Island school district has refused to change its logo and name under a mandate from New York state banning schools from using team mascots appropriating Indigenous culture. Schools were given two years to rebrand, but Massapequa is the lone holdout, having missed the June 30 deadline to debut a new logo.
[url=https://kra-40—at.ru]kra40[/url]
The district lost an initial lawsuit it filed against the state but now has the federal government on its side. In May, Trump’s Department of Education intervened on the district’s behalf, claiming the state’s mascot ban is itself discriminatory.
Massapequa’s Chiefs logo — an American Indian wearing a yellow feathered headdress — is expected to still be prominently displayed when the fall sports season kicks off soon, putting the quiet Long Island hamlet at the center of a political firestorm.
[url=https://kra-40-at.com]kra39 cc[/url]
The district is now a key “battleground,” said Oliver Roberts, a Massapequa alum and the lawyer representing the school board in its fresh lawsuit against New York claiming that the ban is unconstitutional and discriminatory.
The Trump administration claims New York’s mascot ban violates Title VI of the Civil Rights Act of 1964, which prohibits recipients of federal funds from engaging in discriminatory behavior based on race, color or national origin — teeing up a potentially precedent-setting fight.
The intervention on behalf of Massapequa follows a pattern for a White House that has aggressively applied civil rights protections to police “reverse discrimination” and coerced schools and universities into policy concessions by withholding federal funds.
“Our goal is to assist nationally,” Roberts said. “It’s us putting forward our time and effort to try and assist with this national movement and push back against the woke bureaucrats trying to cancel our country’s history and tradition.”
kra40
https://kra-40cc.com
Brandonnot
1 Nov 25 at 4:34 pm
купить диплом в киселевске [url=https://www.rudik-diplom12.ru]купить диплом в киселевске[/url] .
Diplomi_thPi
1 Nov 25 at 4:35 pm
I’m really impressed with your writing skills and also with the layout on your weblog.
Is this a paid theme or did you customize it yourself?
Anyway keep up the excellent quality writing, it’s rare to see a great blog like this one
today.
avant consulting pte ltd
1 Nov 25 at 4:35 pm
mostbet скачать на андроид официального сайта [url=http://mostbet12033.ru]http://mostbet12033.ru[/url]
mostbet_kg_yxpa
1 Nov 25 at 4:35 pm
Irish Pharma Finder: top-rated pharmacies in Ireland – online pharmacy ireland
HaroldSHems
1 Nov 25 at 4:36 pm
ขอบคุณสำหรับข้อมูลเกี่ยวกับดอกไม้งานศพที่ชัดเจน
การรู้ว่าดอกไม้แต่ละชนิดมีความหมายอย่างไร ช่วยให้เลือกได้ตรงความรู้สึกมากขึ้น
ใครที่กำลังเตรียมตัวจัดงานศพให้คนสำคัญควรอ่านจริงๆ
Feel free to surf to my web-site: Fern
Fern
1 Nov 25 at 4:38 pm
купить диплом в соликамске [url=https://rudik-diplom7.ru]купить диплом в соликамске[/url] .
Diplomi_gmPl
1 Nov 25 at 4:41 pm
купить vip диплом техникума ссср [url=http://frei-diplom12.ru/]купить vip диплом техникума ссср[/url] .
Diplomi_kbPt
1 Nov 25 at 4:44 pm
Клиника «ЧСП№1» в Ростове-на-Дону предлагает услуги по выводу из запоя. Вы можете выбрать удобный для вас вариант: выезд нарколога на дом или лечение в стационаре. Все процедуры проводятся анонимно и с соблюдением конфиденциальности.
Подробнее – [url=https://vyvod-iz-zapoya-rostov25.ru/]вывод из запоя вызов[/url]
Donnienow
1 Nov 25 at 4:45 pm
купить диплом в белово [url=http://rudik-diplom7.ru/]http://rudik-diplom7.ru/[/url] .
Diplomi_yaPl
1 Nov 25 at 4:47 pm
топ seo компаний [url=https://reiting-seo-agentstv.ru/]reiting-seo-agentstv.ru[/url] .
reiting seo agentstv_lisa
1 Nov 25 at 4:47 pm
купить диплом об окончании техникума в москве [url=http://frei-diplom12.ru/]купить диплом об окончании техникума в москве[/url] .
Diplomi_ncPt
1 Nov 25 at 4:52 pm
best UK pharmacy websites [url=https://ukmedsguide.com/#]Uk Meds Guide[/url] non-prescription medicines UK
Hermanengam
1 Nov 25 at 4:52 pm
It’s no secret how President Donald Trump feels about sports teams turning away from Native American mascots. He’s repeatedly called for the return of the Washington Redskins and Cleveland Indians, claiming their recent rebrands were part of a “woke” agenda designed to erase history.
[url=https://kra37.org]kra40 сс [/url]
But one surprising team has really gotten the president’s attention: the Massapequa Chiefs.
The Long Island school district has refused to change its logo and name under a mandate from New York state banning schools from using team mascots appropriating Indigenous culture. Schools were given two years to rebrand, but Massapequa is the lone holdout, having missed the June 30 deadline to debut a new logo.
[url=https://kra—40-at.ru]kra40[/url]
The district lost an initial lawsuit it filed against the state but now has the federal government on its side. In May, Trump’s Department of Education intervened on the district’s behalf, claiming the state’s mascot ban is itself discriminatory.
Massapequa’s Chiefs logo — an American Indian wearing a yellow feathered headdress — is expected to still be prominently displayed when the fall sports season kicks off soon, putting the quiet Long Island hamlet at the center of a political firestorm.
[url=https://kra–40—at.ru]kra38[/url]
The district is now a key “battleground,” said Oliver Roberts, a Massapequa alum and the lawyer representing the school board in its fresh lawsuit against New York claiming that the ban is unconstitutional and discriminatory.
The Trump administration claims New York’s mascot ban violates Title VI of the Civil Rights Act of 1964, which prohibits recipients of federal funds from engaging in discriminatory behavior based on race, color or national origin — teeing up a potentially precedent-setting fight.
The intervention on behalf of Massapequa follows a pattern for a White House that has aggressively applied civil rights protections to police “reverse discrimination” and coerced schools and universities into policy concessions by withholding federal funds.
“Our goal is to assist nationally,” Roberts said. “It’s us putting forward our time and effort to try and assist with this national movement and push back against the woke bureaucrats trying to cancel our country’s history and tradition.”
kra40 at
kra40 cc
Michaelrup
1 Nov 25 at 4:53 pm
Marvelous, what a weblog it is! This blog provides valuable data to us, keep
it up.
situs bokep
1 Nov 25 at 4:54 pm
купить диплом логиста [url=www.rudik-diplom7.ru]купить диплом логиста[/url] .
Diplomi_jaPl
1 Nov 25 at 4:55 pm
https://savostin.pro/ukrinskie-banki-nadyozhnye/110-pp-nbu-blokiruet-bankovskie-karty-kak-kupit-usdt-za-nalichnye-kiev/
https://savostin.pro/ukrinskie-banki-nadyozhnye/110-pp-nbu-blokiruet-bankovskie-karty-kak-kupit-usdt-za-nalichnye-kiev/
1 Nov 25 at 4:55 pm
Heya i’m for the primary time here. I came across this board and I in finding It truly useful & it helped me out much.
I’m hoping to present one thing back and help others like you aided
me.
Contoh penerapan White SEO yang efektif
1 Nov 25 at 4:56 pm
мостбет скачать приложение на андроид [url=https://www.mostbet12033.ru]https://www.mostbet12033.ru[/url]
mostbet_kg_dmpa
1 Nov 25 at 4:58 pm
mostbet kg регистрация [url=https://mostbet12034.ru]mostbet kg регистрация[/url]
mostbet_kg_jdPr
1 Nov 25 at 4:58 pm
Hey folks, еven іf your kid enrolls ᴡithin а leading Junior
College іn Singapore, ѡithout a solid mathematics foundation, tһey may face difficulties ԝith A Levels text-based questions ɑnd lose opportunities fⲟr premium neⲭt-level spots lah.
Anglo-Chinese School (Independent) Junior College ᥙѕеs a faith-inspired education tһat harmonizes intellectual pursuits
with ethical values, empowering trainees tо end up
beіng thoughtful international people. Ιtѕ International Baccalaureate program motivates crucial thinking аnd inquiry,
supported Ƅy worlɗ-class resources ɑnd devoted
teachers. Students stand оut in a broad variety օf co-curricular activities,
fгom robotics to music, building adaptability аnd creativity.
The school’s emphasis on service learning imparts а sense оf responsibility and neighborhood engagement from an earlly stage.
Graduates ɑгe well-prepared for prominent universities, carrying forward а tradition оf excellence аnd stability.
River Valley Нigh School Junior College effortlessly integrates multilingual
education ѡith а strong commitment tоo ecological stewardship, supporting eco-conscious leaders ᴡho
havе sharp worldwide ρoint of views and a commitment to sustainable practices іn аn
progressively interconnected ᴡorld.The school’ѕ
innovative laboratories, green innovation centers, ɑnd eco-friendly
school styles support pioneering learning іn sciences, liberal arts, ɑnd environmental studies, encouraging
trainees t᧐ participate in hands-ߋn experiments
ɑnd ingenious services to real-wоrld difficulties.
Cultural immersion programs, ѕuch as language exchanges аnd heritage
trips, integrated ᴡith social work jobs focused
on conservation, improve students’ empathy, cultural intelligence, ɑnd uѕeful skills for favorable
social effect. Withіn a unified and encouraging community, participation іn sports teams, arts
societies, аnd management workshops promotes physical
wellness, team effort, аnd strength, producing well-balanced individuals
aⅼl ѕet fⲟr future undertakings. Graduates fгom River Valley
Ꮋigh School Junior College аre preferably positioned fоr success
in leading universities ɑnd professions, embodying tһe school’s core values ߋf
fortitude, cultural acumen, ɑnd a proactive technique tߋ international
sustainability.
Mums ɑnd Dads, fearful оf losing style engaged lah, strong primary
mathematics гesults to better science
comprehension рlus engineering goals.
Օh man, even if establishment remaіns atas, maths acts like the make-or-break subject
for cultivates assurance ᴡith numberѕ.
Alas, primary maths teaches practical ᥙѕes such аs budgeting,
thus guarantee your kid masters іt correctly starting уoung age.
Alas, ԝithout strong mathematics ԁuring Junior College, гegardless top
institution children may falter at secondary calculations, thhs cultivate іt now
leh.
Don’t be kiasu for nothing; ace уour A-levels to snag thosе scholarships ɑnd
avoid the competition lɑter.
Listen up, Singapore moms аnd dads, mathematics proves рerhaps tһе extremely іmportant primary topic, promoting creativity
іn challenge-tackling t᧐ innovative careers.
Ꭺlso visit mу web-site: maths tutor phone aapp
maths tutor phone aapp
1 Nov 25 at 4:59 pm
Ich habe einen Narren gefressen an Cat Spins Casino, es entfuhrt in eine Welt voller Spa?. Es gibt eine enorme Vielfalt an Spielen, mit interaktiven Live-Spielen. 100 % bis zu 500 € plus Freispiele. Erreichbar rund um die Uhr. Transaktionen sind immer sicher, von Zeit zu Zeit zusatzliche Freispiele waren ein Bonus. Im Gro?en und Ganzen, Cat Spins Casino garantiert langanhaltenden Spa?. Au?erdem die Seite ist schnell und ansprechend, jede Session unvergesslich macht. Ein bemerkenswertes Feature ist das VIP-Programm mit exklusiven Stufen, ma?geschneiderte Privilegien liefern.
https://catspinsbonus.com/|
sonicpowerik6zef
1 Nov 25 at 5:00 pm
pharmacy delivery Ireland
Edmundexpon
1 Nov 25 at 5:00 pm
Печать на сувенирах [url=www.dzen.ru/a/aP_ExCFsrTEIVLyn]www.dzen.ru/a/aP_ExCFsrTEIVLyn[/url] .
Vidi pechati na syvenirnoi prodykcii_trPr
1 Nov 25 at 5:01 pm
Мы стремимся к тому, чтобы каждый наш пациент в Ростове-на-Дону почувствовал заботу и внимание, получая качественную медицинскую помощь.
Исследовать вопрос подробнее – [url=https://vyvod-iz-zapoya-rostov235.ru/]вывод из запоя на дому недорого ростов-на-дону[/url]
Richardbit
1 Nov 25 at 5:02 pm
купить диплом без реестра [url=http://www.frei-diplom3.ru]купить диплом без реестра[/url] .
Diplomi_jdKt
1 Nov 25 at 5:02 pm
мостбет скачать казино [url=http://mostbet12034.ru/]мостбет скачать казино[/url]
mostbet_kg_rkPr
1 Nov 25 at 5:04 pm
https://vintfint.com/blogs/104241/Melbet-Bonus-Code-2026-RICH888-130-Offer
https://vintfint.com/blogs/104241/Melbet-Bonus-Code-2026-RICH888-130-Offer
1 Nov 25 at 5:05 pm
В Ростове-на-Дону клиника «Частный Медик 24» предлагает профессиональный вывод из запоя с современными методами детоксикации и инфузионной терапии.
Подробнее – [url=https://vyvod-iz-zapoya-rostov235.ru/]помощь вывод из запоя в ростове-на-дону[/url]
Richardbit
1 Nov 25 at 5:05 pm
https://t.me/s/ud_1XsLOtS
MichaelPione
1 Nov 25 at 5:06 pm
Клиника «ЧСП№1» в Ростове-на-Дону предлагает услуги по выводу из запоя. Вы можете выбрать удобный для вас вариант: выезд нарколога на дом или лечение в стационаре. Все процедуры проводятся анонимно и с соблюдением конфиденциальности.
Исследовать вопрос подробнее – [url=https://vyvod-iz-zapoya-rostov15.ru/]вывод из запоя ростов-на-дону[/url]
Robertodes
1 Nov 25 at 5:06 pm
trusted online pharmacy Ireland
Edmundexpon
1 Nov 25 at 5:08 pm
https://t.me/s/Ud_catcasINo
MichaelPione
1 Nov 25 at 5:09 pm
Ich bin abhangig von SpinBetter Casino, es fuhlt sich an wie ein Strudel aus Freude. Es wartet eine Fulle spannender Optionen, mit immersiven Live-Sessions. Die Agenten sind blitzschnell, verfugbar rund um die Uhr. Die Auszahlungen sind ultraschnell, gelegentlich zusatzliche Freispiele waren ein Highlight. Alles in allem, SpinBetter Casino ist absolut empfehlenswert fur Online-Wetten-Fans ! Nicht zu vergessen die Interface ist intuitiv und modern, fugt Magie hinzu. Ein Pluspunkt ist die Vielfalt an Zahlungsmethoden, die Flexibilitat bieten.
spinbettercasino.de|
SpinMasterZ7zef
1 Nov 25 at 5:11 pm
купить диплом нефтяного техникума в самаре [url=www.frei-diplom12.ru]купить диплом нефтяного техникума в самаре[/url] .
Diplomi_wrPt
1 Nov 25 at 5:11 pm
https://t.me/s/Ud_IZZI
MichaelPione
1 Nov 25 at 5:22 pm
https://t.me/s/Beefcasino_rus
MichaelPione
1 Nov 25 at 5:24 pm
Hey there! Do you use Twitter? I’d like to follow you if that
would be okay. I’m definitely enjoying your blog and look forward to new
updates.
situs scam
1 Nov 25 at 5:24 pm
Клиника «ЧСП№1» в Ростове-на-Дону предлагает услуги по выводу из запоя. Вы можете выбрать удобный для вас вариант: выезд нарколога на дом или лечение в стационаре. Все процедуры проводятся анонимно и с соблюдением конфиденциальности.
Подробнее можно узнать тут – [url=https://vyvod-iz-zapoya-rostov16.ru/]врач вывод из запоя[/url]
Donaldcer
1 Nov 25 at 5:24 pm
купить диплом техникума механика [url=http://frei-diplom12.ru/]купить диплом техникума механика[/url] .
Diplomi_osPt
1 Nov 25 at 5:26 pm
печать логотипка на ткани [url=dzen.ru/a/aP_ExCFsrTEIVLyn]dzen.ru/a/aP_ExCFsrTEIVLyn[/url] .
Vidi pechati na syvenirnoi prodykcii_cbPr
1 Nov 25 at 5:26 pm
Обновите интерьер вашего дома с помощью [url=https://csalon.ru/]Реставрация старых кресел[/url], которая придаст ей свежий и современный вид.
Третий шаг — это непосредственно сама перетяжка.
Перетяжка мебели в Волковыске
1 Nov 25 at 5:27 pm
купить диплом в северске [url=rudik-diplom12.ru]rudik-diplom12.ru[/url] .
Diplomi_uuPi
1 Nov 25 at 5:28 pm
Нey there are using WordPress for your blog platform?
I’m new to the blog worⅼd but I’m trying to get started and set uⲣ
my own. Do you require any html coding expertise to makе
your own bloց? Any heⅼp would be greatly aρpreciated!
my page: espion
espion
1 Nov 25 at 5:29 pm
WOW just what I was looking for. Came here by searching for video truyen nguoi lon 2025
xem ngay truyen nguoi lon full hd
1 Nov 25 at 5:29 pm
купить диплом техникума легко пять плюс [url=https://www.frei-diplom12.ru]купить диплом техникума легко пять плюс[/url] .
Diplomi_oyPt
1 Nov 25 at 5:33 pm
купить проведенный диплом в красноярске [url=www.frei-diplom3.ru]www.frei-diplom3.ru[/url] .
Diplomi_umKt
1 Nov 25 at 5:34 pm
My brother suggested I might like this website. He was entirely right.
This post truly made my day. You can not imagine just how much time I had spent for this info!
Thanks!
web site
1 Nov 25 at 5:34 pm
inclaz.com – Appreciate the typography choices; comfortable spacing improved my reading experience.
Camelia Delosantos
1 Nov 25 at 5:35 pm
I’ll immediately seize your rss as I can not
to find your e-mail subscription link or e-newsletter service.
Do you’ve any? Please let me realize so that I may subscribe.
Thanks.
Pertempuran Raja Hutan vs Raja Langit
1 Nov 25 at 5:36 pm