Je to luknja?

Živjo mojstri!
Napisal sem primer, za katerega me zanima ali je luknjast oz. ali lahko kak zlobnež pokliče kakšno neželjeno funkcijo. Jaz mislim da je ok.

Hvala za vaša mnenja :)

Primeri klicev:
http://localhost/test.php
http://localhost/test.php?action=test
http://localhost/test.php?action=blaaaa

<?php

class Mama
{
   protected $action;

   protected function indexAction(){
      return 'index akcija';
   }

   public function handle()
   {
      if(empty($this->action))
      {
         return $this->indexAction();
      }
      if(preg_match('/^[a-z_0-9]+$/i', $this->action))
      {
         return $this->{"{$this->action}Action"}();
      }
   }

   public function __call($name, $args)
   {
      return 'Akcija <b>'.htmlspecialchars($name).'</b> ne obstaja.';
   }
}

class Test extends Mama
{
   public function __construct()
   {
      if(isset($_GET['action']))
      {
         $this->action = $_GET['action'];
      }
   }

   protected function testAction(){
      return 'test';
   }
}

$test = new Test();
print($test->handle());

?>

4 odgovori

Po hitrem pregledu, razen neenakomernega code styla :P, jaz ne vidim problemov.
Offtopic: A Symfony2 components stuff je bil preveč? Ker avtor sedaj piše bloge s navodili kako ji uporabiti..

Kje pa vidiš, da uporablja oz. želi uporabljati Symfony2 ?

blackmamba: Jaz osebno, bi raje uporabil method_exists funkcijo.

@krho: Hehe, s code stylom sem se res 10 min zafrkaval, da sem vse text indente s presledki naredil itd, ekstra sem se še potrudil z { in \n{ ,ampak tebi nič ne uide :)

Nazadnje, ko si mi predlagaly Symfony2 si mi dal ogromno zanimivega branja in danes tudi, thx! Nekaj komponent sem tudi uporabil.
Routing komponente ne morem uporabiti, ker moj sistem generira url-je na drugačen način in do klica kontrolerjev je druga pot(podobna, ampak drugače :)).
Zgornji primer sem si izmislil samo za IM, da sem lahko približno razumljivo vprašal kaj me zanima.

@Slim: Pomojem je posumil na Symfony2 zaradi indexAction() :)
Se strinjam, __call() ni primarno namenjen za ugotavljanje ali funkcija obstaja. Tukaj pokličem default funkcije, kar sem v primeru zbrisal.

@SlimDeluxe: šlo je za komponente iz sf2 in ne za celoten framework. Zadnjič sem mu dal predlog za to.

@blackmamba: naredi razred, kateri implementira RouterInterface :), pa bi moralo iti tudi s Routing komponento.