2016-07-01 4 views
0

私はPHPでショートコード用のカスタムパーサーを作成しようとしていますが、どのPHP関数(またはたぶんPHPライブラリ)を使用するかの指示が必要です。私はLaravel 5を使用しているので、パッケージも歓迎します。カスタムショートコードパーサー

例えば、私は、この形式の文字列を持っている:

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

Iは、これらのパラメータを含む$userオブジェクトを持っています。文字列内のすべてのshortcodeパラメータがオブジェクトに存在するかどうかをチェックしたいと思います。エラーが返された場合は、そうであれば、解析された文字列を返します。

Hello John, your ID is 123. 

UPDATE

私はREST APIを構築することだし、これは自動化された電子メールシステムで使用されることに注意してください。コントローラ内の文字列に結果が必要なので、jsonレスポンスが返される前にメール機能で使用できます。

+0

が、これは役に立つかもしれないことができますか? http://stackoverflow.com/questions/28554946/laravel-echoing-object-property-after-checking-for-existence –

+2

[Twig](http://twig.sensiolabs.org/)の使用を検討しましたか?あなたが単に変数のためにそれを使用している場合は、過剰なビット。 –

+0

@Alok、これはブレード用です...テンプレートではなく、モデル/コントローラ内で解析されたこの文字列が必要です。 – Skatch

答えて

2

テンプレートのスタイルに合わせて、Mustache.phpはあなたの目標を達成するための適切なライブラリです。

Composerを使用してください。プロジェクトのcomposer.jsonにmustache/mustacheを追加します。

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

用途:

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 
} 

アップデート1:

あなたのデータオブジェクトがEloquentインスタンスである場合は、以下を使用することができます変数がない場合に自動的にエラーをスローするクラス:

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}; 
    } 
} 

用途:

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

これはクールです。パラメータの検証を動的にする方法を見つける必要があります。条件を静的にせずに複数のオブジェクトから利用できるすべてのパラメータを使用できるようにしたいのですが、入力文字列に従ってパラメータが存在するかどうかを確認してください。これはsomethig Mustacheができるのですか?とにかく、これも私の問題を解決する、私はそれが他のオプションが提供されていない場合はそれを受け入れるだろう。 – Skatch

+0

あなたのオブジェクト '$ user'のタイプは? –

+0

使用されているすべてのオブジェクトは、単一行のEloquent結果( '$ user = User :: find($ id)')です。以前のコメントを明確にする必要があるように感じます。それはあまり明確ではありません。文字列内ですべてのショートコードの使用を取得し、それらの変数が提供されているオブジェクトで使用可能かどうかを確認してから、解析またはエラーを返したいと思います。実際には、レンダリングの前にチェックを行うことができるように、文字列内にすべてのショートコードを含む配列が必要です。 – Skatch