Modul Services 3

Services 3 Tutorial (Drupal 7.x)

Ich möchte heute einmal zeigen, wie man ein Modul schreibt, das in Drupal 7 einen eigenen Service für das Modul Services 3 bereitstellt. Ich werde hier nicht darauf eingehen, wie man ein Modul programmiert; ich setze voraus, dass der geneigte Leser weiß, was er braucht, um ein Custom-Modul zu schreiben. Und jaaa, @Kars-T, man muss ein Modul aktivieren, damit es benutzt werden kann :).

Ok, fangen wir mal an. Wie bei allen Sachen in Drupal funktioniert auch das Registrieren eines Services über Hooks. Der Hook, den wir hier benötigen, ist hook_services_resources(). Diesen Hook lässt man einen Array zurückgeben, das Drupal den Service bekannt macht. Aussehen könnte das so:

<?php
function service_tutorial_services_resources() {
return array(
  
'service_tutorial' => array( // Name der Ressource
    
'actions' => array( // Art der Methode, siehe CRUD
      
'test' => array( // Name der Funktion
        
'access callback' => 'service_tutorial_perm', // Funktion, die bei Bedarf TRUE
                                                       // oder FALSE zurückgibt
        
'file' => array( // Hier wird angegeben, wo sich die Callback-Funktion unserer
                          // Service-Funktion befindet
          
'type' => 'inc',
          
'module' => 'service_tutorial',
          
'name' => 'service_tutorial_resources',
         ),
        
'callback' => 'test', // Name unserer Callback-Funktion
      
),
     ),
   )
);
}
?>

OK, ich versuch das mal zu erklären. Als erstes geben wir unseren Ressourcen-Namen an, das ist der Name, der auch angezeigt wird, wenn man die Ressourcen auswählt. Man könnte das wie so eine Art Package-Namen sehen, unter dem man dann die einzelnen Funktionen unseres Services findet.

Services 3 arbeitet mit dem so genannten CRUD System, 'create', 'update', 'retrieve' und 'delete'. Zusätzlich gibt es dann noch 'actions', die wir hier benutzen. Darunter befinden sich die einzelnen Funktionsdefinitionen.

Nun kommt der Name unserer Service-Funktion, mal ganz simpel test(). Danach sagen wir Services, wo es unsere Callback-Funktion findet. Der erste Parameter ist der Typ der Datei, der zweite das Modul, zu dem die Datei gehört, und der dritte der Name der Datei.

Schlussendlich dann noch die Callback-Funktion, in dem Fall test(). Die Callback-Funktion wird dann von Services aufgerufen, sobald jemand unsere Service-Funktion test() benutzt. Sie muss in der unter 'file' angegebenen Datei liegen. Wie sieht nun unsere Callback-Funktion aus:

<?php
function test() {
 
$date = new stdClass();
 
$data->foo = $foo;
 
$data->bar = $bar;
  return
$data;
}
?>

OK, ziemlich simpel, aber das soll ja auch nur ein Beispiel sein, denn das Wichtige ist: hat man erst einmal verstanden, wie man seinen eigenen Service schreibt, dann kann man die ganze Macht Drupals nach außen für sich nutzbar machen. Und so auch z.B. sein Handy mit Daten füttern oder Drupal von seinem Handy aus mit Daten füttern, wie man möchte.

OK, wie versprochen habe ich mich so kurz wie möglich gehalten. Ich stelle hier noch mein Modul rein, das ich auch in der Session auf der DrupalCity gezeigt habe. Da wird nochmal ein wenig mehr gezeigt, z.B. wie man Argumente für die Funktionen definiert.

Wer mehr über Services erfahren möchte, dem kann ich nur empfehlen, den Quellcode von Services zu studieren, da die Dokumentation leider für mich unter Drupal 7 nicht funktioniert hat und ich leider auch nur über den Quellcode herausfinden konnte, was ich hier zeige. Und wie immer, gefundene Rechtschreibfehler können behalten werden.

Ich hoffe, ich konnte helfen, und wünsche nun viel Spaß beim Testen, den Quellcode könnt ihr euch hier herunterladen.

Kommentare

Felix - 3. August 2012 - 17:31
Gutes Tutorial, ich glaube ich habe die FUnktionsweise verstanden. Auf meinem Drupal 7 will es aber einfach nicht funktionieren. Ich habe deinen Tutorial Service 1:1 eingebunden, Modul installiert und die entsprechenden Resourcen für meinen Endpoint freigegeben. Trotzdem bekomme ich immer wieder 404 Not Found: Could not find the controller. Hier http://drupal.org/node/650776#comment-4461438 habe ich gelesen, dass man die Standard-Funktionen für CRUD (+index) implementieren muss? Hab's versucht, läuft dennoch nicht. Habe getestet über Browser, sowie FF Poster. Bei den anderen Resources, die Drupal mitliefert hat es funktioniert... Irgendeine Idee? Vielen Dank und Grüße, Felix