PHP hook, building hooks in your application
Introduction
One of the real challenges in building any type of framework, core or application is making it possible for the developers to hook into the business logic at specific points. Since PHP is not event based, nor it works with interrupts you have to come up an alternative.
The test case
Lets assume we are the main developers of a webshop framework. Programmers can use our framework to build complete webshops. Programmers can manage the orders that are placed on the webshop with the order class. The order class is part of our framework and we don’t want it to be extended by any programmer. However we don’t want to limit to programmers in their possibilities to hook into the orders process.
For example programmers should be able to send an email to the webshopowner if an order changes from one specific delivery status to another. This functionality is not part of the default behavior in our framework and is custom for the progammers webshop implementation.
Like said before, PHP doesn’t provide interrupts or real events so we need to come up with another way to implement hooks into our application. Lets take a look at the observer pattern.
Implementing the Observer pattern
The observer pattern is a design-pattern that describes a way for objects to be notified to specific state-changes in objects of the application.
For the first implementation we can use SPL. The SPL provides in two simple objects:
SPLSubject
- attach (new observer to attach)
- detach (existing observer to detach)
- notify (notify all observers)
SPLObserver
- update (Called from the subject (i.e. when it’s value has changed).
iOrderRef = $iOrderRef;
// Get order information from the database or an other resources
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param SplObserver $oObserver
* @return void
*/
public function attach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param SplObserver $oObserver
* @return void
*/
public function detach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notify()
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function delete()
{
$this->notify();
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notify();
// ...
$this->iStatus = $iStatus;
// ...
$this->notify();
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements SplObserver
{
/**
* Previous orderstatus
* @var int
*/
protected $iPreviousOrderStatus;
/**
* Current orderstatus
* @var int
*/
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oSubject
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(SplSubject $oSubject)
{
if(!$oSubject instanceof Order) {
return;
}
if(is_null($this->iPreviousOrderStatus)) {
$this->iPreviousOrderStatus = $oSubject->getStatus();
} else {
$this->iCurrentOrderStatus = $oSubject->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oSubject->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attach(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->delete();
?>
There are several problems with the implementation above. To most important disadvantage is that we have only one update method in our observer. In this update method we don’t know when and why we are getting notified, just that something happened. We should keep track of everything that happens in the subject. (Or use debug_backtrace… just joking, don’t even think about using it that way ever!).
Taking it a step further, events
Lets take a look at the next example, we will extend the Observer implementation with some an additional parameter for the eventname that occured.
Finishing up, optional data
iOrderRef = $iOrderRef;
// Get order information from the database or something else...
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function attachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function detachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notifyObserver($sEvent, $mData=null)
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this, $sEvent, $mData);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function add($aOrder = array())
{
$this->notifyObserver('onAdd');
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notifyObserver('onBeforeUpdateStatus');
// ...
$this->iStatus = $iStatus;
// ...
$this->notifyObserver('onAfterUpdateStatus');
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements Observer_Interface
{
protected $iPreviousOrderStatus;
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oObservable
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(Observable_Interface $oObservable, $sEvent, $mData=null)
{
if(!$oObservable instanceof Order) {
return;
}
switch($sEvent) {
case 'onBeforeUpdateStatus':
$this->iPreviousOrderStatus = $oObservable->getStatus();
return;
case 'onAfterUpdateStatus':
$this->iCurrentOrderStatus = $oObservable->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oObservable->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attachObserver(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->add();
?>
Now we are able to take action on different events that occur.
Disadvantages
Although this implementation works quite well there are some drawbacks. One of those drawbacks is that we need to dispatch an event in our framework, if we don’t programmers can’t hook into our application. Triggering events everywhere give us a small performance penalty however I do think this way of working gives the programmers a nice way to hook into your application on those spots that you want them to hook in.
Just for the record
Notice that this code is just an example and can still use some improvements, for example: each observer is initialized even it will maybe never be notified, therefore I suggest to make use of lazy in some cases for loading the objects. There are other systems to hook into an application, more to follow!
купить аттестат [url=https://www.rudik-diplom14.ru]купить аттестат[/url] .
Diplomi_juea
2 Nov 25 at 6:37 pm
1xbet giri? g?ncel [url=www.1xbet-giris-5.com/]1xbet giri? g?ncel[/url] .
1xbet giris_roSa
2 Nov 25 at 6:39 pm
1xbet com giri? [url=http://1xbet-giris-2.com]http://1xbet-giris-2.com[/url] .
1xbet giris_lmPt
2 Nov 25 at 6:40 pm
1xbet guncel [url=1xbet-giris-4.com]1xbet-giris-4.com[/url] .
1xbet giris_kuSa
2 Nov 25 at 6:41 pm
купить диплом с реестром цена [url=http://frei-diplom3.ru]купить диплом с реестром цена[/url] .
Diplomi_oxKt
2 Nov 25 at 6:42 pm
купить диплом геодезиста [url=www.rudik-diplom6.ru]купить диплом геодезиста[/url] .
Diplomi_ogKr
2 Nov 25 at 6:45 pm
продвижение сайтов в топ 10 москва [url=http://reiting-kompanii-po-prodvizheniyu-sajtov.ru/]продвижение сайтов в топ 10 москва[/url] .
agentstvo poiskovogo prodvijeniya_wcKt
2 Nov 25 at 6:46 pm
диплом техникума купить в москве diploms 24 [url=https://frei-diplom10.ru]диплом техникума купить в москве diploms 24[/url] .
Diplomi_quEa
2 Nov 25 at 6:47 pm
купить диплом в благовещенске [url=https://www.rudik-diplom13.ru]купить диплом в благовещенске[/url] .
Diplomi_izon
2 Nov 25 at 6:50 pm
Здравствуйте!
Двигатели Cummins устанавливаются на множество моделей коммерческих автомобилей в России, включая КамАЗ, Газель и Валдай. Это мощные и надежные моторы, но они требуют грамотного ухода. Недавно я искал информацию по обслуживанию своего КамАЗа и наткнулся на полезный ресурс. На сайте https://specteh.blog/ подробно описаны все нюансы эксплуатации, ремонта и диагностики Cummins. Соблюдение регламента ТО и использование качественных расходных материалов продлевают срок службы двигателя и обеспечивают его надежную работу.
Cummins замена прокладок двигателя, Замена приводного ремня Cummins советы профессионалов, Cummins выпускная система ремонт
Cummins Валдай ISF 3.8 проверка турбины, [url=https://specteh.blog/shacman-v-rossii-obzor-dilerov-servisnyh-tsentrov-i-stoimost-obsluzhivaniya/]Shacman дилеры в России[/url], Cummins устройство двигателя обзор
Удачи и комфортной езды!
Cumminsmt
2 Nov 25 at 6:51 pm
купить диплом дизайнера [url=https://rudik-diplom1.ru]купить диплом дизайнера[/url] .
Diplomi_foer
2 Nov 25 at 6:51 pm
1xbet resmi [url=http://www.1xbet-giris-2.com]http://www.1xbet-giris-2.com[/url] .
1xbet giris_atPt
2 Nov 25 at 6:52 pm
non-prescription medicines UK: trusted online pharmacy UK – affordable medications UK
Johnnyfuede
2 Nov 25 at 6:52 pm
Your mode of explaining the whole thing in this piece of writing
is truly good, every one be capable of without difficulty be aware of it, Thanks a lot.
tải phim người lớn miễn phí
2 Nov 25 at 6:53 pm
купить диплом с занесением в реестры [url=www.frei-diplom3.ru/]купить диплом с занесением в реестры[/url] .
Diplomi_ovKt
2 Nov 25 at 6:53 pm
Кто знает, сколько обработка квартиры от клопов стоит за м2?
уничтожение клопов в мебели
KennethceM
2 Nov 25 at 6:53 pm
1xbet ?ye ol [url=https://1xbet-giris-4.com/]1xbet-giris-4.com[/url] .
1xbet giris_ljSa
2 Nov 25 at 6:54 pm
сео продвижение сайтов топ москва [url=www.reiting-kompanii-po-prodvizheniyu-sajtov.ru]сео продвижение сайтов топ москва[/url] .
agentstvo poiskovogo prodvijeniya_qsKt
2 Nov 25 at 6:54 pm
Wonderful goods from you, man. I have take into accout
your stuff prior to and you’re just too wonderful.
I really like what you have obtained here, certainly like what you are stating and
the way in which wherein you say it. You make it enjoyable and
you still take care of to stay it sensible. I can not wait to
learn much more from you. That is really a terrific site.
ankara kürtaj
2 Nov 25 at 6:55 pm
компания раскрутка сайтов [url=http://reiting-kompanii-po-prodvizheniyu-sajtov.ru]http://reiting-kompanii-po-prodvizheniyu-sajtov.ru[/url] .
agentstvo poiskovogo prodvijeniya_fjKt
2 Nov 25 at 6:55 pm
купить диплом журналиста [url=https://www.rudik-diplom6.ru]купить диплом журналиста[/url] .
Diplomi_qaKr
2 Nov 25 at 6:56 pm
https://t.me/s/Ud_LEX
AlbertTeery
2 Nov 25 at 6:58 pm
non-prescription medicines UK: affordable medications UK – non-prescription medicines UK
Johnnyfuede
2 Nov 25 at 7:00 pm
https://t.me/s/ud_CAsiNo_X
AlbertTeery
2 Nov 25 at 7:01 pm
seo продвижение россия [url=www.reiting-kompanii-po-prodvizheniyu-sajtov.ru/]seo продвижение россия[/url] .
agentstvo poiskovogo prodvijeniya_ukKt
2 Nov 25 at 7:01 pm
1xbet t?rkiye [url=https://www.1xbet-giris-6.com]1xbet t?rkiye[/url] .
1xbet giris_zrsl
2 Nov 25 at 7:02 pm
Օh no, primary maths teaches practical implementations
ⅼike money management, sо make ѕure yⲟur kid grasps іt correctly ƅeginning young age.
Eh eh, composed pom рi pi, math гemains among in thе highest topics iin Junior
College, laying base іn A-Level һigher calculations.
River Valley High School Junior College incorporates bilingualism аnd ecological stewardship, producing eco-conscious
leaders ԝith international perspectives. Cutting edge
labs ɑnd green initiatives support innovative learning іn sciences аnd liberal arts.
Students engage іn cultural immersions ɑnd service projects, improving compassion and skills.
Tһe school’s unified community promotes strength ɑnd teamwork
thгough sports and arts. Graduates are g᧐tten ready for success іn universities аnd beyond, embodying fortitude and
cultural acumen.
Hwa Chong Institution Junior College іs celebrated for itѕ smooth integrated program that masterfully combines rigorous academic obstacles
witһ profound character development, cultivating a brand-neѡ generation of
international scholars аnd ethical leaders ѡho ɑre equipped to deal ѡith complicated global рroblems.
Tһe imstitution boasts worⅼd-class infrastructure, including advanced гesearch centers, bilingual libraries, ɑnd innovation incubators, ѡһere highly
certified faculty guide trainees t᧐wards excellence іn fields ⅼike scientific гesearch study, entrepreneurial ventures, аnd
cultural studies. Trainees acquire indispensable experiences tһrough comprehensive international exchange programs,
global competitors іn mathematics and sciences, and collaborative
projects tһat broaden tһeir horizons and fine-tune tһeir analytical аnd interpersonal skills.
Ᏼy highlighting innovation tһrough initiatives ⅼike student-led start-uρs and innovation workshops,
along wіth service-oriented activities tһat promote social responsibility, tһe college builds
resilience, adaptability, ɑnd a strong ethical foundation in itѕ students.
The һuge alumni network of Hwa Chong Institution Junior College օpens pathways
to elite universities аnd influential professions tһroughout tһe woгld,underscoring tһe school’ѕ enduring
legacy οf promoting intellectual expertise аnd principled management.
Goodness, regɑrdless whether institution proves atas, maths serves ɑs
the critical subject foг cultivates assurance ᴡith calculations.
Oh no, primary math educates real-ѡorld ᥙses such
аs budgeting, tnus guarantee yolur youngster ɡets іt correctly ƅeginning young.
Wow, mathematics acts like the groundwork block іn primary education, assisting
children for geometric analysis for building routes.
Alas, ᴡithout solid math іn Junior College, еven leading establishment youngsters mаy falter at secondary equations, ѕo build
it promptlʏ leh.
Dοn’t slack in JC; Α-levels determine if ү᧐u ɡet into your dream couгѕе ⲟr settle for ⅼess.
Listen up, composed pom рi pі, math proves аmong іn the top subjects ⅾuring Junior College, laying groundwork tο A-Level higher calculations.
Іn ɑddition from institution amenities, emphasize սpon maths tߋ stop frequent errors including careless blunders аt exams.
My page: Dunearn Secondary
Dunearn Secondary
2 Nov 25 at 7:02 pm
1xbet g?ncel giri? [url=http://1xbet-giris-5.com]1xbet g?ncel giri?[/url] .
1xbet giris_qiSa
2 Nov 25 at 7:02 pm
купить диплом с занесением в реестр в украине [url=https://frei-diplom3.ru]https://frei-diplom3.ru[/url] .
Diplomi_rnKt
2 Nov 25 at 7:03 pm
compare online pharmacy prices [url=http://safemedsguide.com/#]SafeMedsGuide[/url] compare online pharmacy prices
Hermanengam
2 Nov 25 at 7:03 pm
irishpharmafinder: pharmacy delivery Ireland – best Irish pharmacy websites
HaroldSHems
2 Nov 25 at 7:03 pm
verified online chemists in Australia [url=http://aussiemedshubau.com/#]Aussie Meds Hub Australia[/url] verified online chemists in Australia
Hermanengam
2 Nov 25 at 7:04 pm
1xbetgiri? [url=www.1xbet-giris-5.com]www.1xbet-giris-5.com[/url] .
1xbet giris_ydSa
2 Nov 25 at 7:04 pm
online casino bonus codes
best real money online casinos
fast withdrawal online casino
top rated online casino
2 Nov 25 at 7:09 pm
UkMedsGuide: trusted online pharmacy UK – Uk Meds Guide
Johnnyfuede
2 Nov 25 at 7:10 pm
The availability of natural light significantly impacts the quality https://rentry.co/trovare-distributori-economici-prezzi-carburanti-risparmio-ottimizzazione-tempi
Robinkanty
2 Nov 25 at 7:10 pm
Irish Pharma Finder [url=https://irishpharmafinder.shop/#]trusted online pharmacy Ireland[/url] Irish online pharmacy reviews
Hermanengam
2 Nov 25 at 7:10 pm
Hi! Do you know if they make any plugins to protect against hackers?
I’m kinda paranoid about losing everything I’ve worked hard on. Any suggestions?
Live Draw Hk
2 Nov 25 at 7:10 pm
Oi oi, Singapore parents, mathematics proves ρrobably the highly crucial primary topic, fostering imagination іn challenge-tackling to
groundbreaking professions.
Nanyang Junior College champions multilingual excellence, blending cultural heritage
ԝith contemporary education tο nurture positive worldwide residents.
Advanced centers support strong programs іn STEM, arts, and humanities,
promoting innovation ɑnd imagination. Students thrive in ɑ vibrant community
ѡith opportunities for management and global exchanges.
Тhe college’ѕ emphasis on worths аnd resilience constructs character alongside
scholastic expertise. Graduates excel іn leading organizations, bring
forward а tradition of achievement ɑnd cultural gratitude.
Ⴝt. Andrew’s Junior College ԝelcomes Anglican worths tⲟ promote holistic
growth, cultivating principled people ѡith robust character traits tһrough a blend of spiritual guidance, scholastic pursuit, аnd neighborhood
participation in а warm and inclusive environment. Ꭲhe college’s contemporary facilities, including interactive class,
sports complexes, ɑnd creative arts studios, facilitate quality
tһroughout academic disciplines, sports programs tһat stress physical fitness аnd reasonable play, аnd creative endeavors tһat motivate
ѕelf-expression and innovation. Social ѡork initiatives, ѕuch as volunteer
partnerships ѡith regional organizations аnd outreach projects, instill empathy, social obligation, аnd a
sense off function, improving students’ instructional journeys.
Ꭺ varied variety of ⅽo-curricular activities, fгom
dispute societies tο musical ensembles, cultivates team effort, leadership skills, аnd individual
discovery, enabling еveгү trainee tߋ shine in tһeir chosen locations.
Alumni оf St. Andrew’s Junior College consistently emerge
ɑs ethical, resistant leaders ᴡho make meaningful
contributions to society, reflecting the organization’ѕ extensive effect
on developing ԝell-rounded, ѵalue-driven people.
Listen up, composed pom ρi pі, math remains one frߋm the top disciplines in Junior College, building groundwork fߋr A-Level advanced math.
Ᏼesides to establishment amenities, emphasize սpon mathematics іn order tⲟ prevent frequent pitfalls lіke careless blunders ɑt assessments.
Wah lao, no matter if establishment гemains һigh-end,
mathematics serves ɑѕ the critical subject fօr building confidence гegarding calculations.
Parents, worry ɑbout the disparity hor, math foundation rеmains vital in Junior College fօr understanding іnformation, vital f᧐r current
tech-driven systеm.
Be kiasu аnd balance studies with rest; burnout һurts
A-level outcomes.
Listen սp, Singapore folks, math remains рerhaps tһe
mߋst essential primary topic, promoting creativity thгough challenge-tackling іn innovative careers.
Аlso visit mү web blog number of maths tuition centres in singapore
number of maths tuition centres in singapore
2 Nov 25 at 7:10 pm
online pharmacy reviews and ratings: SafeMedsGuide – buy medications online safely
HaroldSHems
2 Nov 25 at 7:12 pm
https://t.me/official_1win_aviator/151
BluffMaster
2 Nov 25 at 7:13 pm
топ seo продвижение заказать [url=https://reiting-kompanii-po-prodvizheniyu-sajtov.ru/]https://reiting-kompanii-po-prodvizheniyu-sajtov.ru/[/url] .
agentstvo poiskovogo prodvijeniya_kxKt
2 Nov 25 at 7:14 pm
Yes! Finally someone writes about 부천출장마사지.
부천출장마사지
2 Nov 25 at 7:14 pm
1xbet turkey [url=https://1xbet-giris-2.com/]1xbet-giris-2.com[/url] .
1xbet giris_moPt
2 Nov 25 at 7:14 pm
https://t.me/s/ud_gIZbo
AlbertTeery
2 Nov 25 at 7:14 pm
1x giri? [url=http://www.1xbet-giris-4.com]http://www.1xbet-giris-4.com[/url] .
1xbet giris_lwSa
2 Nov 25 at 7:15 pm
Collaborative οn-line obstacles at OMT construct teamwork іn mathematics, fostering love аnd cumulative inspiration for examinations.
Join ᧐ur smаll-grоup on-site classes in Singapore f᧐r customized guidance іn a nurturing environment tһɑt constructs strong foundational mathematics skills.
Ԝith trainees in Singapore starting formal math education fгom tthe fiгst day
аnd facing hіgh-stakesassessments, math tuition սѕes
thе additional edge required tⲟ attain leading efficiency іn this important subject.
Tuition emphasizes heuristic analytical аpproaches, crucial fօr dealing with PSLE’ѕ challenging ѡorԁ issues thɑt require multiple steps.
Normal simulated Ⲟ Level exams іn tuition setups simulate rreal ρroblems,
allowing tainees to improve theіr strategy and minimize errors.
Ⅴia routine mock examinations ɑnd detailed feedback, tuition assists junior college pupils identify ɑnd fix weak points prior tߋ tһe actual A Levels.
OMT stands apart wіtһ its syllabus сreated to sustain MOE’s Ьy including mindfulness methods tо
decrease math anxiousness tһroughout researches.
OMT’s online ѕystem matches MOE syllabus one, assisting you deal ᴡith PSLE
mathematics effortlessly аnd far bettеr
scores.
Math tuition nurtures ɑ development attitude, encouraging Singapore
pupils tօ view challenges аs possibilities for test excellence.
Mʏ webpage: a levels math biology chemistry physics
tuitionn singapore (Agnes)
Agnes
2 Nov 25 at 7:15 pm
https://t.me/s/ud_IRwiN
AlbertTeery
2 Nov 25 at 7:16 pm
компания продвижение сайтов [url=https://reiting-kompanii-po-prodvizheniyu-sajtov.ru]https://reiting-kompanii-po-prodvizheniyu-sajtov.ru[/url] .
agentstvo poiskovogo prodvijeniya_jtKt
2 Nov 25 at 7:16 pm
birxbet [url=http://1xbet-giris-5.com/]http://1xbet-giris-5.com/[/url] .
1xbet giris_sjSa
2 Nov 25 at 7:16 pm