Vogtos idėjos iš CGI::Application

CGI::Application yra puikus modulis Perlui, kuris leidžia išvengti ilgų „if/elsif/else“ blokų pagrindinėje web programos byloje. Pagrindinės bylos (tarkim index.pl) tikslas yra nuspręsti, kurį kodą vykdyti. Tarkime, per HTTP GET kintamąjį op perduodama informaciją, koks kodas turi būti įvykdytas. Tokiu atveju paprastas index.pl atrodytų kažkaip taip:

#!/usr/bin/perl -w
use CGI;
my $r = new CGI;
if($r->param('op') eq 'forumas') {
	# forumo kodas
} elsif($r->param('op') eq 'naujienos') {
	# naujienų kodas
} ...
...

Žodžiu po truputį viskas tampa didele koše (šios svetainės kol kas būtent taip ir atrodo). Su CGI::Application viskas daug gražiau ir paprasčiau: kiekvienam svetainės „moduliui“ sukuriamas atskiras Perlo modulis, o index.pl tik automagiškai užkrauna tą modulį ir jį paleidžia.

Ar galima kažką panašaus padaryt su PHP? Taip. Šitokį automagišką klasių užkrovimą teko matyti Flexi kode, tad tai tikrai ne nauja idėja. Tiesa, aš pats nesu nieko panašaus daręs, tad čia daugiau teoriniai pamąstymai.

Pirma reiktų apsirašyti index.php. Jo tikslas – nuspręsti, kurią klasę užkrauti, ir kam perduoti kontrolę. Tad galbūt užtektų tokio kodo:

<?php 
$galimos_klases = array('foo', 'bar');  # Čia reiktų imti iš kokio nors konfigūracinio failo.
if(isset($_GET['op']) && 
   in_array($_GET['op'], $galimos_klases) &&
   is_file($_GET['op'].'.class.php')) {
	include_once($_GET['op'].'.class.php');
	$foo =& new $_GET['op']();
	print $foo->output();
}
?>

Šis kodas faktiškai turėtų inkludint atitinkamas bylas, jei $_GET['op'] yra foo arba bar. Po inkludinimo, ji inicijuoja atitinkamą klasę (per $foo = new $_GET['op']();) ir iškviečia tos klasės funkciją output(). O šta čia kažkas panašaus į pačią foo.class.php bylą:

<?php
class foo {
	function foo() { }
	function output() {
		return "Aš iš foo klasės";
	}
}
?>

Šioje klasėje aprašome konstruktorių (kurs nieko nedaro) ir funkciją output(), kuri atspausdina vieną sakinį. Jei viskas eina pagal planą, iškvietus index.php?op=foo turėtų paleisti šią klasę. Bet tai tik teoriniai samprotavimai, šis kodas realiai nebandytas ;)

Comments Closed

6 Comments

  1. jei greitis nekencia, tai sakyciau ideja verta demesio. OOP vienok ;)

    as kazka panasaus turejau su phemplate – index.php?a=show

    ir uzkrauna show.php bei show.html kurie daro kas jiem priklauso.

  2. Na kiek matau…tai berods sita dalyka galima deface'inti :)

    include'inant klase is belekur su vardu is leidziamu vardu aibes. Ir nusluoti viska…galima nesunkiai ir pataisyti.

    Anyway as dabar apturiu gan gremezdiska projekta.Visiskai koses isvengiu su paprastu (tradiciniu?) metodu:

    $action = $_REQUEST['action'];

    $page = $_REQUEST['page'];

    $sub = $_REQUEST['sub'];

    switch($action)

    {

    case 'nu':

    switch($page)

    {

    case 'kazkas':



    break;

    }

    break;

    case 'boo':



    }

  3. Hmmm… Kaip defacinsi? Juk iš *leidžiamos aibės* tik galima inkludint.

    Būtent šis būdas ir išvengia košės su ilgu ilgu switch()…

    IMHO aišku.

Comments are closed.