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://hindustannewsjunction.com/aap-candidate-shot-referred-to-ludhiana
JerryGaick
17 Sep 25 at 7:23 am
можно ли купить диплом в реестре [url=www.arus-diplom34.ru/]можно ли купить диплом в реестре[/url] .
Diplomi_peer
17 Sep 25 at 7:23 am
мостбет авиатор [url=https://mostbet12015.ru/]https://mostbet12015.ru/[/url]
mostbet_maSr
17 Sep 25 at 7:23 am
Way cool! Some very valid points! I appreciate you penning this write-up and also the rest
off the webste is extremely good.
My web site: ucdm
ucdm
17 Sep 25 at 7:24 am
전국 마사지샵 채용 정보와 구직자를 연결하는 마사지 구인구직 플랫폼입니다.
마사지구인부터 마사지알바, 스웨디시구인까지,
신뢰할 수 있는 최신 채용 정보를 제공
마사지구인
17 Sep 25 at 7:25 am
купить диплом для техникума цена [url=www.educ-ua7.ru/]купить диплом для техникума цена[/url] .
Diplomi_kcEr
17 Sep 25 at 7:25 am
купить дипломы о высшем образовании срочно [url=www.educ-ua17.ru]купить дипломы о высшем образовании срочно[/url] .
Diplomi_rpSl
17 Sep 25 at 7:25 am
Публикация посвящена жизненным историям людей, успешно справившихся с зависимостью. Мы покажем, что выход есть, и он начинается с первого шага — принятия проблемы и желания измениться.
Хочу знать больше – https://фирмырф.рф/%D0%BC%D0%BE%D1%81%D0%BA%D0%B2%D0%B0/%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F/%D0%BD%D0%B0%D1%80%D0%BA%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F-%D0%BA%D0%BB%D0%B8%D0%BD%D0%B8%D0%BA%D0%B0-%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D0%BA%D0%BE%D1%80%D0%B0%D1%8F-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C-1-%D0%B2-%D0%BA%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B3%D0%BE%D1%80%D1%81%D0%BA%D0%B5
Samuelbuple
17 Sep 25 at 7:26 am
1win promokod [url=https://www.1win12018.ru]https://www.1win12018.ru[/url]
1win_ivet
17 Sep 25 at 7:27 am
мостбет киберспорт [url=https://mostbet4175.ru/]https://mostbet4175.ru/[/url]
mostbet_fhmi
17 Sep 25 at 7:27 am
Oi oi, Singapore parents, maths іs likely the extremely crucial primary
discipline, promoting imagination іn challenge-tackling to innovative jobs.
Avoid play play lah, link ɑ good Junior College pⅼᥙs maths excellence fⲟr assure
hiɡh A Levels scores as wеll as smooth transitions.
Folks, fear tһe gap hor, maths groundwork remains essential at Junior College tߋ understanding informatіon, essential ѡithin modern online market.
Anglo-Chinese Junior College stands аs a beacon ⲟf
weⅼl balanced education, mixing strenuous academics ᴡith a nurturing Christian values tһat influences ethical
stability ɑnd individual development. Ƭhe college’s modern centers ɑnd
knowledgeable professors assistance outstanding
efficiency іn Ьoth arts and sciences, witһ trainees often accomplishing leading awards.
Ꭲhrough itѕ focus on sports ɑnd performing arts, trainees develop discipline,
friendship, аnd an enthusiasm fߋr excellence beyοnd tһe
classroom. International collaborations аnd exchange opportunities enrich tһe
learning experience, fostering worldwide awareness аnd
cultural gratitude. Alumni prosper іn varied fields, testimony tо tһe college’s fuction іn forming principled leaders аll sеt tо
contribute favorably tо society.
Anglo-Chinese School (Independent) Junior College delivers
аn enhancing education deeply rooted іn faith, ԝherе intellectual exploration іs harmoniously stabilized ᴡith core ethical principles, guiding students tоwards ending
սp Ьeing compassionate аnd respоnsible
global citizens equipped tо address complex social difficulties.
Ꭲһe school’s distinguished International Baccalaureate
Diploma Programme promotes innovative vital thinking,
research study skills, ɑnd interdisciplinary knowing,
reinforced by extraordinary resources ⅼike dedicated innovation centers ɑnd expert faculty ѡho mentor students in accomplishing academic
distinction. Α broad spectrum of cο-curricular offerings, from innovative robotics clubs that encourage technological creativity tⲟ symphony orchestras tһat hone musical
skills, enables trainees tο find and fine-tune their special abilities in a supportive аnd revitalizing environment.
By incorporating service learning initiatives, ѕuch aѕ community
outreach tasks and volunteer programs ƅoth in yoᥙr area and worldwide, thе college cultivates ɑ strong sense of social duty, compassion, ɑnd active citizenship аmong its trainee body.
Graduates оf Anglo-Chinese School (Independent) Junior College аre
extremely welⅼ-prepared for entry intο elite universities
аll oveг the worlɗ, brіng with them а distinguished tradition ߋf scholastic
quality, personal integrity, ɑnd a dedication to lifelong learning аnd contribution.
Goodness, even though establishment гemains һigh-end, maths is the make-or-break subject to developing poise гegarding numbers.
Aiyah, primary math educates everyday implementations
ⅼike money management, ѕo ensure ʏour kid masters tһis riցht from yоung
age.
Oh man, even though school rеmains hiցh-еnd, mayhematics
іs tһe mɑke-оr-break topic in building confidence
іn figures.
Apаrt beyond institution facilities, concentrate ԝith mathematics tօ stop
typical mistakes lіke inattentive blunders durinhg tests.
Mums and Dads, fearful օf losing style оn lah, robust primary maths leads to superior STEM grasp ɑnd
engineering dreams.
Ⲟh, maths іs the base block of primary schooling,
helping kids іn geometric reasoning tⲟ building careers.
Ꭺ-level excellence showcases your potential tⲟ mentors and future bosses.
Oh, mathematics acts ⅼike the groundwork pillar оf primary schooling, aiding youngsters іn sptial
analysis іn architecture routes.
Aiyo, ѡithout solid mathematics аt Junior College, no matter
tօp school kids maʏ falter in secondary equations, tһus build tһat
now leh.
Ηere is my web blog; singapore Secondary School
singapore Secondary School
17 Sep 25 at 7:28 am
как купить легально диплом о высшем образовании [url=http://www.arus-diplom33.ru]как купить легально диплом о высшем образовании[/url] .
Diplomi_xmSa
17 Sep 25 at 7:28 am
kraken ссылка зеркало kraken onion, kraken onion ссылка, kraken onion зеркала, kraken рабочая ссылка onion, сайт kraken onion, kraken darknet, kraken darknet market, kraken darknet ссылка, сайт kraken darknet, kraken актуальные ссылки, кракен ссылка kraken, kraken официальные ссылки, kraken ссылка тор, kraken ссылка зеркало, kraken ссылка на сайт, kraken онион, kraken онион тор, кракен онион, кракен онион тор, кракен онион зеркало, кракен даркнет маркет, кракен darknet, кракен onion, кракен ссылка onion, кракен onion сайт, kra ссылка, kraken сайт, kraken актуальные ссылки, kraken зеркало, kraken ссылка зеркало, kraken зеркало рабочее, актуальные зеркала kraken, kraken сайт зеркала, kraken маркетплейс зеркало, кракен ссылка, кракен даркнет
RichardPep
17 Sep 25 at 7:28 am
Me enredei no algoritmo de PlayPix Casino, tem um ritmo de jogo que processa como um CPU. O catalogo de jogos e uma tela de emocoes. com caca-niqueis que reluzem como bytes. O atendimento esta sempre ativo 24/7. com ajuda que renderiza como um glitch. Os saques sao velozes como um upload. as vezes as ofertas podiam ser mais generosas. Na real, PlayPix Casino garante um jogo que reluz como pixels para os viciados em emocoes de cassino! Adicionalmente o design e fluido como um render. fazendo o cassino processar como um CPU.
como descongelar saldo playpix|
zapwhirlwindostrich3zef
17 Sep 25 at 7:29 am
Этот медицинский обзор сосредоточен на последних достижениях, которые оказывают влияние на пациентов и медицинскую практику. Мы разбираем инновационные методы лечения и исследований, акцентируя внимание на их значимости для общественного здоровья. Читатели узнают о свежих данных и их возможном применении.
Получить больше информации – https://llike.ru/moscow/narkologicheskaya_klinika_chastnaya_skoraya_pomoshch_1_v_mitishchah
Jasontor
17 Sep 25 at 7:29 am
согласование перепланировки нежилого помещения [url=http://pereplanirovka-nezhilogo-pomeshcheniya3.ru/]согласование перепланировки нежилого помещения[/url] .
pereplanirovka nejilogo pomesheniya_qjsa
17 Sep 25 at 7:32 am
купить диплом в киеве недорого [url=educ-ua4.ru]купить диплом в киеве недорого[/url] .
Diplomi_fzPl
17 Sep 25 at 7:32 am
Публикация посвящена жизненным историям людей, успешно справившихся с зависимостью. Мы покажем, что выход есть, и он начинается с первого шага — принятия проблемы и желания измениться.
Не упусти важное! – https://llike.ru/moscow/narkologicheskaya_klinika_chastnaya_skoraya_pomoshch_1_v_kolomne
JaredRex
17 Sep 25 at 7:32 am
Cactus Riches Cash Pool игра
Derekjency
17 Sep 25 at 7:32 am
I have been browsing online more than 2 hours today, yet I never
found any interesting article like yours. It is pretty worth enough for me.
In my view, if all website owners and bloggers made good content as you did, the internet will be
much more useful than ever before.
payung sablon
17 Sep 25 at 7:32 am
регистрация перепланировки нежилого помещения [url=http://pereplanirovka-nezhilogo-pomeshcheniya1.ru/]http://pereplanirovka-nezhilogo-pomeshcheniya1.ru/[/url] .
pereplanirovka nejilogo pomesheniya_rdsi
17 Sep 25 at 7:33 am
This article will help the internet visitors for creating new web site or even a blog
from start to end.
trang cá độ bóng đá uy tín
17 Sep 25 at 7:34 am
регистрация перепланировки нежилого помещения [url=https://pereplanirovka-nezhilogo-pomeshcheniya3.ru]https://pereplanirovka-nezhilogo-pomeshcheniya3.ru[/url] .
pereplanirovka nejilogo pomesheniya_ycsa
17 Sep 25 at 7:36 am
согласование перепланировки нежилого помещения в жилом доме [url=www.pereplanirovka-nezhilogo-pomeshcheniya.ru]www.pereplanirovka-nezhilogo-pomeshcheniya.ru[/url] .
pereplanirovka nejilogo pomesheniya_ieKn
17 Sep 25 at 7:36 am
перепланировка в нежилом помещении [url=https://pereplanirovka-nezhilogo-pomeshcheniya1.ru/]https://pereplanirovka-nezhilogo-pomeshcheniya1.ru/[/url] .
pereplanirovka nejilogo pomesheniya_xzsi
17 Sep 25 at 7:36 am
диплом внесенный в реестр купить [url=ic-info.ru/forum/user/197455]диплом внесенный в реестр купить[/url] .
Kypit diplom ob obrazovanii!_fokt
17 Sep 25 at 7:37 am
узаконить перепланировку нежилого помещения [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya3.ru]узаконить перепланировку нежилого помещения[/url] .
pereplanirovka nejilogo pomesheniya_wbsa
17 Sep 25 at 7:39 am
переустройство и перепланировка нежилого помещения [url=http://pereplanirovka-nezhilogo-pomeshcheniya1.ru]http://pereplanirovka-nezhilogo-pomeshcheniya1.ru[/url] .
pereplanirovka nejilogo pomesheniya_npsi
17 Sep 25 at 7:39 am
перепланировка нежилого здания [url=http://pereplanirovka-nezhilogo-pomeshcheniya.ru/]http://pereplanirovka-nezhilogo-pomeshcheniya.ru/[/url] .
pereplanirovka nejilogo pomesheniya_kzKn
17 Sep 25 at 7:41 am
купить диплом специалиста [url=educ-ua2.ru]купить диплом специалиста[/url] .
Diplomi_xlOt
17 Sep 25 at 7:41 am
online apotheke versandkostenfrei: Männer Kraft – medikament ohne rezept notfall
Donaldanype
17 Sep 25 at 7:41 am
смотреть русские сериалы [url=www.kinogo-11.top]www.kinogo-11.top[/url] .
kinogo_ukMa
17 Sep 25 at 7:42 am
Заказать диплом о высшем образовании!
Наши специалисты предлагаютвыгодно и быстро приобрести диплом, который выполняется на оригинальной бумаге и заверен печатями, водяными знаками, подписями. Данный документ способен пройти любые проверки, даже при помощи специально предназначенного оборудования. Решайте свои задачи быстро с нашим сервисом- [url=http://matchoptions.co.uk/jobsandcourses/companies/aurus-diplomany/]matchoptions.co.uk/jobsandcourses/companies/aurus-diplomany[/url]
Jariorpyu
17 Sep 25 at 7:43 am
диплом техникум купить [url=www.educ-ua7.ru]диплом техникум купить[/url] .
Diplomi_gnEr
17 Sep 25 at 7:43 am
узаконивание перепланировки нежилого помещения [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya.ru]https://www.pereplanirovka-nezhilogo-pomeshcheniya.ru[/url] .
pereplanirovka nejilogo pomesheniya_udKn
17 Sep 25 at 7:43 am
Hello to every body, it’s my first pay a visit of this web site; this webpage
includes amazing and really good material designed for readers.
J888
17 Sep 25 at 7:44 am
где купить диплом среднем [url=www.educ-ua20.ru/]где купить диплом среднем[/url] .
Diplomi_eyEn
17 Sep 25 at 7:44 am
What’s up i am kavin, its my first occasion to commenting anywhere, when i read this paragraph i thought i could also make comment due to this good piece of
writing.
jump showdown script
17 Sep 25 at 7:45 am
Купить онлайн кокаин, мефедрон, амф, альфа-пвп
Наш Skype «chemical-mix.com» временно недоступен по техническим причинам. Заказы принимаются все так же через сайт, сверка реквизитов по ICQ или электронной почте.
KennethImire
17 Sep 25 at 7:45 am
исторические фильмы [url=www.kinogo-11.top/]www.kinogo-11.top/[/url] .
kinogo_zrMa
17 Sep 25 at 7:46 am
купить диплом украина с занесением в реестр [url=https://knigilub.ru/blogs/https-malevich-biz/interesnoe-183736364.html]https://knigilub.ru/blogs/https-malevich-biz/interesnoe-183736364.html[/url] .
Priobresti diplom ob obrazovanii!_bokt
17 Sep 25 at 7:46 am
купить диплом техникума [url=https://educ-ua4.ru]купить диплом техникума[/url] .
Diplomi_faPl
17 Sep 25 at 7:47 am
проект перепланировки нежилого помещения [url=https://pereplanirovka-nezhilogo-pomeshcheniya3.ru]проект перепланировки нежилого помещения[/url] .
pereplanirovka nejilogo pomesheniya_aesa
17 Sep 25 at 7:47 am
купить аттестат за 11 кл украина [url=https://arus-diplom25.ru]купить аттестат за 11 кл украина[/url] .
Diplomi_znot
17 Sep 25 at 7:48 am
фильмы онлайн без подписки [url=www.kinogo-11.top/]www.kinogo-11.top/[/url] .
kinogo_hdMa
17 Sep 25 at 7:48 am
согласование перепланировки нежилых помещений [url=https://pereplanirovka-nezhilogo-pomeshcheniya1.ru/]https://pereplanirovka-nezhilogo-pomeshcheniya1.ru/[/url] .
pereplanirovka nejilogo pomesheniya_lwsi
17 Sep 25 at 7:48 am
Great post.
turkey visa for australian
17 Sep 25 at 7:49 am
купить аттестат об окончании 11 классов [url=www.educ-ua2.ru]купить аттестат об окончании 11 классов[/url] .
Diplomi_ngOt
17 Sep 25 at 7:49 am
купить диплом нового образца [url=https://www.educ-ua17.ru]купить диплом нового образца[/url] .
Diplomi_aqSl
17 Sep 25 at 7:49 am
купить диплом техникума [url=http://educ-ua7.ru]купить диплом техникума[/url] .
Diplomi_rjEr
17 Sep 25 at 7:50 am