[PHP]Laravelのビューで@includeしているパーツに値を渡す(View Composers)

多くのサイトはヘッダー、メイン、サイドカラム、フッターなどのパーツに分かれており、それぞれのパーツはページが変わってもメイン以外はほぼ同じの内容を表示しています。
例えばブログの場合、サイドバーに表示される内容は新着記事の一覧やカテゴリー一覧などが表示されていることが多いと思います。

通常 Laravel 5.0 では次のようにしてコントローラーから表示に必要な変数を受け取ります。

public function index()
{
    $data = array();
    $data['categories'] = Post::Category->all();
    return view('index', $data);
}

配列のキー部分が変数名になるので、Blade ビューでは「$categories」にカテゴリー一覧が格納されることになります。

しかし、サイトのページが1つしかないならこの方法でも構いませんが、実際には多くのページとそれに対応するコントローラがあり、サイドバーに表示するためだけに同じ記述をすべてのビューコントローラーに繰り返し書くのは良い方法ではありません。

そこで、View Composers を使い、それぞれパーツに対応するコントローラを作成することで、そのパーツが読み込まれるたびに必要な変数が自動的に用意されるようします。

まずはプロバイダー「ComposerServiceProvider」を作成します。
「app/Providers/ComposerServiceProvider.php」となるようにファイルを作成して下さい。
内容は次のようにします。

<?php namespace App\Providers;

use View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider {

	public function boot()
	{
		//
	}

	public function register()
	{
		//
	}

}

boot() にビューに対応する処理を記述します。
方法は2種類あり、クロージャーを使ってこのファイルに直接書く方法と、コントローラーを指定して別ファイルに詳細を記述する方法です。
まずは単純にクロージャーを使ってサイドバーテンプレート「views/sidebar.blade.php」が読み込まれた際にカテゴリー一覧が取得できるようにしてみます。

public function boot()
{
    View::composer('sidebar', function($view)
    {
        $view->categories = Category::all();
    });
}

これでビューの $categories にすべてのカテゴリーが格納されます。
第一引数にはテンプレートファイルを指定します。もしテンプレートファイル sidebar.blade.php が layouts フォルダなどに入っている場合は第一引数を「layouts.sidebar」とします。
例では Category モデルを使っているのでファイルの最初に「use App\Category;」の記述を忘れないようにして下さい。

このままでは ComposerServiceProvider.php は読み込まれないので、「app/config/app.php」の providers に「App\Providers\ComposerServiceProvider」を追加します。
コンソールで「composer dump-autoload」とすると適用されます。

次に、コントローラーを指定して別ファイルで同じ処理をしてみます。
コントローラーは「app/Http/Controllers/ViewComposers/SidebarComposer.php」となるようにフォルダとファイルを作ります。
内容は次のとおりです。

<?php namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use App\Category;

class SidebarComposer {

	protected $categories;

	public function __construct()
	{
		$this->categories = Category::all();
	}

	public function compose(View $view)
	{
		$data = array();
		$data['categories'] = $this->categories;
		$view->with($data);
	}

}

継承しやすいようにコンストラクタでカテゴリー一覧を取得しています。
compose() でビューに変数を渡しています。

コントローラーの作成が済んだら ComposerServiceProvider.php に戻り、boot() を次のようにします。

public function boot()
{
    View::composer('sidebar', 'App\Http\ViewComposers\SidebarComposer');
}

第2引数には先ほど作ったコンポーザークラスへのパスを記述します。
これでパーツが読み込まれた際に自動的に SidebarComposer での処理が行われます。

処理が複雑な場合はコントローラーに、単純な場合はクロージャーに書くなど、目的に応じて使い分けることになると思います。

[PHP]WindowsでHomesteadを使ってLaravel5開発環境を作る(2/2)

前回の続き)

前回の記事で Vagrant に Homestead をインストールし、Windows から仮想OSを起動するところまで行いました。次は仮想環境に Laravel アプリケーションを作成してみます。

Homestead にはすでに Web サーバーや MySql、Composer などの環境が揃っています。SSH でログインすればすぐにそれらを利用できます。

cd ~/Homestead
vagrant ssh

これだけで SSH ログインが可能です。もし「vagrant ssh」を使わずに使い慣れたツールからログインするなら次の設定でもログインできます。

IP: 127.0.0.1
Port: 2222
User: vagrant
Password: vagrant

前回「C:\Users\ユーザー名\Code\Laravel\public\index.php」にテスト用のファイルを置いて動作を確認しました。今回は実際に Laravel プロジェクトを「/Home/Code/Laravel」に作ってみます。動作テストで作った Laravel フォルダは不要なので削除しておいて下さい。(Windows側からでも構いません)

rm -r ~/Code/Laravel

プロジェクト作成は仮想環境側から行います。書式は「composer create-project laravel/laravel プロジェクト名 –prefer-dist」です。

cd ~/Code
composer create-project laravel/laravel Laravel --prefer-dist

無事にインストールが済んだらブラウザで「http://homestead.app」にアクセスしてみます。正常なら Laravel の初期画面が表示されているはずです。

laravel5

これでプロジェクト作成は完了です。Windows 側からもホームの Code フォルダに同じプロジェクトフォルダが存在するのが確認できるはずです。


サイトの追加

サイトが一つ出来たので、さらにもう一つサイトを追加してみます。
今回は「http://sample.homestead.app」にアクセスしたら「/home/vagrant/Code/sample/public」の内容が表示されるようにしてみます。
コマンドはこちらです。SSH ログインした仮想環境側で実行して下さい。

serve sample.homestead.app /home/vagrant/Code/sample/public

あとは Windows に戻り、「C:\Windows\System32\drivers\etc\hosts」に管理者権限で追記します。

192.168.10.10    sample.homestead.app

あとは先程と同様に Laravel プロジェクトを仮想環境上に作成します。

cd ~/Code
composer create-project laravel/laravel sample --prefer-dist

これで Code フォルダ内に sample が作られ、「http://sample.homestead.app」からアクセスできるようになりました。


データベース管理ツール

データベースの操作はコマンドでもできますが、phpMyAdmin などの GUI ツールがあると便利です。まずは apt-get で仮想環境にインストールしてみます。

sudo apt-get install phpmyadmin

ユーザー vagrant のパスワードは「vagrant」です。sudo で必要ならそのように入力して下さい。phpmyadmin は「/usr/share/phpmyadmin/」にインストールされます。先ほどと同じように serve コマンドを使って「http://phpmyadmin.app」のアドレスから「/usr/share/phpmyadmin/」にアクセスできるようにします。

serve phpmyadmin.app /usr/share/phpmyadmin/

Windows の hosts にも次の行を書き加えます。

192.168.10.10    phpmyadmin.app

これで「http://phpmyadmin.app」から phpMyAdmin ページに移動できます。
mysql のユーザー名 homestead、パスワード secret でログイン可能です。

phpMyAdmin の代わりに Windows のアプリケーションを使って管理することも出来ます。代表的な管理ツールとして、公式の MySQL Workbench などが有ります。
基本的な設定は次のようにします。

Host: 127.0.0.1
Port: 33060
Username: homestead
Password: secret

/etc/mysql/my.cnf の bind-address の設定によっては Host の IP が変わるかもしれませんが、こちらの環境では上記で接続出来ました。

[PHP]WindowsでHomesteadを使ってLaravel5開発環境を作る(1/2)

PHP のアプリケーションフレームワークである Laravel には Homestead という Vagrant 用の box が用意されています。
Vagrant とは VirtualBox などの仮想化ソフトと組み合わせて、1台のコンピュータ内に別の OS を使った開発環境を簡単に構築できるソフトウェアです。box と呼ばれるファイルを読み込むとそれに保存されていた環境が再現されるため、面倒なサーバーの初期設定をしなくてもすぐに開発に入ることができます。
この記事では Windows の VirtualBox に Homestead を使った Laravel 5 の開発環境を作ります。

インストールを進める上で次のソフトが必要になるので下記サイトよりダウンロードし、インストールをしておいて下さい。

Git for Windows
VirtualBox

Git をインストールすると Git Bash というアプリケーションがついてきます。Git Bash はコマンドプロンプトのようなコンソールで、LINUX や UNIX の Bash と同様のコマンドが使えます。
まずはその Git Bash を起動し、次のコマンドで Homestead をインストールします。

vagrant box add laravel/homestead

途中 virtualbox かvmware_desktop のどちらを使うかを尋ねられた場合は virtualbox を選択します。
次に Git のリポジトリ Homestead をホームフォルダに作成します。

git clone https://github.com/laravel/homestead.git Homestead

Homestead というフォルダができているはずなので、「cd Homestead」でそのフォルダに移動し、初期設定をするための init.sh ファイルを実行します。

bash init.sh

するとホームフォルダ(C:\Users\ユーザー名\)に .homestead という隠しフォルダに Homestead.yaml というコンフィグファイルが作成されるので、内容を編集します。(下記は抜粋)

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Code
      to: /home/vagrant/Code

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public

「folders:」部分ではフォルダのマッピングを設定します。Homestead の仮想OS(ubuntu)のフォルダと Windows 上のフォルダのペアを指定して、2つの環境から同じフォルダを参照できるようにします。「map:」は Windows 側のフォルダ、「to:」は仮想OS側のフォルダです。上の例ではWindowsの「C:\Users\ユーザー名\Code」というフォルダと仮想OSの「/home/vagrant/Code」フォルダが同じフォルダであるかのように振る舞います。

「sites:」部分はローカルドメインとフォルダの割り当てです。ブラウザで「http://homestead.app」と入力すると「/home/vagrant/Code/Laravel/public」というフォルダの内容が表示されるようになります。

ひとまず上記の設定で保存を終えます。次に「authorize:」「keys:」にある認証鍵ファイルを用意します。先にホームフォルダ内に「.ssh」フォルダを作り、ssh-keygen コマンドでその中に id_rsa ファイルと id_rsa.pub ファイルを作成する流れです。

mkdir ~/ttt
cd ~/ttt
ssh-keygen -t rsa -C "メールアドレス"
Generating public/privata rsa key pair.
Enter file in which to save key (/c/Users/ユーザー名/.ssh/id_rsa):

保存先を聞かれますが現在のフォルダ内に作るので空欄のままエンターキーを押します。
パスフレーズは2度同じものを入力して下さい。(オプション)
これで .ssh フォルダ内に暗号鍵、秘密鍵の2つのファイルが生成されるはずです。

次は先ほど Homestead.yaml で指定したフォルダ「~/Code」を作っておきます。「~」はホームフォルダーを意味するので、「C:\Users\ユーザー名\Code\Laravel\public」となるようにフォルダーを作ります。さらに public フォルダ内に index.php ファイルを作り、次のような内容にしておきます。

<?php
phpinfo();

この段階でホームフォルダの主要なファイルは次のようになっているはずです。

.ssh\id_rsa
.ssh\id_rsa.pub
.homestead\Homestead.yaml
Homestead\
Code\Laravel\public\index.php

次に、ローカルドメイン「homestead.app」で「192.168.10.10」に接続できるようにするために「C:\Windows\System32\drivers\etc\hosts」ファイルを書き換えます。テキストエディターを管理者として実行してからファイルに次の行を追加して下さい。

192.168.10.10    homestead.app

これで下準備は整いました。いよいよ仮想 OS を起動します。ホームフォルダにある Homestead フォルダに移動し、「vagrant up」コマンドで起動して下さい。

cd ~/Homestead
vagrant up

起動が完了したらブラウザで「http://homestead.app」にアクセスしてみてください。成功していれば先ほどの index.php が実行され、phpinfo() の結果が表示されているはずです。
仮想OSを終了させるには「vagrant halt」で行います。現在の状態を知るには「vagrant status」というコマンドを使います。

次回に続く)