Vagrant共有フォルダの罠

Vagrant(&VirtualBox)を使い開発する場合、

共有フォルダ(Synced Folders)を使いホストOS側(多くの場合Mac OS XかWindows)のファイルシステムを、ゲストOS(多くの場合Linux)からマウントする

という方法が便利なのでよく使われます。

この場合、以下のような罠があります。

ファイル名の大文字小文字の違い

ホストOS側のファイルシステムが大文字小文字を区別しない場合、ゲストOSがLinuxのような通常大文字小文字を区別するファイルシステムの場合でも、結果的に大文字小文字が区別されません。

つまり、ホストOSがMac OS XやWindowsの場合、ゲストOSでも大文字小文字が区別されないことになります。

結果として、Windowsで開発していて開発環境では動作したが、本番環境のLinux上ではファイル名の大文字小文字が違い、ファイルが見つからないというエラーになる、という典型的な問題が発生する可能性があります。

Apacheで静的ファイルの更新が検知されない

Apacheが静的ファイルをキャッシュし、その更新を検知できずにファイルが更新されないという問題も知られています。

共有フォルダはアクセスが遅い

よく知られていますが、Vagrantの共有フォルダは遅いです。

公式ドキュメントでは、NFSを使いましょうとなっています。

ただし、WindowsホストではNFSは使えません。

Windowsでの改善策としては、以下が知られています。

関連

Tags: vagrant

FuelPHPでバックエンドを開発するための「Fuel Start」をインストールしてみる

FuelPHPでバックエンドを開発するための「Fuel Start」というのがGitHubにありましたので、インストールしてみました。

機能としては、以下があげられています。

  • Account management with ACL.
  • Account level/role management.
  • Administrator page permission.
  • Multilingual ready.
  • Admin configuration page.
  • Easy template layout system.

それなりの機能がすでにあるので、これを元にバックエンドを素早く開発できるというものです。

ダウンロード

Gitでダウンロードしました。

$ git clone git@github.com:ve3/fuel-start.git

Gitが嫌な場合は、https://github.com/ve3/fuel-start/releasesからダウンロードしてください。

パーミッション設定をしておきます。

$ cd fuel-start
$ oil r install

fuel/app/tmpフォルダがないためエラーが出ましたが、とりあえず放置しておきます。

データベースの作成

ここでは、fuelstartというデータベースをphpMyAdminから作成しました。

fuelstart db.sqlのインポート

付属するfuelstart db.sqlfuelstartデータベースにphpMyAdminからインポートしました。

データベース接続設定

fuel/app/config/development/db.phpにデータベース接続設定を記載します。

画面

ブラウザでアクセスします。

フロントの英語ページ スクリーンショット


管理ページへ、初期ユーザadmin(パスワードはpass)でログインします。 スクリーンショット


管理ページ(ダッシュボード)。 スクリーンショット


[Website]→[Global configuration]メニューを選択。 スクリーンショット


[Users roles and permissions]→[Users]メニューを選択。 スクリーンショット


こんな感じで一通りの機能があるようです。

Blog

[Components]メニューにBlogがありますが、デフォルトではBlog用のテーブルがありません。

/blog/admin/setup/install

にアクセスするとテーブルが作成されるようになっています。

fuel/app/modules/blog/classes/controller/setup.php

にロジックはあります。

まとめ

Fuel Startには、一通りのバックエンドの機能が実装されています。

これをベースにするかどうは各々の判断ですが、使わないとしても間違いなく開発時の参考になるでしょう。

関連

Tags: fuelphp, database

PHPフレームワーク「Aura v2」がクリーン過ぎるので試してみる

スクリーンショット

日本でまだ誰も紹介していないようなので、今日は新しいPHPフレームワーク「Aura v2 -- Aura.Web_Project」を紹介します。

Lighter than Silex, and slimmer than Slim, the Aura.Web_Project package is a minimalist web-specific project framework that starts out small and grows only as you need it.
http://auraphp.com/blog/2013/12/12/aura-v2-web-project/

参考訳:Silexより軽く、Slimよりスリム、Aura.Web_Projectパッケージは、あなたが必要とする小さく始めて成長する、ミニマリストのWebに特化したプロジェクトのフレームワークです。

Aura Projectとは?

Aura Projectは、PHP 5.4以上向けの独立したライブラリパッケージを提供しています。「Libraries First, Framework Second」を主張しています。

日本では、BEAR.Sundayの@koriymさんがメンバーとして参加されています。

高品質のコンポーネントを提供するプロジェクトのフレームワークということで、Symfonyに似ています。しかし、Symfonyフレームワークが重量級のフルスタックであるのに対し、Auraは真逆で最小限のフレームワークというアプローチを採用しているようです。

Aura.Web_Projectパッケージとは?

Aura Projectの提供するパッケージを使った「minimal framework」です。

本当に最低限のものしかなく、

  • DIコンテナ
  • 設定システム
  • ルータとディスパッチャー
  • RequestおよびResponseクラス
  • ロギング

しかありません。

パッケージを自由に組み込んで、自分で作り込んでいくタイプ、いわゆるグルー・フレームワークです。

組み込んでいくパッケージはもちろんAura Projectのものでなくても構いません。

インストール

Composerよりインストールします。ここでは、プロジェクト名はAuraとします。

$ composer create-project --stability=dev aura/web-project Aura

PHPビルトインWebサーバを起動するには、以下のようにします。

$ cd Aura
$ php -S localhost:8000 -t web/

はい、簡単ですね。

デフォルトでは、tmp/{$mode}.logにログファイルが書き込まれますので、Webサーバを別に建てた場合など、必要ならパーミッションを変更してください。

$ chmod -R 777 tmp

Hello World(マイクロフレームワークスタイル)

それでは、Hello Worldを表示させてみましょう。

まず、マイクロフレームワーク風にルーティング設定ファイルにコントローラロジックを記述してみます。

ルーティングは、config/default/modify/web_router.phpに記載します。

config/default/modify/web_router.php:

<?php
/**
 * 
 * This file is part of Aura for PHP.
 * 
 * @package Aura.Web_Project
 * 
 * @license http://opensource.org/licenses/bsd-license.php BSD
 * 
 * @var Aura\Di\Container $di The DI container.
 * 
 */

// get the router service
$router = $di->get('web_router');

// example route for 'hello world' using request and response services
$request  = $di->get('web_request');
$response = $di->get('web_response');
$router->add('hello', '/Aura/hello/{name}')
    ->addValues([
        'controller' => function ($name) use ($request, $response) {
            $content = "Hello World! $name";
            $response->content->set(
                htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')
            );
        }
    ]);

// add routes below

ここで、以下がHellow World用のルーティング情報です。/Aura/hello/{name}にアクセスされた場合、定義したコントローラが実行されます。

$router->add('hello', '/Aura/hello/{name}')
    ->addValues([
        'controller' => function ($name) use ($request, $response) {
            $content = "Hello World! $name";
            $response->content->set(
                htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')
            );
        }
    ]);

ここではクロージャでレスポンスのコンテンツをセットしています。

localhost:8000/Aura/hello/auraにアクセスすると、「Hello World! aura」と表示されます。

Hello World(フルスタックスタイル)

次は、MVCフレームワーク風にコントローラクラスを作成してみます。

src/App/Controllersフォルダを作成し、そこにHelloController.phpを作成します。

src/App/Controllers/HelloController.php:

<?php
/**
 * {$PROJECT_PATH}/src/App/Controllers/HelloController.php
 */
namespace App\Controllers;

use Aura\Web\Request;
use Aura\Web\Response;

class HelloController
{
    public function __construct(Request $request, Response $response)
    {
        $this->request  = $request;
        $this->response = $response;
    }

    public function say($name)
    {
        $content = "Hello World! $name";
        $this->response->content->set(
            htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')
        );
    }
}

続いて、DIコンテナでHelloControllerを定義します。以下のファイルの最後に以下を追加します。

config/default/define.php:

$di->params['App\Controllers\HelloController'] = [
    'request'  => $di->lazyGet('web_request'),
    'response' => $di->lazyGet('web_response'),
];

ディスパッチャーにHelloControllerを設定します。以下のファイルの最後に以下を追加します。

config/default/modify/web_dispatcher.php:

$dispatcher->setObject('hello_c', $di->lazyNew('App\Controllers\HelloController'));

最後にルーティング情報を変更します。

config/default/modify/web_router.php:

$router->add('hello', '/Aura/hello/{name}')
    ->addValues([
        'controller' => 'hello_c',
        'action'     => 'say',
    ]);

localhost:8000/Aura/hello/auraにアクセスすると、「Hello World! aura」と表示されます。

まとめ

このようにAura.Web_Projectは非常にシンプル、クリーンでわかりやすい構造になっています。

フレームワークについての知識がないと理解できないコードはありません。コントローラもフレームワークに密結合していません。

Aura.Web_Projectに興味を持たれた方は、Paul M. Jones氏の書かれた「A Peek At Aura v2 -- Aura.Web_Project, The Micro/Macro Web Framework」を読まれるとよいでしょう。

また、あのBEAR.SundayもAuraの提供するパッケージをたくさん使っているということで、Auraの提供するパッケージの品質も期待できそうです。

参考

Tags: aura, php