Lydia: Visa tillgängliga kontrollers med Reflection

  • Författare
  • Meddelande
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11180
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Lydia: Visa tillgängliga kontrollers med Reflection

Inlägg19 mar 2012, 14:04

Detta är en del i tutorialen Lydia: ett PHP-baserat, MVC-inspirerat CMF. Senast uppdaterad 2012-03-19.

Använd Reflection API för att visa vilka kontroller och metoder som är tillgängliga i ramverket.


En översikt av tillgängliga kontroller och metoder

På index-sidan har jag tidigare visat vilka kontrollers och metoder som funnits implementerade. Jag har underhållit dem i en array och uppdaterat varje gång en ny kontroller och metod har implementerats. Visst borde det finnas ett mer automatiskt sätt att ha koll på de kontroller och metoder som är tillgängliga?

Viss finns det det. Med PHP's Reflection API kan vi analysera klasser och de metoder som finns i klasserna. Jag använder redan delar av detta i Lydias frontcontroller när jag väljer vilken kontroller och metod som skall anropas samtidigt som det kontrolleras om kontrollern och metoden finns. Via en enkel loop borde jag kunna gå igenom alla kontroller och lista de metoder som är tillgängliga att anropa. Resultatet skulle bli en lista över alla möjliga länkar som applikatonen svarar på. Vi gör ett försök.

Så här kan det se ut, en lista med tillgängliga kontrollerns skapade med hjälp av PHP Reflection.

Bild


Att loopa alla kontrollers efter publika metoder

Jag gör helt enkelt en loop kring alla kontrollers som jag definerat. För varje kontroller hämtar jag de metoder som är publikt tillgängliga. Detta innebär ju att en kontroller kan ha fler metoder men som inte är tillgängliga via webbläsaren. Med hjälp av detta skapar jag en array som innehåller samliga länkar som ramverket svarar på. Så här blev min kod i index-kontrollern.

CCIndex::Index()
Kod: Markera allt
  /**
   * Implementing interface IController. All controllers must have an index action.
   */
  public function Index() {         
    $this->views->SetTitle('Index Controller');
    $this->views->AddInclude(__DIR__ . '/index.tpl.php', array('menu'=>$this->Menu()));
  }


Själva menyn, arrayen med alla länkar, hämtas från $this->Menu().

CCIndex::Menu()
Kod: Markera allt
  /**
   * A menu that shows all available controllers/methods
   */
  private function Menu() {   
    $items = array();
    foreach($this->config['controllers'] as $key => $val) {
      if($val['enabled']) {
        $rc = new ReflectionClass($val['class']);
        $items[] = $key;
        $methods = $rc->getMethods(ReflectionMethod::IS_PUBLIC);
        foreach($methods as $method) {
          if($method->name != '__construct' && $method->name != '__destruct' && $method->name != 'Index') {
            $items[] = "$key/" . mb_strtolower($method->name);
          }
        }
      }
    }
    return $items;
  }


Som du ser så plockar jag bort metoder som heter __construct och __destruct samt Index. Jag vill inte visa de i den slutliga listan. För att visa resultatet använder jag en vy, index.tpl.php.

CCIndex/index.tpl.php
Kod: Markera allt
<h1>Index Controller</h1>
<p>This is what you can do for now.</p>

<?php foreach($menu as $val): ?>
<li><a href='<?=create_url($val)?>'><?=$val?></a> 
<?php endforeach; ?>   


Jag gillar verkligen de här små och kompakta vyerna. Smidigt. Dessutom gillar jag att använda de korta taggarna för PHP, de ger mer kompakt och läsbara template-filer.


Summering

Reflection API:et är klart användbart och kan användas på många sätt att analysera och presentera den kod som ramverket består av. Till exempel kan det kontrollera att en klass har ett visst sätt av metoder innan den tillåts anropas, detta kan vara bra när ramverket skall stödja klasser som andra utvecklare gjort, Ramverket kan kontrollera att en kontroller implementerar interfacet IController, om det inte görs så tillåter inte ramverket att den kontrollern aktiveras. Detta kan vara mycket användbart när man bygger en plugin-arkitektur på sitt ramverk.

Du kan testa min kod och se källkoden som vanligt via följande länkar.

http://dbwebb.se/lydia/tags/v0.2.04/
https://github.com/mosbth/lydia/tree/v0.2.04

Fortsätt med nästa tutorial.
...
..:
.... /mos

Vilka är online

Användare som besöker denna kategori: Google [Bot] och 31 gäster