FuelPHP 1.7.2がリリースされました

FuelPHP 1.x系の最新の安定版であるFuelPHP 1.7.2が7/13にリリースされました。

セキュリティ修正を含むため、すべてのFuelPHPユーザは1.7.2へすみやかにアップグレードすることが推奨されます。アップグレードの前にChangeLogをよく確認しておきましょう。

なお、FuelPHPの開発は2.0に移っており、1.x系には大きな新機能は追加されません。

1.7.2のバグ修正は1.8/developブランチに送信してください。1.8/developブランチは、1.x系の保守のためのブランチです。

セキュリティ修正

いくつかな軽微なセキュリティ修正がされています。

  • Request_Curlの自動フォーマットの脆弱性。1.7.2では自動フォーマットがデフォルトでoffに変更されました。自動フォーマットを使う場合は、1.7.2以降でも信頼できるサイトしかアクセスしない、レスポンスをきちんと検証するなどの注意が必要です。
  • DB::select()メソッドでのSQLインジェクションの可能性。これにより、DB::select("LOWER \"field\")")という書き方は使えなくなりました。DB::select(DB::Expr("LOWER \"field\")"))と書き直す必要があります。
  • エラーメッセージでのXSSの可能性。
  • プロファイラでのXSSの可能性。
  • HTMLタグ属性の値の中のダブルクォートをエスケープ。

主な変更点

詳細は、ChangeLog v1.7.2を参照してください。多くのバグ修正や機能追加が含まれています。

  • Composerからインストールできるようになりました。FuelPHP 1.7.2のComposerによるインストール参照。
  • ViewModelがPresenterに名称変更されました。
  • Agentクラスのbrowscap.orgのURLが更新され、正常に機能するように。
  • Validationクラスのrequireにfalseを渡した場合、エラーではなくなりました。
  • PDOドライバがPDOのエラーコードではなく、データベースのエラーコードを返すように変更されました。

Emailパッケージ

  • Mailgun、Mandrillドライバの追加。
  • STARTTLSのサポート。

バグ情報

バグに関する情報は、以下を参照願います。

関連

Tags: fuelphp, release

FuelPHP 1.7.2のComposerによるインストール

FuelPHP 1.7.2がリリースされました。

この1.7.2から、今までGitサブモジュールとして管理されていたfuel/coreなどのリポジトリもすべてCompser経由でインストールできるようになっています。

ただし、Composerを少々特殊な使い方をしている部分がありますので注意が必要です。

むろん、今までどおりのoil createコマンドやZipファイルをダウンロードしてのインストールもサポートされています。

FuelPHP 1.7.2のインストール方法

安定版である1.7.2は次のようにインストールします。

$ composer create-project fuel/fuel:dev-1.7/master ProjectName

なお、--prefer-sourceを指定すると開発版がインストールされてしまうので注意してください。

最後に出る

Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]?

は、fuel/fuelの.gitフォルダを削除するかどうか?という質問です。

$ cd ProjectName
$ oil --version
Fuel: 1.7.2 running in "development" mode

1.7.2がインストールされました。

FuelPHP 1.8-devのインストール方法

開発版である1.8/developブランチは次のようにインストールします。

$ composer create-project fuel/fuel:dev-1.8/develop --prefer-source ProjectName

なお、--prefer-sourceを指定しないと安定版がZipファイル経由でインストールされてしまうので注意してください。

$ cd ProjectName
$ oil --version
Fuel: 1.8-dev running in "development" mode

1.8-devがインストールされました。

開発版を更新したい

FuelPHP 1.xのコンポーネント(fuel/coreなど)は、Composerのrepositoriesの指定にpackageを使っているため、composer updateしても最新の1.8/developブランチの状態には更新されません。

これらをアップデートしたい場合は、

  1. 各々のGitリポジトリに移動し、手動でリポジトリを更新する
  2. composer.jsonのversion指定で1.7.2となっている箇所をすべて例えば1.7.2.1のように更新し、composer updateする

のいずれかを実行することになります。

(2015-01-13 追記) FuelPHP 1.8/developでComposerのrepositoriesの指定にvcsが使えるようになりました。 詳細は「FuelPHP 1.8-devでのComposerによるサブリポジトリの管理」を参照してください。

Tags: fuelphp, composer

BEAR.SundayでDoctrine2のORMを使ってみた(改)

77webさんの「BEAR.SundayでDoctrine2のORMを使ってみた」を試しつつ、少しだけ改良してみます。

BEAR.Sundayのインストール

ベンダー名はMy、アプリケーション名はNoteとします。これらの指定は名前空間で使われます。

$ composer create-project bear/skeleton My.Note dev-develop
$ cd My.Note
$ composer install

なお、ここではdev-developを指定して開発ブランチ(developブランチ)をインストールしています。

Doctrineのインストール

$ composer require 'doctrine/orm:2.4.*'

データベース接続設定

BEAR.Sundayではデータベース接続設定はvar/conf/constants.phpで定義します。

具体的にはデフォルトで以下のようになっています。

var/conf/constants.php

$masterDb = $slaveDb = require __DIR__  .'/db/sqlite.php';
//list($masterDb, $slaveDb) = require __DIR__  .'/db/mysql.php';

return [
    'prod' => [
        // optional
        'master_db' => $masterDb,
        'slave_db' => $slaveDb,
    ],
    'dev' => [],
    'api' => [],
    'test' => []
];

$masterDb$slaveDbが定義されていますが、いずれもdb/sqlite.phpが代入されています。

prod環境(本番環境)でこれらのデータベースが指定されていますが、prod環境の設定が他の環境にも引き継がれるため、デフォルトではすべての環境でのデータベース接続設定は同じになっています。

db/sqlite.phpでは具体的には以下のように定義されています。

var/db/sqlite.php

$sqlite = [
    'driver' => 'pdo_sqlite',
    'path' =>  $appDir . '/var/db/posts.sq3'
];

つまり、var/db/posts.sq3が使用されるSQLiteのデータベースファイルということになります。

ここでは、デフォルトのままにします。

Providerの作成

DoctrineのEntityManagerを返すProviderを作成します。

とりあえず、マスターとスレーブの切り替えは考慮しません。

src/Module/Provider/DoctrineORMProvider.php

<?php

namespace My\Note\Module\Provider;

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
use Ray\Di\ProviderInterface;
use Ray\Di\Di\Inject;
use Ray\Di\Di\Named;

class DoctrineORMProvider implements ProviderInterface
{
    /**
     * @param array $masterDb
     *
     * @Inject
     * @Named("masterDb=master_db")
     */
    public function __construct(array $masterDb)
    {
        $this->masterDb = $masterDb;
    }

    public function get()
    {
        $paths = [__DIR__.'/../../Entity'];
        $isDevMode = false;

        $config = Setup::createAnnotationMetadataConfiguration(
            $paths, $isDevMode
        );
        $conn = $this->masterDb;

        return EntityManager::create($conn, $config);
    }
}

コンストラクタインジェクションでデータベース接続設定のmaster_dbをプロパティに代入しています。

Providerのインストール

DoctrineORMProviderを使うようにインストールします。

My\Note\Module\AppModuleクラスのconfigure()メソッドの最後に以下を追加します。

src/Module/AppModule.php

$this->bind('Doctrine\ORM\EntityManager')->toProvider('My\Note\Module\Provider\DoctrineORMProvider');

Entityの作成

Entityを作成します。

src/Entity/Note.php

<?php

namespace My\Note\Entity;

/**
 * @Entity
 * @Table(name="note")
 */
class Note
{
    /**
     * @var int
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     */
    private $id;

    /**
     * @var string
     * @Column(type="text")
     */
    private $body;

    public function getId() {
        return $this->id;
    }

    public function getBody() {
        return $this->body;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function setBody($body) {
        $this->body = $body;
    }
}

doctrineコマンドを使えるようにする

cli-config.phpをプロジェクトのルートディレクトリに作成します。

<?php

error_reporting(E_ALL);
ini_set('xdebug.max_nesting_level', 300);

require __DIR__ . '/bootstrap/autoload.php';

use My\Note\Module\AppModule;
use Ray\Di\Injector;
use Doctrine\ORM\Tools\Console\ConsoleRunner;

$module = new AppModule();
$injector = Injector::create([$module]);
$entityManager = $injector->getInstance('Doctrine\ORM\EntityManager');

return ConsoleRunner::createHelperSet($entityManager);

テーブルの作成

doctrineコマンドでテーブルを作成します。

$ php vendor/bin/doctrine orm:schema-tool:create

テストデータの登録

とりあえず、sqlite3コマンドでinsertしておきます。

$ sqlite3 var/db/posts.sq3

> insert into note(body) values('test body1');
> insert into note(body) values('test body2');
> .exit

Appリソースの作成

AppリソースNoteを作成します。

src/Resource/App/Note.php

<?php

namespace My\Note\Resource\App;

use BEAR\Resource\ResourceObject;
use Doctrine\ORM\EntityManager;
use Ray\Di\Di\Inject;

class Note extends ResourceObject
{
    /**
     * @var EntityManager
     */
    private $entityManager;

    /**
     * @param EntityManager $entityManager
     * @Inject
     */
    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function onGet($id)
    {
        $note = $this->entityManager->find('My\Note\Entity\Note', $id);
        $this['note'] = ['body' => $note->getBody()];

        return $this;
    }
}

コンストラクタインジェクションでEntityManagerをプロパティに代入しています。

Noteリソースの取得

CLIからNoteリソースを取得してみます。

$ php bootstrap/contexts/api.php get 'app://self/note?id=1'

200 OK
content-type: ["application\/hal+json; charset=UTF-8"]
cache-control: ["no-cache"]
date: ["Fri, 11 Jul 2014 03:48:55 GMT"]
[BODY]
note => array(
  body test body1,
),

[VIEW]
{
    "note": {
        "body": "test body1"
    },
    "_links": {
        "self": {
            "href": "http://localhost/app/note/?id=1"
        }
    }
}

うまく取得できました!

参考

Tags: php, bear, doctrine, orm, database