Feb
25

Shellprogrammierung mit CakePHP

Wer bei CakePHP einsteigt fängt möglicherweise mit der Generierung über die Cake Console an. CakePHP verfügt nämlich über einige Befehle, die ganze Anwendungen erzeugen können. Scaffolding, Bake und die Console sind die Stichworte und vieles davon kann im Handbuch nachgelesen werden. Lohnt auf jeden Fall.
Für eine aktuelle Anwendung habe ich ebenfalls mit Shell-Scripten gearbeitet. Allerdings setzt es voraus, dass man die Möglichkeit hat, Cronjobs aufzusetzen. Ist also mit einfacheren Webspace-Angeboten meist nicht zu realisieren. Wenn man aber die Möglichkeit hat, lohnt es auf jeden Fall darüber nachzudenken, welche Aufgaben einer Anwendung im Hintergrund ablaufen könnten. Bei Anwendunge beispielsweise könnte der Versand der Benachrichtungsmail auch kurze Zeit später erfolgen. Somit kann die Webanwendung im Vordergrund von dieser Aufgabe entlastet werden.
In Cake Shellanwendungen hat man Zugriff auf Models und kann also prima Daten aus der Datenbank auslesen und somit die Emails für den Versand entsprechend versenden, wenn die Markierungen in der Datenbank sind.

class NotificationShell extends Shell
{
    var $User = null;
 
     function main() {
            $this->User = ClassRegistry::init('User');
            $data = $this->User->find('all');
            // $data verarbeiten
     }
}

Genauso einfach wie man Models instanzieren kann, lassen sich auch Komponenten laden und benutzen, wie beispielsweise die TwitterComponent.

        if (is_null($this->Twitter)) {
            App::import('Component', 'Twitter');
            $this->Twitter = new TwitterComponent();
 
            $this->Twitter->username = 'twittername';
            $this->Twitter->password = 'meinPasswort';
       }

Cake Shellscripte werden dann einfach über den cake Befehl in der Form

     cake notification

aufgerufen. Das Shell-Script wird in APP/vendors/shells angelegt und bekommt den gleichen Namen wie die Shell. Also im obigen Beispiel wird die NotificationShell in der Datei notification.php angelegt.

4 Kommentare

Schreibe ein Kommentar
  • a gravatar rikman Said:

    Du kannst die Models auch wie in einem Controller mit dem $uses-Attribut laden, das spart Tipperei :)

    Wenn du Models nicht Shellweit zur Verfuegung haben moechtest, sondern nur in einer Methode, solltest du ClassRegistry::init() benutzen an Stelle der Kombination von App::import() und new Modelname().

  • a gravatar Siegfried Said:

    Ja, hast natürlich recht. Aber ich will mir das $uses abgewöhnen.

  • a gravatar Dirk Olbertz Said:

    Wenn man so etwas wie

    cake notification update

    machen zu können, also verschiedene Funktionalitäten in einer Shell-Methode unter zu bringen, reicht es einfach aus, eine entsprechende Methode in der Klasse anzubieten:

    function update() {
    echo ‘update’;
    }

  • a gravatar Siegfried Said:

    Ja, hab ich vergessen zu erwähnen. Mach ich auch so, damit kann man dann auch prima testen und spielen.

Kommentare RSS Feed   TrackBack URL

Hinterlasse ein Kommentar

Oben