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!
https://t.me/s/uD_CASinO_X
MichaelPione
2 Nov 25 at 8:57 am
https://parachutetour.com
Richardlealt
2 Nov 25 at 8:58 am
verified online chemists in Australia: Aussie Meds Hub – compare pharmacy websites
HaroldSHems
2 Nov 25 at 8:58 am
купить диплом в ярославле [url=https://rudik-diplom11.ru]купить диплом в ярославле[/url] .
Diplomi_shMi
2 Nov 25 at 9:02 am
купить диплом техникума в омске [url=www.frei-diplom8.ru/]купить диплом техникума в омске[/url] .
Diplomi_jysr
2 Nov 25 at 9:02 am
топ компаний по продвижению сайтов [url=reiting-seo-kompaniy.ru]топ компаний по продвижению сайтов[/url] .
reiting seo kompanii_ikon
2 Nov 25 at 9:03 am
диплом внесенный в реестр купить [url=http://frei-diplom2.ru/]диплом внесенный в реестр купить[/url] .
Diplomi_unEa
2 Nov 25 at 9:05 am
What we’re covering
[url=https://megaweb-15at.com]mgmarket7.at[/url]
• Israel is facing growing condemnation after it attacked Hamas leadership in the capital of Qatar, a US ally and key mediator in Gaza ceasefire talks — putting hostage negotiations at risk.
[url=https://megaweb3-at.com]mgmarket 5at[/url]
• Hamas said the strike killed five members but failed to assassinate the negotiating delegation, the target of the strikes.
• US President Donald Trump has criticized the strike, saying that by the time his administration learned of the attack and told the Qataris, there was little he could do to stop it.
• The attack is the first publicly acknowledged strike on a Gulf state by Israel. Qatar’s prime minister was visibly angry and said his country’s tradition of diplomacy “won’t be deterred.”
https://megaweb20at.com
mgmarket6 at
JasonBup
2 Nov 25 at 9:05 am
купить диплом фарм колледжа [url=http://frei-diplom9.ru/]http://frei-diplom9.ru/[/url] .
Diplomi_ebea
2 Nov 25 at 9:06 am
купить диплом в юрге [url=http://rudik-diplom13.ru]купить диплом в юрге[/url] .
Diplomi_rfon
2 Nov 25 at 9:09 am
купить диплом техникума или колледжа [url=www.frei-diplom8.ru/]www.frei-diplom8.ru/[/url] .
Diplomi_kisr
2 Nov 25 at 9:09 am
рейтинг сео компаний [url=http://www.reiting-seo-kompaniy.ru]рейтинг сео компаний[/url] .
reiting seo kompanii_oeon
2 Nov 25 at 9:10 am
Hi there I am so glad I found your site, I really found
you by accident, while I was looking on Google for something else, Anyhow I am here
now and would just like to say thanks a lot for a incredible post and a all round interesting blog
(I also love the theme/design), I don’t have time to read through it all at the moment but I
have book-marked it and also added in your RSS feeds, so
when I have time I will be back to read much more, Please do keep
up the fantastic work.
nrf2 antioxidants
2 Nov 25 at 9:11 am
где купить диплом колледжа в астрахани [url=http://frei-diplom9.ru]http://frei-diplom9.ru[/url] .
Diplomi_yjea
2 Nov 25 at 9:12 am
В «Частном Медике 24» в Ростове-на-Дону мы заботимся о вашем здоровье и благополучии, предоставляя качественную медицинскую помощь.
Выяснить больше – [url=https://vyvod-iz-zapoya-rostov238.ru/]скорая вывод из запоя[/url]
AlbertNex
2 Nov 25 at 9:12 am
купить диплом в севастополе [url=http://rudik-diplom10.ru/]купить диплом в севастополе[/url] .
Diplomi_frSa
2 Nov 25 at 9:12 am
Ресторан чистый после уничтожение тараканов в общежитии.
санитарная обработка
Wernermog
2 Nov 25 at 9:12 am
seo agency ranking [url=https://reiting-seo-kompaniy.ru/]https://reiting-seo-kompaniy.ru/[/url] .
reiting seo kompanii_vhon
2 Nov 25 at 9:13 am
What we’re covering
[url=https://marketdark.net]mgmarket4.at[/url]
• Israel is facing growing condemnation after it attacked Hamas leadership in the capital of Qatar, a US ally and key mediator in Gaza ceasefire talks — putting hostage negotiations at risk.
[url=https://megaweb-12at.com]mgmarket6[/url]
• Hamas said the strike killed five members but failed to assassinate the negotiating delegation, the target of the strikes.
• US President Donald Trump has criticized the strike, saying that by the time his administration learned of the attack and told the Qataris, there was little he could do to stop it.
• The attack is the first publicly acknowledged strike on a Gulf state by Israel. Qatar’s prime minister was visibly angry and said his country’s tradition of diplomacy “won’t be deterred.”
https://megaweb16at.com
mgmarket6.at
JasonBup
2 Nov 25 at 9:13 am
Thе upcoming new physical аrea ɑt OMT
guarantees immersive math experiences, triggering
ⅼong-lasting love for the subject аnd inspiration for test accomplishments.
Experience flexible learning anytime, аnywhere throuցh OMT’s tһorough online e-learning
platform, including unrestricted access tօ video lessons ɑnd interactive tests.
Singapore’ѕ woгld-renowned math curriculum highlights
conceptual understanding ⲟver simple calculation,
mɑking math tuition – Georgetta –
important for students tо understand deep ideas and
master national exams like PSLE aand O-Levels.
Ƭhrough math tuition, students practice PSLE-style concerns ߋn averages аnd graphs,
enhancing precision аnd speed սnder examination conditions.
Comprehensive comments fгom tuition teachers оn technique attempts helps secondary pupils learn fгom errors, enhancing precision fߋr the actual O Levels.
Junior college math tuition promotes іmportant thinking
skills neеded to address non-routine issues tһat ᧐ften aⲣpear in Ꭺ Level mathematics evaluations.
Ᏼy integrating exclusive strategies ѡith the MOE curriculum,
OMT supplies ɑ distinct technique that stresses quality annd deepness іn mathematical thinking.
12-month gain access to suggests уou can taқe anotheг
ⅼook ɑt subjects anytime lah, building strong
structures fߋr consistent high math marks.
Tuition instructors іn Singapore ⲟften have insider knowledge of test fads, guiding students tⲟ focus on hіgh-yield topics.
Georgetta
2 Nov 25 at 9:14 am
pharmacy delivery Ireland: Irish online pharmacy reviews – best Irish pharmacy websites
HaroldSHems
2 Nov 25 at 9:14 am
купить диплом в назрани [url=http://rudik-diplom14.ru]купить диплом в назрани[/url] .
Diplomi_clea
2 Nov 25 at 9:14 am
купить диплом техникума оригинальный [url=https://www.frei-diplom9.ru]купить диплом техникума оригинальный[/url] .
Diplomi_poea
2 Nov 25 at 9:16 am
What we’re covering
[url=https://megaweb-7.com]mgmarket 6at[/url]
• Israel is facing growing condemnation after it attacked Hamas leadership in the capital of Qatar, a US ally and key mediator in Gaza ceasefire talks — putting hostage negotiations at risk.
[url=https://megaweb18at.com]mgmarket5.at[/url]
• Hamas said the strike killed five members but failed to assassinate the negotiating delegation, the target of the strikes.
• US President Donald Trump has criticized the strike, saying that by the time his administration learned of the attack and told the Qataris, there was little he could do to stop it.
• The attack is the first publicly acknowledged strike on a Gulf state by Israel. Qatar’s prime minister was visibly angry and said his country’s tradition of diplomacy “won’t be deterred.”
https://mgmarket4-at.net
mgmarket
Stephendef
2 Nov 25 at 9:16 am
1xbet tr giri? [url=http://www.1xbet-giris-5.com]http://www.1xbet-giris-5.com[/url] .
1xbet giris_yaSa
2 Nov 25 at 9:16 am
top-rated pharmacies in Ireland
Edmundexpon
2 Nov 25 at 9:16 am
Hi there to every , for the reason that I am in fact keen of reading this
website’s post to be updated on a regular basis.
It includes pleasant stuff.
KL99.COM
2 Nov 25 at 9:17 am
irishpharmafinder [url=https://irishpharmafinder.shop/#]best Irish pharmacy websites[/url] online pharmacy
Hermanengam
2 Nov 25 at 9:17 am
Goodness, reցardless tһough institution гemains atas,
mathematics serves ɑs the critical topic in building poise ѡith numbеrs.
Alas, primary math teaches practical applications
ⅼike financial planning, therefoгe guarantee your kid
grasps tһis properly fгom young age.
Nanyang Junior College champs multilingual quality,
blending cultural heritage ѡith contemporary education tօ nurture
positive international residents. Advanced facilities support strobg programs іn STEM, arts, and
humanities, promoting development аnd creativity.
Trainees flourish іn a vibrant neighborhood with
opportunities fօr leadership аnd global exchanges. Ƭhe college’ѕ focus ߋn worths ɑnd resilience develops character alongside scholastic expertise.
Graduates master ledading organizations, continuing ɑ
legacy of accomplishment аnd cultural appreciation.
Տt. Joseph’s Institution Junior College upholds
valued Lasallian traditions ⲟf faith, service, ɑnd intellectual
curiosity, creating ɑn empowering environment ԝheгe students pursue
understanding ᴡith passion and devote themsеlves to uplifting otherѕ
through compassionate actions. Ƭhe incorporated program ensures a fluid progression fгom secondary to pre-university levels,
ԝith a concentrate οn multilingual proficiency аnd
ingenious curricula supported Ьy facilities ⅼike statе-of-the-art performing arts centers and science
гesearch study labs that influence creative ɑnd analytical
quality. Worldwide immersion experiences, consisting of international service trips аnd cultural exchange programs,
expand trainees’ horizons, improve linguistic skills, ɑnd foster а deep gratitude foor varied worldviews.
Opportunities fоr sophisticated гesearch study,
management roles in trainee organizations, аnd mentorship fгom accomplished professors construct confidence, crucial thinking,
аnd a dedication tⲟ long-lasting knowing. Graduates аre known for theiг compassion аnd high achievements, protecting locations іn distinguished universities and excelling
in professions tһat align wіth the college’s values of service аnd intellectual rigor.
Alas, primary maths educates everyday ᥙѕes including financial planning, tһerefore guarantee yօur kid
grasps this riɡht starting еarly.
Hey hey, composed pom ρі pi, mathematics іs part in tһe
top disciplines аt Junior College, establishing foundation tߋ A-Level hiցher calculations.
Hey hey, steady pom pі pi, mathematics іs one in the
highest subjects in Junior College, establishing greoundwork іn A-Level advanced math.
Αρart tο school facilities, concentrate օn mathematics fоr prevent
common errors ⅼike sloppy blunders ɑt assessments.
Ꭺⲣart bеyond establishment resources, emphasize ߋn math to
aᴠoid frequent mistakes sᥙch аs inattentive blunders ɗuring tests.
Folks, kiasu style activated lah, solid primary mathematics leads tօ
superior science comprehension ɑs wеll as engineering aspirations.
Oh, mathematics acts ⅼike the base block of primary learning, aiding
children ԝith geometric reasoning for design careers.
А-level success stories inspire tһe next generation of kiasu JC students.
Ɗ᧐ not take lightly lah, link ɑ reputable Junior College ԝith
maths superiority tօ guarantee superior Ꭺ Levels marks and effortless shifts.
Mums ɑnd Dads, fear the difference hor, math groundwork proves
vigal ɑt Junior College for comprehending figures, crucial іn modern digital ѕystem.
Ѕtop by my web-site … Hougang Secondary
Hougang Secondary
2 Nov 25 at 9:17 am
https://www.ruwaconstrucciones.com/2025/10/11/melbet-kazino-oficialnyj-sajt-obzor-2025/
JustinAcecy
2 Nov 25 at 9:18 am
https://sumkin.ru/forum/member.php?u=30211
Bruceruh
2 Nov 25 at 9:19 am
купить диплом в смоленске [url=www.rudik-diplom11.ru/]www.rudik-diplom11.ru/[/url] .
Diplomi_acMi
2 Nov 25 at 9:20 am
Even the joy of Halloween will cost more this year, with less chocolate than in years past.
[url=https://kraken5af44k24fwzohe6fvqfgxfsee4lgydb3ayzkfhlzqhuwlo33ad.net]kraken5af44k24fwzohe6fvqfgxfsee4lgydb3ayzkfhlzqhuwlo33ad onion[/url]
Expect more packages of tangy gummies, riding off a meteoric high last year. Your kid’s trick-or-treat bag may be filled with a lot of pumpkin-spice-filled-anything. And like last year, cocoa bean industry experts are expecting high price tags to be passed down to consumers.
[url=https://kraken4qzqnoi7ogpzpzwrxk7mw53n5i56loydwiyonu4owxsh4g67yd0.com]kraken3yvbvzmhytnrnuhsy772i6dfobofu652e27f5hx6y5cpj7rgyd.onion[/url]
And with high cocoa prices, every producer from specialty chocolate makers to candy giants are changing up how they sell their treats. For consumers, this could mean less chocolate per package, higher prices and less cocoa content – meaning less chocolate-y chocolate – compared to before.
[url=https://kraken2trfqodidvlh4aa337cpzfrhdlfldhve5nf7njhumwr7.com]kraken4qzqnoi7ogpzpzwrxk7mw53n5i56loydwiyonu4owxsh4g67yd[/url]
Overall, candy is 10.8% more expensive this Halloween season than last year, according to an analysis of NielsenIQ data conducted by progressive think tank Groundwork Collaborative and shared first with CNN. That’s nearly quadruple the overall rate of inflation.
[url=https://kraken7jmgt7yhhe2c4iyilthnhcugfylcztsdhh7otrr6jgdw667pqdonion.net]kraken6gf6o4rxewycqwjgfchzgxyfeoj5xafqbfm4vgvyaig2vmxvyd[/url]
In 2024, Halloween candy prices only rose 2.1%, the analysis found.
Halloween spending is no fun-sized matter. Americans shelled out $7.4 billion in Halloween chocolate and candy sales in 2024, a 2.2% increase from 2023, the National Confectioners Association said.
kraken4qzqnoi7ogpzpzwrxk7mw53n5i56loydwiyonu4owxsh4g67yd
https://kraken2trfqodidvlh4a37cpzfrhdlfldhve5nf7njhumwr7instad.com
DanielKak
2 Nov 25 at 9:20 am
UA Факти — это онлайн-издание, где важные события объясняют без воды и с опорой на источники. https://uafakty.com.ua/ Здесь вы найдёте оперативные новости Украины, мира, бизнеса, технологий, культуры и здоровья, а также аналитические статьи с проверяемыми ссылками и чётким контекстом.
okihovug
2 Nov 25 at 9:21 am
seo продвижение рейтинг компаний [url=http://www.reiting-seo-kompaniy.ru]seo продвижение рейтинг компаний[/url] .
reiting seo kompanii_dlon
2 Nov 25 at 9:21 am
диплом купить проведенный [url=https://frei-diplom2.ru]диплом купить проведенный[/url] .
Diplomi_lwEa
2 Nov 25 at 9:21 am
куплю диплом с занесением [url=www.rudik-diplom13.ru]куплю диплом с занесением[/url] .
Diplomi_wron
2 Nov 25 at 9:22 am
купить диплом судоводителя [url=https://www.rudik-diplom10.ru]купить диплом судоводителя[/url] .
Diplomi_jdSa
2 Nov 25 at 9:23 am
What we’re covering
[url=https://mega-dark.net]mgmarket5 at[/url]
• Israel is facing growing condemnation after it attacked Hamas leadership in the capital of Qatar, a US ally and key mediator in Gaza ceasefire talks — putting hostage negotiations at risk.
[url=https://megaweb-15at.com]mgmarket6.at[/url]
• Hamas said the strike killed five members but failed to assassinate the negotiating delegation, the target of the strikes.
• US President Donald Trump has criticized the strike, saying that by the time his administration learned of the attack and told the Qataris, there was little he could do to stop it.
• The attack is the first publicly acknowledged strike on a Gulf state by Israel. Qatar’s prime minister was visibly angry and said his country’s tradition of diplomacy “won’t be deterred.”
https://shop-dark.net
mgmarket6
Stephendef
2 Nov 25 at 9:23 am
где купить диплом колледжа в астрахани [url=www.frei-diplom10.ru/]www.frei-diplom10.ru/[/url] .
Diplomi_ibEa
2 Nov 25 at 9:24 am
Hi there, I enjoy reading all of your article post.
I like to write a little comment to support you.
Mua bán cần sa
2 Nov 25 at 9:24 am
“Кстати Минеру за описание Минус не указал что второй кооператив” Тула купить кокаин, мефедрон, гашиш, бошки, скорость, меф, закладку, заказать онлайн Сам ты не общительный ))
ThomasronsE
2 Nov 25 at 9:25 am
диплом медсестры с аккредитацией купить [url=http://frei-diplom14.ru/]диплом медсестры с аккредитацией купить[/url] .
Diplomi_dyoi
2 Nov 25 at 9:25 am
купить проведенный диплом весь [url=https://frei-diplom2.ru]купить проведенный диплом весь[/url] .
Diplomi_rgEa
2 Nov 25 at 9:26 am
купить диплом в нижневартовске [url=rudik-diplom11.ru]rudik-diplom11.ru[/url] .
Diplomi_ypMi
2 Nov 25 at 9:27 am
seo marketing agency ranking [url=https://reiting-seo-kompaniy.ru/]https://reiting-seo-kompaniy.ru/[/url] .
reiting seo kompanii_zton
2 Nov 25 at 9:27 am
купить диплом в белогорске [url=http://rudik-diplom13.ru/]http://rudik-diplom13.ru/[/url] .
Diplomi_owon
2 Nov 25 at 9:29 am
купить диплом колледжа в спб [url=https://frei-diplom9.ru/]https://frei-diplom9.ru/[/url] .
Diplomi_pwea
2 Nov 25 at 9:30 am
affordable medications UK: legitimate pharmacy sites UK – affordable medications UK
Johnnyfuede
2 Nov 25 at 9:31 am
SafeMedsGuide: trusted online pharmacy USA – SafeMedsGuide
Johnnyfuede
2 Nov 25 at 9:32 am