2016-07-01 8 views
0

Ich versuche, einen benutzerdefinierten Parser für Shortcodes in PHP zu erstellen, aber ich brauche Anweisungen, welche PHP-Funktion (oder vielleicht sogar PHP-Bibliothek) zu verwenden. Beachten Sie, dass ich Laravel 5 verwende, Pakete sind also willkommen.Benutzerdefinierte Shortcode-Parser

Zum Beispiel habe ich eine Zeichenfolge in diesem Format:

Hello {{user.first_name}}, your ID is {{user.id}} 

Ich habe ein $user Objekt diese Parameter enthält. Ich möchte überprüfen, ob alle Shortcode-Parameter innerhalb der Zeichenfolge im Objekt vorhanden sind, wenn nicht, möchte ich einen Fehler zurückgeben, und wenn ja, möchte ich die analysierte Zeichenfolge zurückgeben, die gleich wäre:

Hello John, your ID is 123. 

UPDATE

Bitte beachten Sie, dass ich ein REST-API baue und dies würde in einem automatisierten E-Mail-System verwendet werden. Ich brauche das Ergebnis in einer Zeichenfolge innerhalb des Controllers, damit ich es in meiner Mailing-Funktion verwenden kann, bevor die JSON-Antwort zurückgegeben wird.

+0

dies hilfreich sein könnte sein kann? http://stackoverflow.com/questions/28554946/laravel-echoing-object-property-after-checking-for-existence –

+2

Haben Sie in Betracht gezogen, mit [Twig] (http://twig.sensiolabs.org/), möglicherweise ein bisschen Overkill, wenn Sie es nur für Variablen verwenden. –

+0

@Alok, wie ich sehe, ist dies für Blade ... Ich brauche diese Zeichenfolge in einem Model/Controller, nicht in einer Vorlage analysiert. – Skatch

Antwort

2

Nach Ihrem Vorlagenstil Mustache.php ist die richtige Bibliothek, um Ihr Ziel zu erreichen.

Verwenden Sie Composer. In mustache/mustache zu composer.json Ihres Projekts:

{ 
    "require": { 
     "mustache/mustache": "~2.5" 
    } 
} 

Verbrauch:

if(isset($user->first_name) && isset($user->id)) { 
    $m = new Mustache_Engine; 
    return $m->render("Hello {{first_name}}, your ID is {{id}}", $user); 
    //will return: Hello John, your ID is 123. 
}else { 
    //trigger error 
} 

Update 1:

Wenn Ihr Datenobjekt eine Eloquent Instanz ist, können Sie die folgende Klasse, die bei fehlenden Variablen automatisch Fehler auslöst:

class MustacheData { 

    private $model; 

    public function __construct($model) { 
    $this->model = $model; 
    } 

    public function __isset($name) { 
    if (!isset($this->model->{$name})) { 
     throw new InvalidArgumentException("Missing $name"); 
    } 

    return true; 
    } 

    public function __get($name) { 
    return $this->model->{$name}; 
    } 
} 

Verbrauch:

try { 
    $m = new Mustache_Engine; 
    return $m->render("Hello {{first_name}}, your ID is {{id}}", new MustacheData($user)); 
}catch(InvalidArgumentException $e) { 
    //Handle the error 
} 
+0

Das ist cool, jetzt muss ich einen Weg finden, um die Parametervalidierung dynamisch zu machen, ich möchte alle Parameter verwenden können, die von mehreren Objekten verfügbar sind, ohne die Bedingungen statisch zu machen, aber überprüfe, ob die Parameter entsprechend der Eingabezeichenfolge existieren. Ist das etwas, was Moustache kann? Wie auch immer, das löst auch mein Problem, ich werde es akzeptieren, wenn keine andere Option zur Verfügung steht. – Skatch

+0

Was ist der Typ Ihres Objekts '$ user'? –

+0

Alle verwendeten Objekte wären einreihige Ergebnisse ('$ user = User :: find ($ id)'). Ich habe das Gefühl, dass ich meinen vorherigen Kommentar klären muss, es ist nicht sehr klar. Ich möchte alle Shortcode-Verwendungen in der Zeichenfolge abrufen, prüfen, ob diese Variablen in den bereitgestellten Objekten verfügbar sind, und dann einen Fehler analysieren oder zurückgeben. Eigentlich brauche ich ein Array mit allen Shortcode-Vorkommen innerhalb der Zeichenkette, damit ich die Überprüfung vor dem Rendern durchführen kann. – Skatch

Verwandte Themen