2011-05-26 20 views
3

HTMLを知っている一部のUIの人と.NETを知っているバックエンドの人との間のより良いコラボレーションを可能にするために、私たちはMVC Webアプリケーションを使用してphalangerビューエンジンとして。phalangerをMVCアプリケーションのビュー部分として使用する

ビューモデルとしてphalanagerを統合することは、1つの点を除いてかなり簡単です。モデルをページスクリプトに渡す方法がわかりません。どのようにこれが達成されるかもしれない任意のアイデア?

1つのアイデアは、PHPスクリプトから静的.NETメソッドを呼び出すことですが、ちょっとハッキリです。私は、スクリプトにパラメータを渡し、スクリプトで変数を取り上げることができるようにしたいと思います。

答えて

4

バックエンドで.NETを使用し、フロントエンドでPHP(Phalangerを使用)を使用すると、良いシナリオのように見えます。私は最良の選択肢は、.NETでモデルを実装し、コントローラまたはビューを実装するためにPHPを使用することです(直接またはいくつかのPHPフレームワークを使用して)。

PHPコードが.NETオブジェクトにアクセスできるため、Phalangerを使用してコンパイルされたPHPから.NETモデルを呼び出すのは簡単です。あなたは以下の型と名前空間DemoDataLayerを含むC#のDLLを持っていると仮定すると:

public class Data { 
    public List<Category> GetCategories() { 
    var ret = new List<Category>(); 
    // Some code to load the data 
    return ret; 
    } 
} 

その後、あなたは(web.configを使用して)指結びのウェブサイトからのC#ライブラリを参照としてDataクラスを使用するように指結びが提供するPHP拡張機能を使用することができますそれは、標準のPHPオブジェクトだった場合:参照を設定するには

<? 
    import namespace DemoDataLayer; 
    $dl = new Data; 
    $categories = $dl->GetCategories(); 
?> 
<ul> 
<? foreach($categories as $c) { ?> 
    <li><a href="products.php?id=<? echo $c->ID ?>"><? echo $c->Name ?></a></li> 
<? } ?> 
</ul> 

、あなたはbinディレクトリにC#DLLを追加し、classLibrary要素に含める必要があります。上記で使用import namespace構文はPhpClr機能を使用してオンにする必要があります(.NET名前空間を使用するための)指結び固有の言語拡張です:

<?xml version="1.0"?> 
<configuration> 
    <phpNet> 
    <compiler> 
     <set name="LanguageFeatures"> 
     <add value="PhpClr" /> 
     </set> 
    </compiler> 
    <classLibrary> 
     <add assembly="DemoDataLayer" /> 
    </classLibrary> 
    </phpNet> 
</configuration> 
+0

おかげで、私はラウンドそれを他の方法を行うことを期待していた。持っています.NETコードはPHPスクリプトを呼び出し、パラメータを渡すことで自動的に "$ categories"のようなバインディングを作成して、書かれた "php .net"コードの量を最小限に抑えます。これは可能ですか? – Robert

+0

@ロバーツ:はい、そうする方法もあります(詳細を確認する必要があります)。質問は、PHPコードをどのようにインスタンス化したいのですか? ASP.NET MVCを使用している場合は、 'return PhpView(" foo.php ")'のようなものをコントローラに入れたいと思っていますか? (現在、これはサポートされていませんが、面白く聞こえるかもしれません。) –

+0

私はビューを呼び出す独自のF#ishの方法を持っているフレームワークのような私自身のmvcを持っていますが、基本的にはPHPのビューを呼び出すためのリターンPhpView( "foo.php")のようなものです。私は今それを見てきました。スクリプトのコンパイルに関連するすべてのものが内部としてマークされているので、難しいようです。 phalangerのカスタムビルドを行い、いくつかの可視性の設定を変更する必要があるように見えます。 – Robert

1

チェックアウトプロジェクトがために、以下の方法が含まれていることをhttp://phpviewengine.codeplex.com/

PHPスクリプトが使用できる形式にCLR型を変換する:

object PhpSafeType(object o) 
    { 
     // PHP can handle bool, int, double, and long 
     if ((o is int) || (o is double) || (o is long) || (o is bool)) 
     { 
      return o; 
     } 
     // but PHP cannot handle float - convert them to double 
     else if (o is float) 
     { 
      return (double) (float) o; 
     } 
     // Strings and byte arrays require special handling 
     else if (o is string) 
     { 
      return new PhpString((string) o); 
     } 
     else if (o is byte[]) 
     { 
      return new PhpBytes((byte[]) o); 
     } 
     // Convert .NET collections into PHP arrays 
     else if (o is ICollection) 
     { 
      var ca = new PhpArray(); 
      if (o is IDictionary) 
      { 
       var dict = o as IDictionary; 
       foreach(var key in dict.Keys) 
       { 
        var val = PhpSafeType(dict[key]); 
        ca.SetArrayItem(PhpSafeType(key), val); 
       } 
      } 
      else 
      { 
       foreach(var item in (ICollection) o) 
       { 
        ca.Add(PhpSafeType(item)); 
       } 
      } 
      return ca; 
     } 
     // PHP types are obviously ok and can just move along 
     if (o is DObject) 
     { 
      return o; 
     } 
     // Wrap all remaining CLR types so that PHP can handle tham 
     return PHP.Core.Reflection.ClrObject.WrapRealObject(o); 
    } 

それは

...このように使用することができます
// Get setup 
var sc = new ScriptContext.CurrentContext; 
var clrObject = /* Some CLR object */ 
string code = /* PHP code that you want to execute */ 

// Pass your CLR object(s) into the PHP context 
Operators.SetVariable(sc,null,"desiredPhpVariableName",PhpSafeType(clrObject)); 

// Execute your PHP (the PHP code will be able to see the CLR object) 
var result =   return DynamicCode.Eval(
       code, 
       false, 
       sc, 
       null, 
       null, 
       null, 
       "default", 
       1,1, 
       -1, 
       null 
       ); 

これは匿名の型を扱うこともできます。たとえば、次のように挿入します。

var clrObject = new { Name = "Fred Smith" }; 
Operators.SetVariable(sc,null,"person",PhpSafeType(clrObject)); 
その後、PHPでこれをアクセスすることができ

:答えトマスのためのコース出力の

echo $person->Name; 

Fred Smith

関連する問題