<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Framework &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/framework/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Wed, 31 Oct 2012 00:30:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>JavaScriptのテストツール「testem」が素晴らしいぞ</title>
		<link>https://blog.mach3.jp/2012/10/31/js-testem-script.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 31 Oct 2012 00:30:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Testem]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2757</guid>

					<description><![CDATA[JavaScriptユニットテスト一年生の私が、Nettuts+ のチュートリアルで知ったテストツール 「testem」のお陰で大変捗ったので是非お勧めしたく、ここで紹介してみます。 testem ってなに testem [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>JavaScriptユニットテスト一年生の私が、<a href="http://net.tutsplus.com/tutorials/javascript-ajax/make-javascript-testing-fun-with-testem/">Nettuts+ のチュートリアル</a>で知ったテストツール 「<a href="https://lh6.googleusercontent.com/-PfCvl0NLxAk/UJALoNXxsFI/AAAAAAAABo8/nUGSw2u6OTc/s400/20121031-00.png">testem</a>」のお陰で大変捗ったので是非お勧めしたく、ここで紹介してみます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-PfCvl0NLxAk/UJALoNXxsFI/AAAAAAAABo8/nUGSw2u6OTc/s400/20121031-00.png" alt=""/></figure>



<p></p>



<span id="more-2757"></span>



<h2 class="wp-block-heading">testem ってなに</h2>



<h3 class="wp-block-heading">testem</h3>



<ul class="wp-block-list">
<li><a href="https://github.com/airportyh/testem">testem via GitHub : airportyh/testem</a></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Unit testing in Javascript can be tedious and painful, but Testem makes it so easy that you will actually want to write tests.</p>
</blockquote>



<p>要するに、面倒なJSのユニットテストをより快適にしてみんなでハッピーにテスト書こうよ！というツールです。 testem自体は<em>node.js</em>ベースで動作し、<em>Jasmine/QUnit/Mocha</em>に対応しています。（デフォルトはJasmine）</p>



<p>test&#8217;em は<em>&#8220;Test them&#8221;</em>の省略形でしょう。 どんなテストもまとめて引き受けますよ！という事だと思います。</p>



<h3 class="wp-block-heading">具体的になにしてくれるの</h3>



<p>例えばJasmineで<em>「基礎的で面倒なテストの開始の仕方」</em>をした場合、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>Jasmineのコードをとってきて設置し、</li>



<li>SpecRunner.html を編集し、</li>



<li>ブラウザでそのHTMLを開き、</li>



<li>テストを書いてブラウザをリフレッシュする</li>
</ol>
</blockquote>



<p>と、こんな感じの作業をプロジェクトの度に繰り返す事になります。</p>



<p>これが、testemでは</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>設定ファイルを書く</li>



<li>testem コマンドを叩く</li>
</ol>
</blockquote>



<p>だけでテストが始まります。</p>



<h2 class="wp-block-heading">インストール</h2>



<p>もしnode.jsが既にインストールされている環境ならば、<em>npm</em>コマンドだけで簡単に導入できます。 （node.jsがまだ入っていないのであれば、まずそちらを先に<a href="http://nodejs.org/">インストール</a>しましょう）</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g testem
</code></span></pre>


<p>正常にインストールできませんでしたか？ 環境によっては<em>sudo</em>が必要になるかもしれません。</p>


<pre class="wp-block-code"><span><code class="hljs">$ sudo npm install -g testem
</code></span></pre>


<p>これでtestemコマンドが使えるようになったはずです。 ヘルプでも覗いてみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ testem -h
</code></span></pre>


<h2 class="wp-block-heading">テストをしてみよう</h2>



<p>早速テストをしてみようと思います。仮に、次のようなディレクトリ構造にしてみましょう。 scripts/<em>.js がテスト対象のライブラリ、tests/</em>.js がテストです。 testem.json が設定ファイルになります。</p>


<pre class="wp-block-code"><span><code class="hljs">./
├ scripts/
│   └ foobar.js
├ tests/
│   └ test-foobar.js
└ testem.json （設定ファイル）
</code></span></pre>


<h3 class="wp-block-heading">設定ファイルを書く</h3>



<p>設定ファイルはJSONで記述します。必要最低限の設定は、こんな感じになります。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"framework"</span> : <span class="hljs-string">"jasmine"</span>,
    <span class="hljs-attr">"src_files"</span> : &#91;
        <span class="hljs-string">"scripts/foobar.js"</span>,
        <span class="hljs-string">"tests/test-foobar.js"</span>
    ]
}
</code></span></pre>


<ul class="wp-block-list">
<li><br /><p><em>framework</em><br /><br />使いたいテストフレームワークを書きます。デフォルトはJasmineなので、Jasmineを使う場合は省略できます。</p><br /></li>



<li><br /><p><em>src_files</em><br /><br />読み込むソースファイルを配列で記述しておきます。</p><br /></li>
</ul>



<h3 class="wp-block-heading">テストを開始する</h3>



<p><em>testem</em>コマンドを叩けばテストは開始されます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ testem
</code></span></pre>


<p>実行すると次のような画面が表示されます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-TZqBngXCrzg/UJALoJRmoLI/AAAAAAAABo8/_c1s8iHfZrg/s500/20121031-01.png" alt=""/></figure>



<p></p>



<p>表示されたURL（http://localhost:7357）を、テストしたいブラウザで開きます。すると…</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-RBqfnMLtAEE/UJALojblQxI/AAAAAAAABo8/BxySZa4wyKk/s500/20121031-03.png" alt=""/></figure>



<p></p>



<p>ブラウザにはJasmineのテスト結果が。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-QUbIOHh-vo0/UJALoBMroFI/AAAAAAAABo8/uGn0I0tuapY/s500/20121031-02.png" alt=""/></figure>



<p></p>



<p>ターミナルにもテスト結果が表示されます。</p>



<h3 class="wp-block-heading">ファイル更新を検知してくれる</h3>



<p>ソースファイルあるいはtestem.jsonを編集すると、更新を検知してブラウザとターミナルを自動的にリフレッシュしてくれます。 わざわざブラウザをアクティブにして更新する必要はありません。後はひたすらテストを書いていくのみです。</p>



<h2 class="wp-block-heading">実行時に自動的にブラウザを開く</h2>



<p>わざわざURLをコピーしてブラウザのアドレスバーに貼り付けるのが面倒！ そんな人の為に、<em>&#8220;launch_in_dev&#8221;</em>という設定項目があります。 設定ファイルにこれを追記する事で、<em>testem</em>コマンド実行時に自動的に、指定したブラウザでURLを開いてくれます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">{
    <span class="hljs-string">"launch_in_dev"</span> : &#91;
        <span class="hljs-string">"Chrome"</span>
    ],
    ...
}
</code></span></pre>


<p>使えるブラウザのリストは、次のコマンドで知ることができます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ testem launchers
</code></span></pre>


<p>Windows環境ならIE7,IE8,IE9等も表示されますね。 公式のREADMEによれば、IE9のモード切り替えでのテストだそうです。</p>



<p>ただし、この設定はテスト開始時に新しいウィンドウを開いてしまいます。 その開き方が好きでない方は、大人しくブックマークに登録しておきましょう。 （私はそうしました）</p>



<h2 class="wp-block-heading">Nettuts+ のチュートリアル</h2>



<p>基本的な部分は上で紹介していますが、CofeeScriptのコンパイルを挟んだりなど、 もう少し突っ込んだ使い方はNettuts+のチュートリアル動画でわかりやすく解説されていました。 英語ですが、作業画面見ているだけでも参考になると思います。</p>



<h3 class="wp-block-heading"><a href="http://www.youtube.com/watch?v=I0Py_tqCkTo">Make JavaScript Testing Fun With Testem &#8211; YouTube</a></h3>



<p><iframe width="500" height="375" src="http://www.youtube.com/embed/I0Py_tqCkTo" frameborder="0" allowfullscreen=""></iframe></p>



<p>cf) <a href="http://net.tutsplus.com/tutorials/javascript-ajax/make-javascript-testing-fun-with-testem/">Make JavaScript Testing Fun With Testem | Nettuts+</a></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>面倒な部分を全部任せられるので、快適にテストをはじめられますね。 テストフレームワークだけでも有難いのに、至れり尽くせりで幸せです。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>シンプルなOAuth認証ライブラリ「HybridAuth」を試してみた</title>
		<link>https://blog.mach3.jp/2012/10/03/hybridauth.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 02 Oct 2012 23:12:10 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2701</guid>

					<description><![CDATA[以前「Opauth」による簡単な認証を記事にしましたが、 またさらにシンプルな認証ライブラリ「HybridAuth」を知ったので試用してみました。 HybridAuthとは HybridAuth, Open Source [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前「<a href="http://opauth.org/">Opauth</a>」による簡単な認証を<a href="/2012/08/opauth-and-tmhoauth-for-twitter.html">記事にしました</a>が、 またさらにシンプルな認証ライブラリ「<a href="http://hybridauth.sourceforge.net/">HybridAuth</a>」を知ったので試用してみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-GWtM7s04cXw/UGrvefjOH1I/AAAAAAAABnI/uEvq40SKWpk/s400/20121002-00.png" alt="シンプルなOAuth認証ライブラリ「HybridAuth」を試してみた"/></figure>



<p></p>



<span id="more-2701"></span>



<h2 class="wp-block-heading">HybridAuthとは</h2>



<h3 class="wp-block-heading"><a href="http://hybridauth.sourceforge.net/index.html">HybridAuth, Open Source Social Sign On PHP Library</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-6_NT7AZXQmQ/UGrv4PFQhGI/AAAAAAAABng/YrxLwnTR8oo/s500/20121002-01.png" alt="HybridAuth"/></figure>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>HybridAuth enable developers to easily build social applications to engage websites vistors and customers on a social level by implementing social signin, social sharing, users profiles, friends list, activities stream, status updates and more.</p>
</blockquote>



<p>WebサイトにOAuth認証を簡単に設置する為のPHPライブラリです。 Twitter、Facebook等をはじめとした様々なサービスに対応しています。 サポートされているサービスは、現時点で32。</p>



<p>また、CodeIgniterやCake、Zend等のFWはもちろん、 WordPressやJoomula等のCMSのプラグインとしても利用できます。</p>



<ul class="wp-block-list">
<li><a href="http://hybridauth.sourceforge.net/download.html">II. Third-party Plugins | Download HybridAuth</a></li>
</ul>



<h2 class="wp-block-heading">HybridAuth と Opauth の違い</h2>



<p>HybridAuthはOpauthと似たタイプのライブラリですが、 この2者で大きく異る点、というよりはHybridAuthのメリットを2つご紹介します。</p>



<ol class="wp-block-list">
<li>自由にカスタマイズ可能なURL</li>



<li>APIにアクセスするメソッド</li>
</ol>



<h3 class="wp-block-heading">自由にカスタマイズ可能なURL</h3>



<p>Opauthは、ログインURLの一部にサービス名を含んでいないと正常に動きません。 URLの文字列から認証するサービスを判別する為です。 （ここらへん、前回の記事では説明不足でしたね。すみません。）</p>



<p>例えば、「http://www.example.com/login/twitter」ならtwitterの認証画面へ、 「http://www.example.com/login/facebook」ならFacebookの認証画面へ飛ぶわけですね。</p>



<p>一方HybridAuthには、そういった縛りはありません。 そのかわり、認証メソッドの引数にサービス名を渡す事になります。</p>



<h3 class="wp-block-heading">APIにアクセスするメソッド</h3>



<p>Opauthは認証するだけでしたが、HybridAuthは認証した後にAPIにアクセスしてgetしたりpostしたりできます。 これ一本で全部面倒見切れそうですね。</p>



<h2 class="wp-block-heading">簡単な使い方</h2>



<p>HybridAuthを hybirdauth/ ディレクトリに保存したと想定して、 次のようなファイル構成にしてみます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>login.php (ユーザーがアクセスするページ)<br />
  config.php (設定ファイル)<br />
  hybridauth/ (ダウンロードしたHybridAuthの構成ファイル)<br />
       ├ config.php<br />
       ├ index.php<br />
       ├ install.php<br />
       └ Hybrid/</p>
</blockquote>



<h3 class="wp-block-heading">設定ファイルを作る</h3>



<p>hybridauth/config.php を参考にして、config.phpを作って必要事項を明記しましょう。 ここでは、Twitterのログインに必要な物だけを記載しておきます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">return</span> <span class="hljs-keyword">array</span>(
    <span class="hljs-string">"base_url"</span> =&gt; <span class="hljs-string">"http://localhost:8080/hybridauth/"</span>,
    <span class="hljs-string">"providers"</span> =&gt; <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"Twitter"</span> =&gt; <span class="hljs-keyword">array</span>(
            <span class="hljs-string">"enabled"</span> =&gt; <span class="hljs-keyword">true</span>,
            <span class="hljs-string">"keys"</span> =&gt; <span class="hljs-keyword">array</span>(
                <span class="hljs-string">"key"</span> =&gt; <span class="hljs-string">"&#91;your app's consumer key]"</span>,
                <span class="hljs-string">"secret"</span> =&gt; <span class="hljs-string">"&#91;your app's consumer secret]"</span>
            )
        )
    )
);
</span></code></span></pre>


<dl>
<dt>base_url</dt>
<dd>実際にOAuthのやり取りをしてくれるスクリプトを指します。 多くの場合HybridAuthをインストールしたディレクトリになります。</dd>
<dt>providers</dt>
<dd>認証したいサービスの設定を列挙していきます。 Twitterの場合は、作成したアプリケーションの<em>consumer key</em>と<em>consumer secret</em>を記載します。</dd>
</dl>



<h3 class="wp-block-heading">ログイン処理を書く</h3>



<p>./login.php を用意して、ログイン処理を書いてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-comment">// 設定ファイルを引数にして初期化する（配列でもOK）</span>
$auth = <span class="hljs-keyword">new</span> Hybrid_Auth( <span class="hljs-string">"./config.php"</span> );

<span class="hljs-comment">// 認証の実行（未認証の場合はここでリダイレクトされ、認証済みの場合はスルーされます）</span>
$twitter = $auth-&gt;authenticate(<span class="hljs-string">"Twitter"</span>);

<span class="hljs-comment">// ↓ ここから認証済みの場合の処理</span>
<span class="hljs-keyword">echo</span> <span class="hljs-string">"&lt;h1&gt;認証されています！&lt;/h1&gt;"</span>;

<span class="hljs-comment">// ユーザー情報をまとめてくれる getUserProfile() メソッド</span>
var_dump(
    $twitter-&gt;getUserProfile()
);

<span class="hljs-comment">// APIにアクセスしてみる</span>
var_dump(
    $twitter-&gt;api()-&gt;get(<span class="hljs-string">"account/verify_credentials.json"</span>)
);
</span></code></span></pre>


<p>コメントの通りです。authenticateメソッドだけでほとんど余計な処理は省かれて、スッキリしていますね。</p>



<p>実際の動作としては、こんな感じみたいです。</p>



<ol class="wp-block-list">
<li>ユーザーがlogin.phpにアクセス</li>



<li>hybridauth/index.php に移動、そこからサービスの認証画面へリダイレクト</li>



<li>認証が済んだらトークンをセッションに保存して、再びユーザーが元いたlogin.phpに移動</li>
</ol>



<h2 class="wp-block-heading">base_url について</h2>



<p>config.php で出て来た <em>base_url</em> ですが、少し補足しておきます。</p>



<p>要するにこの項目は、全ての認証処理を代理で行なってくれるイケてるしヤバい <em>hybridauth/index.php</em> にアクセスさせる為の物です。 もっと言えば、そこにアクセスしたユーザーに対して <em>hybridauth/index.php</em> に記述されている処理が走りさえすれば良いです。</p>



<p>ですので、上の例示では hybridauth/ ディレクトリが公開ディレクトリにある前提になっていますが、 そうでない場合（非公開ディレクトリになっていたり、フレームワークの都合上アクセス出来なくなっていたりする場合）、 アクセスさせるファイル内で hybridauth/index.php をインクルードしさえすれば動くはずです。</p>



<p>例えば、&#8221;base_url&#8221; を /auth.php 等として、該当ファイルを設置し、</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require_once</span>(<span class="hljs-string">"/the/path/to/hybridauth/index.php"</span>);
</code></span></pre>


<p>等としておけば良いですね。</p>



<h2 class="wp-block-heading">気になった事柄</h2>



<p>公式の例示では、APIアクセスも、認証済みである事を前提としていました。</p>



<p>認証を使わず、アプリに割り振られたのアクセストークンを使ったAPIアクセスは可能なのか、が気になりました。<br />
それをするならそういうライブラリを使えば良いのですが、一つで済むならそれが一番ですよね。<br />
気が向いたら調べてみます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>OpauthとtmhOAuthで極めてお手軽にTwitterと連携してみる</title>
		<link>https://blog.mach3.jp/2012/08/24/opauth-and-tmhoauth-for-twitter.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 24 Aug 2012 01:00:50 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Twitter]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2630</guid>

					<description><![CDATA[PHPでTwitterのAPIを利用する方法は何度かPEARのServices_Twitterと絡めて記事にした事がありましたが、 今回はもっと手軽に導入できるOpauthとtmhOAuthを紹介してみます。 認証はOp [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPでTwitterのAPIを利用する方法は何度かPEARのServices_Twitterと絡めて記事にした事がありましたが、 今回はもっと手軽に導入できる<em>Opauth</em>と<em>tmhOAuth</em>を紹介してみます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-fxH1YjDGGCc/UDaJLTvOyOI/AAAAAAAABkY/TJ0YFczT3JE/s400/20120824-00.png" alt="OpauthとtmhOAuthで極めてお手軽にTwitterと連携してみる"/></figure>



<p></p>



<span id="more-2630"></span>



<h2 class="wp-block-heading">認証はOpauthで</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-wQYHOHBi93w/UDaJLT0qhxI/AAAAAAAABkY/ll1D5qbd53o/s500/20120824-01.png" alt="Opauth – Multi-provider authentication framework for PHP"/></figure>



<p></p>



<ul class="wp-block-list">
<li><a href="http://opauth.org/">Opauth – Multi-provider authentication framework for PHP</a></li>
</ul>



<p>Opauthは、様々なOAuth認証を一手に引き受けてくれる認証フレームワークです。</p>



<p>執筆時に公式に紹介されていた利用可能なサービスは、Twitter・Facebookなどを含め11件。 これらのサービスへの認証機能は<em>「ストラテジー」</em>という形で外部モジュールとして提供されます。 所謂ストラテジーパターンと呼ばれる物ですね。</p>



<p>その使い方は、認証のみにフォーカスしているライブラリなだけあって恐ろしくシンプルで簡単。 早速試してみます。</p>



<h3 class="wp-block-heading">インストール</h3>



<p>公式のダウンロードページからダウンロードするか、 Githubにリポジトリが公開されているのでそこからcloneします。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/uzyn/opauth">ダウンロードページ</a></li>



<li><a href="https://github.com/uzyn/opauth">GitHubリポジトリ</a></li>
</ul>



<p>公式の<em>「Opauth bundled with examples」</em>からなら、Twitter、Google、Facebookのストラテジーも同梱されているので 最初に試す際にはこれがおすすめです。 （それ以外ではストラテジーが空っぽの状態なので、別途ダウンロードしてくる必要があります）</p>



<h3 class="wp-block-heading">設定</h3>



<p>ダウンロードして解凍・設置したら、設定ファイルを用意します。 <em>opauth.config.php</em> などとしておきましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$opauth_config = <span class="hljs-keyword">array</span>(
    <span class="hljs-comment">/**
     * アプリケーションへのパス
     */</span>
    <span class="hljs-string">"path"</span> =&gt; <span class="hljs-string">"/the/path/to/"</span>,

    <span class="hljs-comment">/**
     * Twitterで認証した後に戻るコールバックURL。
     * {path} は前述のpathを展開してくれる。
     */</span>
    <span class="hljs-string">"callback_url"</span> =&gt; <span class="hljs-string">"{path}callback.php"</span>,

    <span class="hljs-comment">/**
     * ハッシュの生成に使われる文字列。任意の文字列を入れておく。
     */</span>
    <span class="hljs-string">"security_salt"</span> =&gt; md5(<span class="hljs-string">"foobar"</span>),

    <span class="hljs-comment">/**
     * ここからがストラテジーの設定
     */</span>
    <span class="hljs-string">"Strategy"</span> =&gt; <span class="hljs-keyword">array</span>(
        <span class="hljs-comment">/**
          * Twitterストラテジーの設定
          * key, secret はTwitterの公式から取得。
          */</span>
        <span class="hljs-string">"Twitter"</span> =&gt; <span class="hljs-keyword">array</span>(
            <span class="hljs-string">"key"</span> =&gt; <span class="hljs-string">"&#91;consumer_key]"</span>,
            <span class="hljs-string">"secret"</span> =&gt; <span class="hljs-string">"&#91;consumer_secret]"</span>
        )
    )
);
</code></span></pre>


<p><em>consumer_key</em> と <em>consumer_secret</em> は、 事前にTwitterでアプリケーションを登録して、自前の物を取得しておきましょう。</p>



<ul class="wp-block-list">
<li><a href="https://dev.twitter.com/apps/new">Create an application | Twitter Developers</a></li>
</ul>



<h3 class="wp-block-heading">試してみる</h3>



<h4 class="wp-block-heading">Twitterの認証画面へリダイレクト</h4>



<p>まず、Twitterの認証画面へリダイレクトするスクリプトを書きます。 ユーザはログイン時はこのページにアクセスする事になります。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/Opauth.php"</span>;
<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/opauth.config.php"</span>;

<span class="hljs-keyword">new</span> Opauth($opauth_config);
</span></code></span></pre>


<p>ライブラリと設定を読み込んでインスタンスを初期化するだけです。<br />
認証画面のURLの取得やらリクエストトークンの取得やらリダイレクト処理やら、<br />
面倒な部分は全て代行してくれます。素晴らしい。</p>



<h4 class="wp-block-heading">アクセストークンを取得</h4>



<p>今度は、Twitterの認証画面から返ってきたユーザの<em>アクセストークン</em>を取得します。</p>



<p>デフォルトの設定では、認証情報は全て$_SESSIONに入るので<br />
事前に*session_start()* しておきましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

session_start();

<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/Opauth.php"</span>;
<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/opauth.config.php"</span>;


<span class="hljs-comment">/**
 * コールバック時には第二引数にfalseを入れて初期化する。
 */</span>
$opauth = <span class="hljs-keyword">new</span> Opauth($opauth_config, <span class="hljs-keyword">false</span>);

<span class="hljs-comment">/**
 * 認証情報を取得します。
 */</span>
<span class="hljs-keyword">if</span>(<span class="hljs-keyword">isset</span>($_SESSION&#91;<span class="hljs-string">"opauth"</span>]) &amp;&amp; <span class="hljs-keyword">isset</span>($_SESSION&#91;<span class="hljs-string">"credentials"</span>])){

    $uid = $_SESSION&#91;<span class="hljs-string">"opauth"</span>]&#91;<span class="hljs-string">"auth"</span>]&#91;<span class="hljs-string">"id_str"</span>]; <span class="hljs-comment">// Twitterの数字のID</span>
    $access_token = $_SESSION&#91;<span class="hljs-string">"credentials"</span>]&#91;<span class="hljs-string">"token"</span>]; <span class="hljs-comment">// アクセストークン</span>
    $access_token_secret = $_SESSION&#91;<span class="hljs-string">"credentials"</span>]&#91;<span class="hljs-string">"secret"</span>]; <span class="hljs-comment">// 秘密のアクセストークン</span>

}
</span></code></span></pre>


<p>コールバック時も、インスタンスを初期化してセッションから情報を取得するだけです。</p>



<p>ここで取得したアクセストークンを使ってTwitterAPIにアクセスするわけですが、<br />
Opauthは認証を代行するライブラリなので、その為の機能は備えていません。<br />
ここから先は、他のライブラリに代行してもらうことにします。</p>



<h2 class="wp-block-heading">APIの利用はtmhOAuthで</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-9PACCvvHn44/UDaJLflWeKI/AAAAAAAABkY/h47QCYyBv3w/s500/20120824-02.png" alt="themattharris/tmhOAuth"/></figure>



<p></p>



<ul class="wp-block-list">
<li><br />    <a href="https://github.com/themattharris/tmhOAuth">themattharris/tmhOAuth</a><br />  </li>
</ul>



<p>
  <em>tmhOAuth</em>は、PEARのServices_TwitterのようにTwitterAPIへのアクセスを代行してくれるライブラリです。<br />
  勿論認証機能も備えていますが、あまりにもOpauthが楽すぎたので作業分担をしてもらいます。
</p>



<p>
  その特徴としては、（ほぼ）単ファイルで構成されていること。<br />
  <em>tmhOAuth.php</em>をとってきて読み込むだけでその機能を利用する事ができるので、導入が容易いですね。<br />
  （正確には、tmhUtilities.php というユーティリティ用のファイルが同梱されていますが、<br />
  依存しているわけではありません）
</p>



<h3 class="wp-block-heading">
  試してみる<br />
</h3>



<p>
  基本的には、前項で取得した4つのトークンを引数にして初期化して、<br />
  あとはTwitterAPIへのリクエストを行うだけです。
</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/tmhOAuth.php"</span>;

<span class="hljs-comment">/**
 * tmhOAuthを初期化。
 * コンストラクタの引数はトークンをまとめた連想配列。
 */</span>
$twitter = <span class="hljs-keyword">new</span> tmhOAuth(
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"consumer_key"</span> =&gt; <span class="hljs-string">"&#91;consumer_key_for_your_application]"</span>,
        <span class="hljs-string">"consumer_secret"</span> =&gt; <span class="hljs-string">"&#91;consumer_secret_for_your_application]"</span>,
        <span class="hljs-string">"user_token"</span> =&gt; <span class="hljs-string">"&#91;access_token_of_the_user]"</span>,
        <span class="hljs-string">"user_secret"</span> =&gt; <span class="hljs-string">"&#91;access_token_secret_of_the_user]"</span>
    )
);

<span class="hljs-comment">/**
 * requestメソッドでTwitterAPIにリクエストを送る。
 * ここではユーザーのホームタイムラインを取得してみる。
 */</span>
$status = $twitter-&gt;request(
    <span class="hljs-string">"GET"</span>, <span class="hljs-comment">// リクエストメソッド</span>
    $twitter-&gt;url(<span class="hljs-string">"1/statuses/home_timeline"</span>), <span class="hljs-comment">// エンドポイントを指定</span>
    <span class="hljs-keyword">array</span>( <span class="hljs-string">"count"</span> =&gt; <span class="hljs-number">8</span> ) <span class="hljs-comment">// パラメータ</span>
);

<span class="hljs-comment">/**
 * requestの返り値はHTTPのステータスコード
 */</span>
<span class="hljs-keyword">if</span>($status == <span class="hljs-number">200</span>){
    <span class="hljs-comment">/**
     * データはメンバのresponseの中に、
     * さらに生のデータはその中の"response"の中にJSONで格納されている。
     */</span>
    $response = $twitter-&gt;response;
    $data = json_decode($response&#91;<span class="hljs-string">"response"</span>]);
    var_dump($data); <span class="hljs-comment">// あとは煮たり焼いたりする</span>
}
</span></code></span></pre>


<p>
  無事タイムラインを取得出来ましたでしょうか。<br />
  requestの返り値に注意しましょう。
</p>



<p>
  こちらのライブラリもまた、かなりシンプルな使い勝手になっていますね。
</p>



<h2 class="wp-block-heading">
  まとめ<br />
</h2>



<p>
  PEARのServices_Twitterには、個人的にいくつかの不安がありました。
</p>



<ul class="wp-block-list">
<li><br />    ながらくβ版のままで、あまりメンテナンスされていない<br />  </li>



<li><br />    ローカルコピーでプロジェクトに同梱しづらい<br />  </li>
</ul>



<p>
  そこで他の選択肢を探していましたところ、<br />
  これらの2つのライブラリが候補として挙がって来ました。
</p>



<p>
  お手軽さも上々なので、今後是非試していきたいリソースです。
</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana : インデックス</title>
		<link>https://blog.mach3.jp/2012/05/28/get-started-with-kohana-index.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 28 May 2012 10:32:25 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2502</guid>

					<description><![CDATA[PHPのWebアプリケーションフレームワークである「Kohana」の導入の記録をまとめました。 はじめてのKohana 本連載は、私がKohanaに興味をもって導入し、色々試してみた記録をまとめたものなので、 あまり体系 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPのWebアプリケーションフレームワークである「Kohana」の導入の記録をまとめました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



<span id="more-2502"></span>



<h2 class="wp-block-heading">はじめてのKohana</h2>



<p>本連載は、私がKohanaに興味をもって導入し、色々試してみた記録をまとめたものなので、 あまり体系的に紹介できていない部分があるかもしれませんが、ご了承ください。 また、導入時に書いた物なので、そこまで突っ込んだ内容はありません。</p>



<p><a href="/2012/05/get-started-with-kohana-01.html">続きを読む</a></p>



<h2 class="wp-block-heading">インデックス</h2>



<h3 class="wp-block-heading">1. <a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>はじめに</li>



<li>Kohanaについて</li>



<li>インストール</li>



<li>初期設定</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">2. <a href="/2012/05/get-started-with-kohana-02.html">コントローラとビューの基本</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>ルーティングとコントローラ</li>



<li>ビューを使って出力する</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">3. <a href="/2012/05/get-started-with-kohana-03.html">コントローラ</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>コントローラファイル</li>



<li>パラメータを受け取る</li>



<li>before / after</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">4. <a href="/2012/05/get-started-with-kohana-04.html">ルーティング</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>ルーティングを設定してURLをデザインする</li>



<li>パラメータを増やす</li>



<li>パラメータを省略する</li>



<li>様々な形式のフィードを出力する</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">5. <a href="/2012/05/get-started-with-kohana-05.html">ビュー</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>ビューファイル</li>



<li>ビューに値を渡す（set）</li>



<li>値を参照渡しする（bind）</li>



<li>共用の値を設定する</li>



<li>ビューの中のビュー</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">6. <a href="/2012/05/get-started-with-kohana-06.html">モデルとデータベース</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>モデルファイル</li>



<li>データベースの初期設定</li>



<li>データベースインスタンスとクエリの実行</li>



<li>結果を受け取る</li>



<li>クエリビルダー</li>



<li>プリペアドステートメント</li>



<li>DBクラスでのデータベース指定</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">7. <a href="/2012/05/get-started-with-kohana-07.html">バリデーション</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>値のチェックができるValidクラス</li>



<li>Validationクラス</li>



<li>エラーメッセージのカスタマイズ</li>



<li>独自のルールでチェックする</li>
</ol>
</blockquote>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana (7) : バリデーション</title>
		<link>https://blog.mach3.jp/2012/05/28/get-started-with-kohana-07.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 28 May 2012 10:31:28 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2484</guid>

					<description><![CDATA[「はじめてのKohana」、ラストの第七回目は、入力された値をチェックする為のバリデーションクラスを紹介します。 値のチェックができるValidクラス 単体の値のチェックには、Validクラスが使えます。 色々気の利いた [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「はじめてのKohana」、ラストの第七回目は、入力された値をチェックする為のバリデーションクラスを紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



<span id="more-2484"></span>



<h2 class="wp-block-heading">値のチェックができるValidクラス</h2>



<p>単体の値のチェックには、Validクラスが使えます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">Valid::email(<span class="hljs-string">"foo@example.com"</span>); <span class="hljs-comment">// &amp;lt;= TRUE</span>
Valid::alpha_numeric(<span class="hljs-string">"abcde12345"</span>); <span class="hljs-comment">// &amp;lt;= TRUE</span>
Valid::url(<span class="hljs-string">"http://www.example.com"</span>); <span class="hljs-comment">// &amp;lt;= TRUE</span>
</code></span></pre>


<p>色々気の利いたバリデーション用メソッドが揃っているので、 詳しくは公式ドキュメントを確認してみてください。</p>



<p>cf) <a href="http://kohanaframework.org/3.2/guide/api/Valid">Valid | Kohana User Guide</a></p>



<h2 class="wp-block-heading">Validationクラス</h2>



<p>フォームで入力された値を一括してチェックしたり、エラーを管理したりする場合に使えるのが Validationクラスです。</p>



<h3 class="wp-block-heading">初期化</h3>



<p>まず、検査したい値を配列でまとめて、Validationに渡してインスタンスを生成します。 この配列は多くの場合$_POSTか、それを加工した物でしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$vars = <span class="hljs-keyword">array</span>(
     <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"john"</span>,
     <span class="hljs-string">"email"</span> =&gt; <span class="hljs-string">"foo:example.com"</span>,
     <span class="hljs-string">"url"</span> =&gt; <span class="hljs-string">"http:/www.example.com"</span>,
     <span class="hljs-string">"message"</span> =&gt; <span class="hljs-string">""</span>
);

$validate = Validation::factory($vars);
</code></span></pre>


<h3 class="wp-block-heading">ルールの追加</h3>



<p>生成したインスタンスの rule メソッドを使ってルールを追加していきます。 今回のルールは以下のようにしてみました。</p>



<ul class="wp-block-list">
<li>name は8文字以上30文字以内</li>



<li>email はEメールアドレスの形式で</li>



<li>url はURLの形式で</li>



<li>message は140文字以内で</li>



<li>nameとmessageは必須</li>
</ul>



<pre class="wp-block-preformatted">$validate
    -&gt;rule("name", "not_empty")
    -&gt;rule("name", "min_length", array(":value", 8))
    -&gt;rule("name", "max_length", array(":value", 30))
    -&gt;rule("email", "email")
    -&gt;rule("url", "url")
    -&gt;rule("message", "not_empty")
    -&gt;rule("message", "max_length", array(":value", 140))
;
</pre>



<p>ruleの引数は、rule( $field, $callback, $params ) となっており、 $fieldにはフィールド名、$callbackには先に紹介したバリデーション用のメソッド名を、 そして$param には$callbackに渡すパラメータを設定します。</p>



<p>&#8220;:value&#8221; とあるのは入力された値を展開する為のプレースホルダです。</p>



<h3 class="wp-block-heading">バリデートの実行</h3>



<p>ルールを設定したら、check メソッドでチェックしてみましょう。 エラーがでなければ登録等の処理を行い、そうでなければエラーメッセージを表示する等します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">if</span>($validate-&gt;check()){
     <span class="hljs-comment">// バリデーションを無事通過したので、何か処理をする</span>
     <span class="hljs-keyword">echo</span> <span class="hljs-string">"Thanks !"</span>;
} <span class="hljs-keyword">else</span> {
     <span class="hljs-comment">// バリデーションエラーが発生</span>
     <span class="hljs-keyword">echo</span> Debug::vars($validate-&gt;errors(<span class="hljs-string">"validation"</span>));
}
</code></span></pre>


<p>errors メソッドの引数には、メッセージファイルの名前を渡します。 そして、返す値はフィールド名をキーにした連想配列になっています。</p>



<p>メッセージファイルの名前が &#8220;validation&#8221; の場合は、/application/message/validation.php か、無ければ /system/message/validation.php を参照します。 後者は雛形としてはじめから用意されているので、編集の際には書式などを参考にしましょう。</p>



<p>さて、先程渡した $vars はわざとエラーが出るような内容にしておいたので、 上のチェックの結果は次のようになります。何も弄っていなければ、フルイングリッシュですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">array</span>(<span class="hljs-number">4</span>) (
    <span class="hljs-string">"name"</span> =&gt; string(<span class="hljs-number">39</span>) <span class="hljs-string">"name must be at least 8 characters long"</span>
    <span class="hljs-string">"email"</span> =&gt; string(<span class="hljs-number">29</span>) <span class="hljs-string">"email must be a email address"</span>
    <span class="hljs-string">"url"</span> =&gt; string(<span class="hljs-number">17</span>) <span class="hljs-string">"url must be a url"</span>
    <span class="hljs-string">"message"</span> =&gt; string(<span class="hljs-number">25</span>) <span class="hljs-string">"message must not be empty"</span>
)
</code></span></pre>


<h2 class="wp-block-heading">エラーメッセージのカスタマイズ</h2>



<p>デフォルトのエラーメッセージだと英語のアラートが出るなんだか怖いサイトになってしまうので、 日本語のメッセージに置き換えてみましょう。</p>



<h3 class="wp-block-heading">メッセージを再定義</h3>



<p>下記のファイルを編集、もし無ければ新たに作成します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/application/message/validation.php</p>
</blockquote>



<p>そして、今回使用するルールだけを以下のように再定義してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">return</span> <span class="hljs-keyword">array</span>(
     <span class="hljs-string">"not_empty"</span> =&gt; <span class="hljs-string">":field は必須項目です。"</span>,
     <span class="hljs-string">"min_length"</span> =&gt; <span class="hljs-string">":field は :param2 文字以上で入力してください。"</span>,
     <span class="hljs-string">"max_length"</span> =&gt; <span class="hljs-string">":field は :param2 文字以内で入力してください。"</span>,
     <span class="hljs-string">"email"</span> =&gt; <span class="hljs-string">":field はEメールアドレスを入力してください。"</span>,
     <span class="hljs-string">"url"</span> =&gt; <span class="hljs-string">":field はWebサイトアドレスを入力してください。"</span>
);
</code></span></pre>


<p>:field はフィールド名、:param2 はメソッドに渡した第二引数を展開するプレースホルダです。 編集後に先程のエラーメッセージを改めて確認すると…</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">array</span>(<span class="hljs-number">4</span>) (
    <span class="hljs-string">"name"</span> =&gt; string(<span class="hljs-number">53</span>) <span class="hljs-string">"name は 8 文字以上で入力してください。"</span>
    <span class="hljs-string">"email"</span> =&gt; string(<span class="hljs-number">61</span>) <span class="hljs-string">"email はEメールアドレスを入力してください。"</span>
    <span class="hljs-string">"url"</span> =&gt; string(<span class="hljs-number">61</span>) <span class="hljs-string">"url はWebサイトアドレスを入力してください。"</span>
    <span class="hljs-string">"message"</span> =&gt; string(<span class="hljs-number">32</span>) <span class="hljs-string">"message は必須項目です。"</span>
)
</code></span></pre>


<p>メッセージが日本語化されました。が、フィールド名が英語のままで、気持ち悪いですね。</p>



<h3 class="wp-block-heading">フィールドの別名（ラベル）を設定する</h3>



<p>フィールド名には、別名（ラベル）を設定してそれを表示する事ができます。 ラベルの設定には label メソッドを使用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$validate
     -&gt;label(<span class="hljs-string">"name"</span>, <span class="hljs-string">"お名前"</span>)
     -&gt;label(<span class="hljs-string">"email"</span>, <span class="hljs-string">"E-Mail"</span>)
     -&gt;label(<span class="hljs-string">"url"</span>, <span class="hljs-string">"URL"</span>)
     -&gt;label(<span class="hljs-string">"message"</span>, <span class="hljs-string">"メッセージ"</span>)
;
</code></span></pre>


<p>このようにして改めて確認してみると、 以下のように無事、きちんとした日本語メッセージが表示されました。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">array</span>(<span class="hljs-number">4</span>) (
    <span class="hljs-string">"name"</span> =&gt; string(<span class="hljs-number">58</span>) <span class="hljs-string">"お名前 は 8 文字以上で入力してください。"</span>
    <span class="hljs-string">"email"</span> =&gt; string(<span class="hljs-number">76</span>) <span class="hljs-string">"E-Mail はEメールアドレスを入力してください。"</span>
    <span class="hljs-string">"url"</span> =&gt; string(<span class="hljs-number">61</span>) <span class="hljs-string">"URL はWebサイトアドレスを入力してください。"</span>
    <span class="hljs-string">"message"</span> =&gt; string(<span class="hljs-number">40</span>) <span class="hljs-string">"メッセージ は必須項目です。"</span>
)
</code></span></pre>


<p>cf) <a href="http://kohanaframework.org/3.2/guide/kohana/security/validation">Validation | Kohana User Guide</a></p>



<h2 class="wp-block-heading">独自のルールでチェックする</h2>



<p>rule メソッドの $callback に使えるのはValidクラスのメソッドだけでなく、定義済みの関数等も利用できます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$validate-&gt;rule(<span class="hljs-string">"user_id"</span>, <span class="hljs-string">"is_numeric"</span>); <span class="hljs-comment">// PHPの定義済み関数を使用</span>
$validate-&gt;rule(<span class="hljs-string">"user_id"</span>, <span class="hljs-string">"MyValid::is_user_id"</span>); <span class="hljs-comment">// 独自のバリデートクラスを使用</span>
</code></span></pre>


<p>Validクラスのメソッドだけだと面倒、または冗長になるような場合、 独自のクラスを作ってみると見通しが良くなるかもしれません。</p>



<p>その場合は、メッセージも新たに追加してあげましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">return</span> <span class="hljs-keyword">array</span>(
    …
    <span class="hljs-string">"is_numeric"</span> =&gt; <span class="hljs-string">":field は数値で入力してください"</span>,
    <span class="hljs-string">"MyValid::is_user_id"</span> =&gt; <span class="hljs-string">":field の形式が正しくありません"</span>
);
</code></span></pre>


<h2 class="wp-block-heading">まとめ</h2>



<p>全七回にわたってKohanaフレームワークの紹介をさせて頂きました。 Kohanaに興味を持った方へ、何かしらのとっかかりになれればなと思います。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>» <a href="/2012/05/get-started-with-kohana-index.html">もくじ</a></p>



<ol class="wp-block-list">
<li><a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a></li>



<li><a href="/2012/05/get-started-with-kohana-02.html">コントローラとビューの基本</a></li>



<li><a href="/2012/05/get-started-with-kohana-03.html">コントローラ</a></li>



<li><a href="/2012/05/get-started-with-kohana-04.html">ルーティング</a></li>



<li><a href="/2012/05/get-started-with-kohana-05.html">ビュー</a></li>



<li><a href="/2012/05/get-started-with-kohana-06.html">モデルとデータベース</a></li>



<li><em>バリデーション</em></li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana (6) : モデルとデータベース</title>
		<link>https://blog.mach3.jp/2012/05/28/get-started-with-kohana-06.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 28 May 2012 01:00:08 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2475</guid>

					<description><![CDATA[「はじめてのKohana」の第六回目です。 Kohanaのモデルとデータベースについて紹介します。 モデルファイル Kohanaのモデルは次の場所に格納します。 /application/classes/model/ 例 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「はじめてのKohana」の第六回目です。 Kohanaのモデルとデータベースについて紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



<span id="more-2475"></span>



<h2 class="wp-block-heading">モデルファイル</h2>



<p>Kohanaのモデルは次の場所に格納します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/application/classes/model/</p>
</blockquote>



<p>例えば、簡単なDataモデルを作って使用してみます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/application/classes/model/data.php</p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span> defined(<span class="hljs-string">'SYSPATH'</span>) <span class="hljs-keyword">or</span> <span class="hljs-keyword">die</span>(<span class="hljs-string">'No direct script access.'</span>);

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Model_Data</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span> </span>{

         <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getItem</span><span class="hljs-params">()</span></span>{
                    <span class="hljs-comment">// なにか処理をする</span>
                    <span class="hljs-keyword">return</span> $item;
         }
}
</span></code></span></pre>


<p>
    コントローラでインスタンスを作って使用してみましょう。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$model = <span class="hljs-keyword">new</span> Model_Data;
<span class="hljs-keyword">echo</span> $model-&gt;getItem();
</code></span></pre>


<p>
    オートロードのおかげで、設置場所と命名規則さえ守っていれば簡単に使用する事ができますね。
</p>



<p>
    モデル自体については特別これ以上書くことはなさそうなので、<br />
    続いてモデルと切っても切れないデータベースアクセスについて紹介します。
</p>



<h2 class="wp-block-heading">
    データベースの初期設定<br />
</h2>



<p>
    Kohanaのデータベースの初期設定は、
</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>
        /modules/database/config/database.php
    </p>
</blockquote>



<p>
    にあります。が、これを直接編集はしません。<br />
    これを雛形にして下記のパスに独自の設定ファイルを作り、<br />
    あとはKohanaに設定をカスケーディングしてもらいます。
</p>



<p>
    cf) <a href="http://kohanaframework.org/3.2/guide/kohana/files">Cascading Filesystem | Kohana User Guide</a>
</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>
        /application/config/database.php
    </p>
</blockquote>



<p>
    ファイルの中身を見ると分かりますが、<br />
    Kohanaは複数のデータベースインスタンスを持ち、それを切り替えて使用する事が出来ます。<br />
    つまり、開発用・テスト用・本番用のデータベースアクセスの設定をスイッチング出来るようになっているのです。
</p>



<p>
    詳細な設定内容については、雛形の内容をご参照ください。
</p>



<p>
    cf) <a href="http://kohanaframework.org/3.2/guide/database/config">Configuration | Kohana User Guide</a>
</p>



<h2 class="wp-block-heading">
    データベースインスタンスとクエリの実行<br />
</h2>



<p>
    データベースインスタンスの取得は、Database::instance( $name ) を使います。<br />
    例えば、&#8221;development&#8221; という名前で設定しておいたデータベースのインスタンスは
</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$db = Database::instance(<span class="hljs-string">"development"</span>);
</code></span></pre>


<p>
    このようにして取得する事ができます。<br />
    そしてインスタンスの query メソッドを使う事で、そのデータベースにクエリを送信します。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$result = $db-&gt;query(Database::SELECT, <span class="hljs-string">'SELECT * FROM mytable'</span>);
</code></span></pre>


<p>
    queryの第一引数（Database::SELECT）は、クエリのタイプです。<br />
    SELECT/INSERT/UPDATE/DELETEがあり、それぞれ返す値が異なります。
</p>



<ul class="wp-block-list">
<li><br />        SELECT : Database_MySQL_Result インスタンス<br />    </li>



<li><br />        INSERT : insert id と列数を含んだarray<br />    </li>



<li><br />        UPDATE/DELETE : affected rowsの数値<br />    </li>
</ul>



<p>
    cf) <a href="http://kohanaframework.org/3.2/guide/api/Database#query">Database | Kohana User Guide</a>
</p>



<h2 class="wp-block-heading">
    結果を受け取る<br />
</h2>



<p>
    Database::SELECTでクエリを送信した場合、結果が Database_MySQL_Result インスタンスで返されます。<br />
    この結果を1つずつ舐めて処理していきたい場合、例えば、次のようにします。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$result = $db-&gt;query(Database::SELECT, <span class="hljs-string">'SELECT * FROM mytable'</span>);

<span class="hljs-keyword">foreach</span>($result-&gt;as_array() <span class="hljs-keyword">as</span> $row){
    <span class="hljs-keyword">echo</span> Debug::vars($row);
}
</code></span></pre>


<p>
    as_array メソッドは、返された結果を連想配列で取得出来ます。
</p>



<p>
    または、配列に変換せずに次のように処理する事もできます。これは上の例と同様の結果が出力されます。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">while</span>($result-&gt;valid()){ <span class="hljs-comment">// valid は現在の行が存在するかを返す</span>
    $row = $result-&gt;current(); <span class="hljs-comment">// current は現在の行を返す</span>
    <span class="hljs-keyword">echo</span> Debug::vars($row);
    $result-&gt;next(); <span class="hljs-comment">// next で次の行にポインタを進める</span>
}

$result-&gt;rewind(); <span class="hljs-comment">// rewind で最初の行にポインタを戻す</span>
</code></span></pre>


<p>
    cf) <a href="http://kohanaframework.org/3.2/guide/api/Database_MySQL_Result">Database_MySQL_Result | Kohana User Guide</a>
</p>



<h2 class="wp-block-heading">
    クエリビルダー<br />
</h2>



<p>
    データベースインスタンスを使ってクエリを送信する方法の他に、<br />
    DBクラスを利用した、より安全な方法が提供されています。<br />
    その一つがクエリビルダーです。
</p>



<p>
    クエリビルダーは、メソッドを連ねていく事でクエリを動的に組み立てていくことができます。<br />
    CodeIgniterで言う所のActiveRecordのような物ですね。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// クエリの組立</span>
$query = DB::select(<span class="hljs-string">"id"</span>, <span class="hljs-string">"name"</span>, <span class="hljs-string">"created_at"</span>)
    -&gt;from(<span class="hljs-string">"users"</span>)
    -&gt;where(<span class="hljs-string">"id"</span>, <span class="hljs-string">"&gt;"</span>, <span class="hljs-number">3</span>)
    -&gt;where(<span class="hljs-string">"name"</span>, <span class="hljs-string">"&amp;lt;&gt;"</span>, <span class="hljs-string">"foo"</span>);

$query-&gt;execute(); <span class="hljs-comment">// executeで実行</span>
</code></span></pre>


<p>
    上のコードは、次のようなSQLを生成し、送信しています。<br />
    生成されるSQLは、$query-&gt;__toString(); で確認できます。
</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">SELECT id, name, created_at FROM users WHERE id &gt; 3 AND name <span class="hljs-tag">&lt;&gt;</span> ‘foo’
</code></span></pre>


<p>
    ここで挙げた以外にも組立に使える様々なメソッドが用意されています。
</p>



<p>
    cf) <a href="http://kohanaframework.org/3.2/guide/database/query/builder">Query Builder | Kohana User Guide</a>
</p>



<h2 class="wp-block-heading">
    プリペアドステートメント<br />
</h2>



<p>
    プリペアドステートメントも、クエリビルダー同様にDBクラスから提供されます。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$query = DB::query(Database::SELECT, <span class="hljs-string">'SELECT * FROM `mytable` WHERE id = :id AND name = :name'</span>);

<span class="hljs-comment">// parameters で値を渡す</span>
$query-&gt;parameters(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"id"</span> =&gt; <span class="hljs-number">123</span>,
    <span class="hljs-string">"name"</span> = <span class="hljs-string">"foo"</span>
));

<span class="hljs-comment">// param で1つずつ値を渡すこともできる</span>
$query-&gt;param(<span class="hljs-string">"id"</span>, <span class="hljs-number">123</span>);
$query-&gt;param(<span class="hljs-string">"name"</span>, <span class="hljs-string">"foo"</span>);

$result-&gt;execute(); <span class="hljs-comment">// executeで実行</span>
</code></span></pre>


<h3 class="wp-block-heading">
    bindによる参照渡し<br />
</h3>



<p>
    また、param の代わりに bind を使用すると値渡しではなく参照渡しをする事ができます。<br />
    繰り返し同じクエリを処理する場合に便利ですね。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$query = DB::query(Database::SELECT, <span class="hljs-string">'SELECT * FROM `users` WHERE name = :name'</span>);
$query-&gt;bind(<span class="hljs-string">":name"</span>, $name);

$names = <span class="hljs-keyword">array</span>( <span class="hljs-string">"foo"</span>, <span class="hljs-string">"bar"</span> );
<span class="hljs-keyword">foreach</span>($names <span class="hljs-keyword">as</span> $name){
    <span class="hljs-keyword">echo</span> Debug::vars($query-&gt;__toString());
}
</code></span></pre>


<p>
    出力結果はこのように。
</p>


<pre class="wp-block-code"><span><code class="hljs">string(40) “SELECT * FROM users WHERE name = ‘foo’”
string(40) “SELECT * FROM users WHERE name = ‘bar’”
</code></span></pre>


<p>
    cf) <a href="http://kohanaframework.org/3.2/guide/database/query/prepared">Prepared Statements | Kohana User Guide</a>
</p>



<h2 class="wp-block-heading">
    DBクラスでのデータベース指定<br />
</h2>



<p>
    クエリビルダーやプリペアドステートメントでアクセスするデータベースを選択したい場合は、<br />
    executeの引数に設定名またはインスタンスを渡します。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$query-&gt;execute(<span class="hljs-string">"development"</span>); <span class="hljs-comment">// 生成したクエリをdevelopmentに送信</span>

<span class="hljs-comment">// または</span>

$db = Database::instance(<span class="hljs-string">"development"</span>);
$query-&gt;execute($db);
</code></span></pre>


<p>
    または、Databaseの静的プロパティを書き換えても行けるようです。<br />
    セッターがないのでそういう使い方を想定しているかどうかはわかりません。
</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Database::$<span class="hljs-keyword">default</span> = <span class="hljs-string">"development"</span>;
</code></span></pre>


<h2 class="wp-block-heading">
    まとめ<br />
</h2>



<p>
    Kohanaのモデルとデータベースについてご紹介しました。<br />
    次回は、本連載最後になります。Kohanaのバリデーションクラスについてのご紹介です。
</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>
    » <a href="/2012/05/get-started-with-kohana-index.html">もくじ</a>
</p>



<ol class="wp-block-list">
<li><br />        <a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a><br />    </li>



<li><br />        <a href="/2012/05/get-started-with-kohana-02.html">コントローラとビューの基本</a><br />    </li>



<li><br />        <a href="/2012/05/get-started-with-kohana-03.html">コントローラ</a><br />    </li>



<li><br />        <a href="/2012/05/get-started-with-kohana-04.html">ルーティング</a><br />    </li>



<li><br />        <a href="/2012/05/get-started-with-kohana-05.html">ビュー</a><br />    </li>



<li><br />        <em>モデルとデータベース</em><br />    </li>



<li><br />        <a href="/2012/05/get-started-with-kohana-07.html">バリデーション</a><br />    </li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana (5) : ビュー</title>
		<link>https://blog.mach3.jp/2012/05/25/get-started-with-kohana-05.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 25 May 2012 01:00:17 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2469</guid>

					<description><![CDATA[「はじめてのKohana」の第五回目です。 今回は、Kohanaのビューについて紹介します。 ビューファイル Kohanaのビューファイルはこちらに格納する決まりになっています。 /application/views/  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「はじめてのKohana」の第五回目です。 今回は、Kohanaのビューについて紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



<span id="more-2469"></span>



<h2 class="wp-block-heading">ビューファイル</h2>



<p>Kohanaのビューファイルはこちらに格納する決まりになっています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/application/views/</p>
</blockquote>



<p>例えば、単純に文字列を表示するだけの「hello」というコントローラー・ビューを作ってみるとします。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/application/views/hello.php</p>
</blockquote>



<p>これがhelloビューの格納場所になります。 内容は適当に。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">HTML</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"ja"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Hello<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>

     Hello !!

<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></span></pre>


<p>では、このビューファイルをhelloコントローラーで出力してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Hello</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_index</span><span class="hljs-params">()</span></span>{
        $view = View::factory(<span class="hljs-string">"hello"</span>); <span class="hljs-comment">// Viewクラスでインスタンスを生成</span>
        <span class="hljs-keyword">$this</span>-&gt;response-&gt;body($view); <span class="hljs-comment">// 生成したインスタンスをResponseで出力</span>
    }
}
</code></span></pre>


<p>View::factory( $name ) で名前に応じたビューファイルからインスタンスを作る事ができます。 ビューの出力は、基本的にこのインスタンスを使って制御する事になります。</p>



<p>この例では、&#8221;hello&#8221; という名前から /application/views/hello.php を元にしたビューのインスタンスを生成しています。</p>



<h2 class="wp-block-heading">ビューに値を渡す（set）</h2>



<p>実際の運用では、ビューファイルに値を渡して、それにより値を表示させたり切り替えたりすると思います。 ビューに値を渡すには、ビューインスタンスのsetメソッドを利用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$view = View::factory(<span class="hljs-string">"hello"</span>);
$view-&gt;set(<span class="hljs-string">"name"</span>, <span class="hljs-string">"John"</span>); <span class="hljs-comment">// set( $key, $value );</span>
</code></span></pre>


<p>上記の形以外にも、連想配列で引数を渡したり、プロパティの追加でも値を設定する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// 下の3つは全て同じ処理</span>
$view-&gt;set(<span class="hljs-string">"name"</span>, <span class="hljs-string">"John"</span>);
$view-&gt;set( aray(<span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"John"</span>) );
$view-&gt;name = <span class="hljs-string">"John"</span>;
</code></span></pre>


<p>setされた値は、ビューファイル側でキーの名前の変数にて参照できます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">Hello, <span class="php"><span class="hljs-meta">&lt;?php</span> <span class="hljs-keyword">echo</span> $name; <span class="hljs-meta">?&gt;</span></span> !!
</code></span></pre>


<h2 class="wp-block-heading">値を参照渡しする（bind）</h2>



<p>setは値渡しですが、bindメソッドを使えば参照渡しをする事も出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$foo = <span class="hljs-string">"bar"</span>;

$view = View::factory(<span class="hljs-string">"hello"</span>);
$view-&gt;bind(<span class="hljs-string">"foo"</span>, $foo);
<span class="hljs-keyword">$this</span>-&gt;response-&gt;body($view);

$foo = <span class="hljs-string">"piyo"</span>;
</code></span></pre>


<p>（ビューファイルでの結果）</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">echo</span> $foo; <span class="hljs-comment">// &lt;= "piyo"</span>
</code></span></pre>


<p>setを使った場合は、上の出力結果は&#8221;bar&#8221;になります。</p>



<h2 class="wp-block-heading">共用の値を設定する</h2>



<p>複数のビュー・アクションで共通の値を利用したい場合は、set_global または bind_global を使用します。 beforeメソッド等で値を設定しておけば、そのコントローラー内の全てのアクションのビューでその値を参照できます。</p>



<p>set_global と bind_global の違いは set / bind と同様に、値渡しをするか、参照渡しをするかの違いです。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">before</span><span class="hljs-params">()</span></span>{
    View::set_global(<span class="hljs-string">"title"</span>, <span class="hljs-string">"HELLO PAGE"</span>);
}
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_index</span><span class="hljs-params">()</span></span>{
    $view = View::factory(<span class="hljs-string">"hello"</span>);
    <span class="hljs-keyword">$this</span>-&gt;response-&gt;body($view);
}
</code></span></pre>


<p>（ビューファイルでの結果）</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">echo</span> $title; <span class="hljs-comment">// &lt;= "HELLO PAGE"</span>
</code></span></pre>


<h2 class="wp-block-heading">ビューの中のビュー</h2>



<p>ウィジェット等の出力でよく使われると思いますが、 ビューの中にビューを展開する為の方法として、公式のドキュメントでは幾つかのアプローチが提案されています。 状況と目的に応じて使い分けるとよいでしょう。</p>



<h3 class="wp-block-heading">ビューの中でインスタンスを生成する</h3>



<p>基本的にそのインスタンスでset/bindした値しか使えません。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>
    <span class="hljs-keyword">echo</span> View::factory(<span class="hljs-string">"widget"</span>)-&gt;bind(<span class="hljs-string">"foo"</span>, $foo);
<span class="hljs-meta">?&gt;</span></span>
</code></span></pre>


<h3 class="wp-block-heading">ビューの中でincludeする</h3>



<p>より原始的な方法です。 特徴としては、親のビューのコンテキストで展開されるので、 親のビューで使用できる全ての値が子のビューでも使用できます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>
    <span class="hljs-keyword">include</span> Kohana::find_file(<span class="hljs-string">"views"</span>, <span class="hljs-string">"widget"</span>);
<span class="hljs-meta">?&gt;</span></span>
</code></span></pre>


<h3 class="wp-block-heading">コントローラ内で、子のビューを親のビューにアサインする</h3>



<p>親となるビューに、子のビューのインスタンスを生成して渡します。 コントローラで表示を操れるのが特徴です。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$view = View::factory(<span class="hljs-string">"layout"</span>);
$view-&gt;widget = View::factory(<span class="hljs-string">"widget"</span>)-&gt;set(<span class="hljs-string">"foo"</span>, $foo);
<span class="hljs-keyword">$this</span>-&gt;response-&gt;body($view);
</code></span></pre>


<p>cf) <a href="http://kohanaframework.org/3.2/guide/kohana/mvc/views">Views | Kohana User Guide</a></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>Kohanaのビューについてご紹介しました。 次回は、アプリの核となるデータベースとモデルの話をします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>» <a href="/2012/05/get-started-with-kohana-index.html">もくじ</a></p>



<ol class="wp-block-list">
<li><a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a></li>



<li><a href="/2012/05/get-started-with-kohana-02.html">コントローラとビューの基本</a></li>



<li><a href="/2012/05/get-started-with-kohana-03.html">コントローラ</a></li>



<li><a href="/2012/05/get-started-with-kohana-04.html">ルーティング</a></li>



<li><em>ビュー</em></li>



<li><a href="/2012/05/get-started-with-kohana-06.html">モデルとデータベース</a></li>



<li><a href="/2012/05/get-started-with-kohana-07.html">バリデーション</a></li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana (4) : ルーティング</title>
		<link>https://blog.mach3.jp/2012/05/24/get-started-with-kohana-04.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 24 May 2012 01:00:44 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2463</guid>

					<description><![CDATA[「はじめてのKohana」の第四回目です。 今回は、KohanaのURLルーティングについて紹介します。 ルーティングを設定してURLをデザインする ルーティングの設定は、追加・編集する事ができます。 多くのケースはデフ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「はじめてのKohana」の第四回目です。 今回は、KohanaのURLルーティングについて紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



<span id="more-2463"></span>



<h2 class="wp-block-heading">ルーティングを設定してURLをデザインする</h2>



<p>ルーティングの設定は、追加・編集する事ができます。</p>



<p>多くのケースはデフォルトのルーティングでまかなえるかもしれませんが、 ルーティングを駆使する事でよりユーザーフレンドリーなURLをつくり上げる事ができます。</p>



<p>幾つかのケースを例としてあげてみます。</p>



<h2 class="wp-block-heading">パラメータを増やす</h2>



<p>例えば、下記のようにパラメータにIDを渡して記事を表示するコントローラを作ったとします。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/article/show/12345</p>
</blockquote>



<p>これに対して、IDだけではなくカテゴリも渡したいとします。 カテゴリは、IDの前に挟む形とします。例えば、こんなふうに。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/article/show/news/12345</p>
</blockquote>



<p>これを実現するためのルーティング設定は、次のようになるでしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">Route::set(
    <span class="hljs-string">'article'</span>,  <span class="hljs-comment">// 1. ルーティングの名前</span>
    <span class="hljs-string">'(&amp;lt;controller&gt;(/&amp;lt;action&gt;(/&amp;lt;category&gt;(/&amp;lt;id&gt;))))'</span>, <span class="hljs-comment">// 2. ルーティングルール</span>
    <span class="hljs-keyword">array</span>( <span class="hljs-string">'controller'</span> =&gt; <span class="hljs-string">'article'</span> ) <span class="hljs-comment">// 3. ルールを適用する条件</span>
);
</code></span></pre>


<p>名前は重複しなければ好きな名前で良いです。 第三引数の「ルールを適用する条件」は、URLがルーティングルールによって解析された結果、 &#8220;controller&#8221; の値が &#8220;article&#8221; である場合に適用する、という事を示しています。</p>



<p>&#8220;article&#8221; の部分は正規表現として処理されるので、 もしも &#8220;information&#8221; コントローラでもこのルーティングを使用したければ、下記のようにすればよいでしょう。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>array( &#8216;controller&#8217; =&gt; &#8216;(article|information)&#8217; ),</p>
</blockquote>



<h2 class="wp-block-heading">パラメータを省略する</h2>



<p>例えば、ユーザのプロフィールを表示するためのコントローラを作ったとします。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Users</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    …
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_profile</span><span class="hljs-params">()</span></span>{
        <span class="hljs-comment">// プロフィールを表示する処理</span>
    }
    ...
}
</code></span></pre>


<p>現状のアクセス方法は以下のようになっていますが、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/users/profile/john</p>
</blockquote>



<p>次のようにシンプルにしたい。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/john</p>
</blockquote>



<p>この方がよりわかりやすく、ドメインとユーザ名だけ覚えておけば簡単にアクセス出来ますね。 これを実現する為に、次のようなルーティング設定をしてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/**
 * デフォルトのルーティング
 */</span>
Route::set(
    <span class="hljs-string">"default"</span>,
    <span class="hljs-string">"(&amp;lt;controller&gt;(/&amp;lt;action&gt;(/&amp;lt;id&gt;)))"</span>,
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"controller"</span> =&gt; <span class="hljs-string">"(foo|bar|users)"</span> <span class="hljs-comment">// 定義済みコントローラ名を羅列</span>
    )
)
-&gt;defaults(
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"controller"</span> =&gt; <span class="hljs-string">"welcome"</span>,
        <span class="hljs-string">"action"</span> =&gt; <span class="hljs-string">"index"</span>
    )
);

<span class="hljs-comment">/**
 * Controller_Users用のショートカット
 */</span>
Route::set(
    <span class="hljs-string">"users_shortcut"</span>,
    <span class="hljs-string">"&amp;lt;user_id&gt;(/&amp;lt;action&gt;)"</span>,
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"user_id"</span> =&gt; <span class="hljs-string">"&#91;a-zA-Z0-9_]+"</span> <span class="hljs-comment">// user_id用の正規表現</span>
    )
)
-&gt;defaults(
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"controller"</span> =&gt; <span class="hljs-string">"users"</span>, <span class="hljs-comment">// 初期設定のコントローラ</span>
        <span class="hljs-string">"action"</span> =&gt; <span class="hljs-string">"profile"</span> <span class="hljs-comment">// 初期設定のアクション</span>
    )
);
</code></span></pre>


<p>前半部分は、元々あったデフォルトのルールを弄り、 既に定義済みのコントローラ名にマッチする物だけに適用されるようにしました。</p>



<p>後半は肝となるController_Usersのショートカット用のルールです。 ユーザーIDの書式にマッチする物であれば、Controller_Usersのアクションを実行するようになります。</p>



<p>(/<action>) の部分は、ユーザーIDの後にメソッド名を渡す事で、 プロフィール閲覧以外のアクションが起こせるようにするための物です。</action></p>



<p>例えば、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/john/favorites</p>
</blockquote>



<p>等とすれば、Controller_Usrs の action_favorites が呼ばれ、 johnさんがお気に入りに登録した情報が表示される、といった事が出来ます。</p>



<p>尚、Kohanaでは controller と action はルーティングにおいて必須になっており、 上で挙げた例のように省略したい場合は、必ず defaults メソッドで初期値を設定してやる必要があります。</p>



<h3 class="wp-block-heading">ユーザ名の予約語</h3>



<p>ここで気をつけなければならないのは、このようなURLにする場合、 コントローラ名として定義されている物はユーザ名として提供できなくなるという事です。</p>



<p>それらを予約語としてリスト化する等して、登録時にはじく処理を加える必要がありますね。</p>



<h2 class="wp-block-heading">様々な形式のフィードを出力する</h2>



<p>ルーティングは、必ずしも /（スラッシュ）のみで区切られていなければならないわけではありません。 その一例として、RSSやAtom、JSON等、様々な形式で情報を出力したい場合のルーティングの例を挙げます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">Route::set(
    <span class="hljs-string">"feed"</span>,
    <span class="hljs-string">"&amp;lt;controller&gt;.&amp;lt;filetype&gt;"</span>,
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"controller"</span> =&gt; <span class="hljs-string">"feed"</span>,
        <span class="hljs-string">"filetype"</span> =&gt; <span class="hljs-string">"(xml|rss|atom|json)"</span>
    )
)
-&gt;defaults(
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"action"</span> =&gt; <span class="hljs-string">"index"</span>
    )
);
</code></span></pre>


<p>コントローラはこのような感じで。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Feed</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    ...
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_index</span><span class="hljs-params">()</span></span>{
        $filetype = <span class="hljs-keyword">$this</span>-&gt;request-&gt;param(<span class="hljs-string">"filetype"</span>);
        <span class="hljs-comment">// フィードを出力する処理</span>
    }
}
</code></span></pre>


<p>次のようなパスでアクセスできます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/feed.rss</p>
</blockquote>



<p>cf) <a href="http://kohanaframework.org/3.2/guide/kohana/routing">Routing | Kohana User Guide</a></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>見通しの良いURLは、アプリケーションの使い勝手を向上させると思います。 URLのデザインにも気を使ってあげたいですね。</p>



<p>次回は、ビューについて。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>» <a href="/2012/05/get-started-with-kohana-index.html">もくじ</a></p>



<ol class="wp-block-list">
<li><a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a></li>



<li><a href="/2012/05/get-started-with-kohana-02.html">コントローラとビューの基本</a></li>



<li><a href="/2012/05/get-started-with-kohana-03.html">コントローラ</a></li>



<li><em>ルーティング</em></li>



<li><a href="/2012/05/get-started-with-kohana-05.html">ビュー</a></li>



<li><a href="/2012/05/get-started-with-kohana-06.html">モデルとデータベース</a></li>



<li><a href="/2012/05/get-started-with-kohana-07.html">バリデーション</a></li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana (3) : コントローラ</title>
		<link>https://blog.mach3.jp/2012/05/23/get-started-with-kohana-03.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 23 May 2012 01:00:10 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2456</guid>

					<description><![CDATA[「はじめてのKohana」の第三回目です。 前回ご紹介したコントローラをもう少し詳しく紹介します。 コントローラファイル まずはコントローラファイルのおさらいから。 Kohanaのコントローラは、命名規則に従ってクラス名 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「はじめてのKohana」の第三回目です。 前回ご紹介したコントローラをもう少し詳しく紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



<span id="more-2456"></span>



<h2 class="wp-block-heading">コントローラファイル</h2>



<p>まずはコントローラファイルのおさらいから。</p>



<p>Kohanaのコントローラは、命名規則に従ってクラス名やアクション名をつけ、 application/class/controller に格納する決まりとなっています。</p>



<p>例えば、あるコンテンツに /foo/bar でアクセスしたい場合。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Foo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    ...
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_bar</span><span class="hljs-params">()</span></span>{
        <span class="hljs-comment">// do something</span>
    }
    ...
}
</code></span></pre>


<p>こんな内容を、application/classes/controller/foo.php に保存すればOKです。</p>



<h2 class="wp-block-heading">パラメータを受け取る</h2>



<p>動的なWebページを生成する為には、URLを介してパラメータを受け取るのが基本です。</p>



<p>他のWebアプリケーションフレームワーク同様、 クラス名・アクション名の後にパラメータを渡して それをコントローラ内で受け取る事が出来ます。</p>



<p>例えば、「記事の詳細をIDを渡して表示させるアクションを作る」場合。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/article/show/12345</p>
</blockquote>



<p>このようにして記事のIDを3つ目のパラメータとして渡します。 このIDをコントローラ側で受け取るには、 $this-&gt;request-&gt;param($key) とします。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Article</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    ...
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_show</span><span class="hljs-params">()</span></span>{
        $id = <span class="hljs-keyword">$this</span>-&gt;request-&gt;param(<span class="hljs-string">"id"</span>); <span class="hljs-comment">// &lt;= "12345"</span>
        <span class="hljs-comment">// id を元にして何かをする</span>
    }
    ...
}
</code></span></pre>


<p>上のコードではparamメソッドの引数には&#8221;id&#8221;なる文字列が渡されていますが、 これはルーティングの設定でそのようなキーが設定されているためです。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">Route::set(<span class="hljs-string">'default'</span>, <span class="hljs-string">'(&lt;controller&gt;(/&lt;action&gt;(/&lt;id&gt;)))'</span>)
    -&gt;defaults(<span class="hljs-keyword">array</span>(
        <span class="hljs-string">'controller'</span> =&gt; <span class="hljs-string">'welcome'</span>,
        <span class="hljs-string">'action'</span>     =&gt; <span class="hljs-string">'index'</span>,
    ));
</code></span></pre>


<p>ルーティングの設定は、bootstrap.php の最後に記載されています。 デフォルトでは下記コードのように、3つ目のパラメータが&#8221;id&#8221;とされている為、 paramメソッドで引っ張ってこれたわけです。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">'(<span class="hljs-tag">&lt;<span class="hljs-name">controller</span>&gt;</span>(/<span class="hljs-tag">&lt;<span class="hljs-name">action</span>&gt;</span>(/<span class="hljs-tag">&lt;<span class="hljs-name">id</span>&gt;</span>)))'
</code></span></pre>


<p>このルーティングは追加・編集する事で様々な事が実現できますが、 その話はまた別の機会に。</p>



<h2 class="wp-block-heading">before / after</h2>



<p>Kohanaのコントローラではコンスラクタは使用できません。（不可能ではないですが、推奨されません） その代替として、アクションメソッドの実行前後に処理されるbefore / after メソッドを使うことが出来ます。</p>



<h3 class="wp-block-heading">before メソッド</h3>



<p>アクションメソッドが実行される前に処理されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Foo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    <span class="hljs-keyword">private</span> $title = <span class="hljs-keyword">null</span>;

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">before</span><span class="hljs-params">()</span></span>{
        <span class="hljs-keyword">$this</span>-&gt;title = <span class="hljs-keyword">$this</span>-&gt;request-&gt;controller() . <span class="hljs-string">" - "</span> . <span class="hljs-keyword">$this</span>-&gt;request-&gt;action();
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_index</span><span class="hljs-params">()</span></span>{
        <span class="hljs-keyword">echo</span> <span class="hljs-keyword">$this</span>-&gt;title; <span class="hljs-comment">// &lt;= "foo - index"</span>
    }
}
</code></span></pre>


<h3 class="wp-block-heading">after メソッド</h3>



<p>アクションメソッドが実行された後に処理されます。</p>



<p>下記はコントローラ名とアクション名から勝手にビューを出力してみる例。 fooコントローラのindexアクションの場合、ビューファイル &#8220;foo/index.php&#8221; を出力します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Foo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    ...
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">after</span><span class="hljs-params">()</span></span>{
        $name = <span class="hljs-keyword">$this</span>-&gt;request-&gt;controller() . <span class="hljs-string">"/"</span> . <span class="hljs-keyword">$this</span>-&gt;request-&gt;action();
        $view = View::factory($name);
        <span class="hljs-keyword">$this</span>-&gt;response-&gt;body($view);
    }
    ...
}
</code></span></pre>


<p>cf) <a href="http://kohanaframework.org/3.2/guide/kohana/mvc/controllers">Controllers | Kohana User Guide</a></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>今回はKohanaのコントローラについて少し掘り下げました。 次回は、コントローラと切れない関係にあるルーティングの紹介をします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>» <a href="/2012/05/get-started-with-kohana-index.html">もくじ</a></p>



<ol class="wp-block-list">
<li><a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a></li>



<li><a href="/2012/05/get-started-with-kohana-02.html">コントローラとビューの基本</a></li>



<li><em>コントローラ</em></li>



<li><a href="/2012/05/get-started-with-kohana-04.html">ルーティング</a></li>



<li><a href="/2012/05/get-started-with-kohana-05.html">ビュー</a></li>



<li><a href="/2012/05/get-started-with-kohana-06.html">モデルとデータベース</a></li>



<li><a href="/2012/05/get-started-with-kohana-07.html">バリデーション</a></li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana (2) : コントローラとビューの基本</title>
		<link>https://blog.mach3.jp/2012/05/22/get-started-with-kohana-02.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 22 May 2012 01:00:01 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2450</guid>

					<description><![CDATA[「はじめてのKohana」の第二回目は、コントローラとビューのごく基本的な使い方を紹介します。 ルーティングとコントローラ まず、前記事で表示された「hello, world !」の実体はどこにあるのか、から見てみましょ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「はじめてのKohana」の第二回目は、コントローラとビューのごく基本的な使い方を紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



<span id="more-2450"></span>



<h2 class="wp-block-heading">ルーティングとコントローラ</h2>



<p>まず、前記事で表示された「hello, world !」の実体はどこにあるのか、から見てみましょう。 bootstrap.php を見てみると、末尾に次のような設定記述があります</p>


<pre class="wp-block-code"><span><code class="hljs language-php">Route::set(<span class="hljs-string">'default'</span>, <span class="hljs-string">'(&lt;controller&gt;(/&lt;action&gt;(/&lt;id&gt;)))'</span>)
    -&gt;defaults(<span class="hljs-keyword">array</span>(
        <span class="hljs-string">'controller'</span> =&gt; <span class="hljs-string">'welcome'</span>,
        <span class="hljs-string">'action'</span>     =&gt; <span class="hljs-string">'index'</span>,
    ));
</code></span></pre>


<p>詳しい説明は省きますが、ここでは全てのパラメータを省略してアクセスされた場合のルーティングの設定をしています。 初期設定では、&#8221;welcome&#8221; コントローラの &#8220;index&#8221; アクションを呼ぶ設定となっています。 ではそのコントローラはどこに格納されているかというと、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/application/classes/controller/welcome.php</p>
</blockquote>



<p>ここにあるわけです。コントローラは全て、このディレクトリに設置する決まりとなっています。 さらにファイルの中身を見てみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span> defined(<span class="hljs-string">'SYSPATH'</span>) <span class="hljs-keyword">or</span> <span class="hljs-keyword">die</span>(<span class="hljs-string">'No direct script access.'</span>);

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Welcome</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_index</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">$this</span>-&gt;response-&gt;body(<span class="hljs-string">'hello, world!'</span>);
    }
} <span class="hljs-comment">// End Welcome</span>
</span></code></span></pre>


<p>中身を見ると、どのような命名規則になっているのか大体わかりますね。 このルールに則ってコントローラ・アクションを探し、無かった場合は404を返す仕組みです。</p>



<ul class="wp-block-list">
<li>ファイル名 : &#8220;welcome.php&#8221; （[name].php）</li>



<li>コントローラ名 : &#8220;Controller_Welcome&#8221; （Controller_[Name]）</li>



<li>アクション名 : &#8220;action_index&#8221; （action_[name]）</li>
</ul>



<p>例えば /foo/bar でアクセスさせたい場合は、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/application/classes/controller/foo.php</p>
</blockquote>



<p>を設置し、内容を次のようにします。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span> defined(<span class="hljs-string">'SYSPATH'</span>) <span class="hljs-keyword">or</span> <span class="hljs-keyword">die</span>(<span class="hljs-string">'No direct script access.'</span>);

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Controller_Foo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_bar</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-comment">// do something</span>
    }
}
</span></code></span></pre>


<h2 class="wp-block-heading">
  ビューを使って出力する<br />
</h2>



<p>
  上の例では文字列をそのまま出力していますが、Webアプリケーションを作る場合はビューファイルを使用します。<br />
  ビューファイルの格納場所は
</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>
    /application/views/
  </p>
</blockquote>



<p>
  です。ここでは名前を &#8220;foo&#8221; として、 foo.php を作ってみましょう。
</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>
    /application/views/foo.php
  </p>
</blockquote>



<p>
  中身は適当なHTMLを記述しておきます。<br />
  （実際は値を受け取る等しますが、それはまた別の記事で）
</p>



<h1 class="wp-block-heading">Hello !!</h1>



<p>こんにちは！</p>



<p>
  次に、設置したビューファイルをコントローラから出力してみます。<br />
  先程作ったfooコントローラのbarアクションを編集しましょう。
</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action_bar</span><span class="hljs-params">()</span>
</span>{
    $view = View::factory(<span class="hljs-string">"foo"</span>);
    <span class="hljs-keyword">$this</span>-&gt;response-&gt;body($view);
}
</code></span></pre>


<p>
  View::factory(&#8220;[view_name]&#8221;); でビューファイルを基にしたビューインスタンスが生成され、<br />
  それを元に $this-&gt;response-&gt;body() で出力をします。
</p>



<p>
  再度 /foo/bar にアクセスすると、設置したビューファイルの中身が出力されるはずです。
</p>



<h2 class="wp-block-heading">
  まとめ<br />
</h2>



<p>
  Kohanaのコントローラとビューの基本的な点をまとめました。<br />
  次回は、コントローラについてもう少し詳しくご紹介します。
</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>
  » <a href="/2012/05/get-started-with-kohana-index.html">もくじ</a>
</p>



<ol class="wp-block-list">
<li><br />    <a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a><br />  </li>



<li><br />    <em>コントローラとビューの基本</em><br />  </li>



<li><br />    <a href="/2012/05/get-started-with-kohana-03.html">コントローラ</a><br />  </li>



<li><br />    <a href="/2012/05/get-started-with-kohana-04.html">ルーティング</a><br />  </li>



<li><br />    <a href="/2012/05/get-started-with-kohana-05.html">ビュー</a><br />  </li>



<li><br />    <a href="/2012/05/get-started-with-kohana-06.html">モデルとデータベース</a><br />  </li>



<li><br />    <a href="/2012/05/get-started-with-kohana-07.html">バリデーション</a><br />  </li>
</ol>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
