という訳で、今度は ASP.NET MVC から wordpress のデータを扱っていきます。これで CakePHP と比較すると、ASP.NET MVC が何処まで優れている/劣っているのかが分かるかと。
CakePHP から wordpress のデータを扱う | Moonmile Solutions Blog
www.moonmile.net/blog/archives/1888
CakePHP から wordpress のデータを扱う(2) | Moonmile Solutions Blog
www.moonmile.net/blog/archives/1896
CakePHP から wordpress のデータを扱う(3) | Moonmile Solutions Blog
www.moonmile.net/blog/archives/1922
wordpress のデータベースは SQL Server には対応していないので、テーブルの作成とインポートは別途行っています。実は、このあたり苦労したので…後で情報として残しておきますね。
ASP.NET MVC アプリの場合は LINQ to Entities を使うと楽なので、ズルをしてこれを使います。モデルの作成が楽というのがあるのですが。LINQ が使えるというのがミソでして。
■ビューを作る
ASP.NET MVC のビュー作成は、EDM(Entity Data Model)を使うと自動生成してくれるので、これを利用します。wp_posts クラスを指定します。
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcWordpress.wp_posts>>" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Index </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>Index</h2> <table> <tr> <th> ID </th> <th> post_author </th> <th> post_date </th> <th> post_title </th> <th> post_category </th> <th> guid </th> </tr> <% foreach (var item in Model) { %> <tr> <td> <%: item.ID %> </td> <td> <%: item.post_author %> </td> <td> <%: String.Format("{0:g}", item.post_date) %> </td> <td> <%: item.post_title %> </td> <td> <%: item.post_category %> </td> <td> <%: item.guid %> </td> </tr> <% } %> </table> </asp:Content>
■コントローラーを作る
EDM の場合、クラス名を変更できない(と思う)ので、「wp_」のようなプレフィクスはそのまま残ってしまいますね。これは、CakePHP のほうが prefix の設定ができる分、有利です。
更に云えば、T100,T200,T300 のような管理しやすいが他人には分かりにくいテーブル名の場合は、そのままクラス名として使われてしまいますね。CakePHP の Model はテーブル名を変更できるので、これも CakePHP のほうがよいかなと。
public class PostsController : Controller { // // GET: /Post/ public ActionResult Index() { wordpressEntities ent = new wordpressEntities(); var model = from t in ent.wp_posts where t.post_status == "publish" select t; return View(model); } }
ASP.NET MVC では、PostsController クラスで post_status をチェックしています。これは、EDM のクラスにはメソッドが追加できない(と思う)ので、findPosts メソッドを追加できないからなんですよねぇ。多分、拡張メソッドを使ってメソッドを追加するんでしょうが、単純にメソッドを追加、とはいかないようです。
■モデルは EDM そのままで
モデルは CakePHP と同様に EDM そのものを使います。wp_posts だけを返すのであれば、これで十分です。
■モデルのラッパークラスを作ってみる
ASP.NET MVC では、コントローラーでデータ加工をすることが多いので(EDMをモデルとして直接使う場合は特に)、コントローラーの各メソッドでクエリを書きます。
が、post_status = ‘publish’ のような、フラグ(他にも削除フラグとかなんとか)を、いちいちコントローラーでチェックするのは抵抗があるし、間違いも発生しやすいものです。
なので、wp_posts モデルをラップした Post クラスを作って CakePHP の時のように findPosts メソッドを作ってみます。
public class Post : wp_posts { public IQueryable<wp_posts> FindPosts() { wordpressEntities ent = new wordpressEntities(); var model = from t in ent.wp_posts where t.post_status == "publish" select t; return model; } }
単純ですが、wp_posts クラスを継承したクラスを作ります。この継承が意味があるかどうかは別として、ひとまず wp_posts と同じものを指しているというつもりです。
コントローラーの Index メソッドは Posts::FindPosts メソッドを使って次のように書きます。
public ActionResult Index() { Models.Post post = new Models.Post(); var model = post.FindPosts(); return View(model); }
まあ、こんな風にしたほうが分かりやすいかな、と。
本来は、wp_posts.FindPosts() な形で書きたいですね。
お次は、最近投稿した記事一覧を表示させます。
追記。
EDM のデザイナで、エンティティのクラス名を変更できます。wp_users を User のように変えていけば、CakePHP のように命名規約で揃えられます。