Skip to content

July 23, 2010

[php] Command Pattern

Heute gibt es also einen weitern Beitrag zum Thema Pattern’s, dem “Command Pattern”. In meinem letzen Betrag ging es um das Singelton Pattern.

So nun zum Thema. Wir haben folgendes “Problem”, unser Kunde hat ein normales Webhosting Paket irgendwo bei einem Hoster, er möchte dort nun Datenbank Backups über eine im Web verfügbare Grafische Oberfläche steuern. Da der Provider selbst kein so ein Tool anbietet, habt ihr den Auftrag erhalten dieses Programm zu realisieren. Der knack Punkt an der Sache ist das er keinen Shell Zugriff hat, allerdings hat der Provider netterweise zwei Skripte in das Verzeichnis /home/kundennummer/ geladen. Die Skripte heißen “backup_head.sh” und “backup_live.sh”.

Nun aber ran an unser Programm…

[ad#ad-1]
Zwei Systeme = wir brauchen ein Interface
Im Interface habe ich eine Methode vorgegeben die dann das Skript das das Backup erstellt anstoßen soll, diese Methode heißt bei mir “perform”.

Kommando Klasse
Der Grundsatz vom Command Pattern sagt das man die Instanzen speichern und zu einem späteren Zeitpunkt damit eine Aktion ausführen kann. Da wir ja etwas “laufen” lassen wollen habe ich bei mir diese Methode “run” genannt.

Fazit

Ich setzte das Command Pattern immer dann ein wenn ich irgendwas brauche was nicht immer auch über User Aktionen läuft. Also bei mir läuft damit z.B. mein Datenbank Backup und Deployment Skript.
Man kann es aber aber auch sehr schön einsetzen wenn man etwas in wenigen Dateien schreiben kann, es dann aber sehr sehr unübersichtlich ist.

Beispiel Code


interface DbBackupInterface {
    public function perform();
}

class DbBackup {

    private $_instances = array();

    public function add(CommandInterface $cmdName){
        $this->_instances[] = $cmdName;
        return $this;
    }

    public function run() {
        if(sizeof($this->_instances) > 0){
            foreach($this->_instances as $instance){
                $instance->perform();
            }
        }
    }
}

abstract class DbBackupHelper {
    const LIVE = 'live';
    const HEAD = 'head';

    const PATHTOSCRIPT = '/home/username/scripts/';

    protected function _getFilePattern($date, $system){
        return sprintf(
            '%s%s.sh %s.sql',
            self::PATHTOSCRIPT,
            $system,
            $date
        );
    }
}

class DbBackupLive extends DbBackupHelper implements DbBackupInterface {

    public function perform(){
        $filepattern = parent::_getFilePattern(
            date('dmYHi'),
            parent::LIVE
        );
        exec($filepattern);
    }

}

class DbBackupHead extends DbBackupHelper implements DbBackupInterface {

    public function perform(){
        $filepattern = parent::_getFilePattern(
            date('dmYHi'),
            parent::HEAD
        );
        exec($filepattern);
    }

}

$dbBackup = new DbBackup();
$dbBackup->add(new DbBackupHead())->add(new DbBackupLive());
$dbBackup->run();

Das nächste Pattern das ich wohl mal kurz vorstelle wird das Factory Pattern sein.

Share your thoughts, post a comment.

(required)
(required)

Note: HTML is allowed. Your email address will never be published.

Subscribe to comments