2013年01月

FuelPHPのForm::inputの第二引数は自動的にhtmlentitiesが適用されます

FuelPHP Ver1.5.1の話題です。

FuelPHPのForm::inputの第二引数は自動的にhtmlentitiesが適用されます。

ですので、 
<?php echo Form::input('name', Input::post('name')); ?>
とInput Classの値をそのまま渡しても大丈夫です。

ソースは以下のようになっています。
\core\form.php
public static function input($field, $value = null, array $attributes = array())
{
return static::$instance->input($field, $value, $attributes);
}

\core\form\instance.php
public function input($field, $value = null, array $attributes = array())
{
if (is_array($field))
{
$attributes = $field;
! array_key_exists('value', $attributes) and $attributes['value'] = '';
}
else
{
$attributes['name'] = (string) $field;
$attributes['value'] = (string) $value;
}

$attributes['type'] = empty($attributes['type']) ? 'text' : $attributes['type'];

if ( ! in_array($attributes['type'], static::$_valid_inputs))
{
throw new \InvalidArgumentException(sprintf('"%s" is not a valid input type.', $attributes['type']));
}

if ($this->get_config('prep_value', true) && empty($attributes['dont_prep']))
{
$attributes['value'] = $this->prep_value($attributes['value']);
}
unset($attributes['dont_prep']);

if (empty($attributes['id']) && $this->get_config('auto_id', false) == true)
{
$attributes['id'] = $this->get_config('auto_id_prefix', 'form_').$attributes['name'];
}

$tag = ! empty($attributes['tag']) ? $attributes['tag'] : 'input';
unset($attributes['tag']);

return html_tag($tag, $this->attr_to_string($attributes));
}

public function prep_value($value)
{
$value = \Security::htmlentities($value, ENT_QUOTES);

return $value;
}
 


ControllerからViewに渡す値はset_safe等で渡さない限り、自動的にhtmlentitiesが適用されます。

Controllerで
$data['name'] =  Input::post('name');
View::forge('user/contents', $data);

Viewで
 <?php echo Form::Input('name', $name); ?>

とすると、Viewにnameが渡されたときにhtmlentitiesが適用され、Form::Inputに渡されたときにまたhtmlentitiesが適用されてしまいます。
しかし、 FuelPHPのデフォルト設定は「double_encodeをしない」なので、一度HTMLエンティティに変換された文字が再度変換されることはないので、特殊なケースを除いて問題ないです。

特殊なケースとは「&amp;」等を入力した場合です。
こちらについては、前の記事を参照ください。

※「&amp:」等が入力されることがないのであればいい気もするんですが、例えば「&は&amp;に変換されます」という記事を書きたいとかいう場合は困る気がしました。


FuelPHPのconfig.phpのhtmlentities_double_encodeはtrueにした方がいいと思います

FuelPHPのVerが1.5.1の話題です。

結論から書くとconfig.phpの設定は
'htmlentities_double_encode' => true,
'uri_filter'       => array(),
がいいんじゃないかなと思います。
※こうしたときにFieldsetクラスがうまく動かないかもしれないです。
 ごめんなさい、試してません。


FuelPHPのhtmlentitiesの第四引数(double_encode)のデフォルトはfalseです。
ちなみにPHPのデフォルトはtrueです。

FuelPHPのソースは以下のようになっています。
\core\classes\security.php
public static function htmlentities($value, $flags = null, $encoding = null, $double_encode = null)
{
static $already_cleaned = array();

is_null($flags) and $flags = \Config::get('security.htmlentities_flags', ENT_QUOTES);
is_null($encoding) and $encoding = \Fuel::$encoding;
is_null($double_encode) and $double_encode = \Config::get('security.htmlentities_double_encode', false);

以下略 


double_encodeの意味は以下の通りです。

double_encode

double_encode をオフにすると、PHP は既存の html エンティティをエンコードしません。 デフォルトでは、既存のエンティティも含めてすべてを変換します。


何を言っているかというと、double_encodeがtrueの場合は、「&amp;」と入力があったら「&amp;amp;」となりますが、falseの場合は、「&amp;」と入力があったら「&amp;」のままとするということです。

FuelPHPの場合、
 <?php echo Form::input('name', Input::post('name')); ?>
のように書いてフォームを出力します。
$_POST['password']の値が「&amp;」だと、本当は「&amp;amp;」として出力しないといけないのに「&amp;」と出力してしまうので、フォームのinputには「&」と表示されてしまいます。

&amp;や&gt;を入力する機会はほぼない気もいたしますが、入力されるケースがある場合、なぜ&amp;と入力した結果が&になってしまうか気がつかないと思います。

FuelPHPのdouble_encodeはconfig.phpで変更可能です。
config.phpのhtmlentities_double_encodeはtrueにした方がいいと思います 。

この変更に伴って
//'uri_filter'       => array('htmlentities'),
'uri_filter'       => array(),
としないといけません。

FuelPHP でのセキュリティ対策(1) - A Day in Serenity @ kenjisのURI フィルタの記載の通りで、uri_filterにhtmlentitiesを適用されているので、&等を含むURLは自動的にhtmlentitiesが適用されて、コントローラーで受け取った時点で、HTML エンティティに変換されてしまいます。
これをViewに渡すと、htmlentities_double_encodeがtrueの場合、もう1回htmlentitiesが適用されてしまいます。

※FuelPHPの思想は、URLをコントローラーで受け取った時点で、&等がHTML エンティティに変換されているべきだ、ということだと思うのですが、kenjisさんがFuelPHP Forumsで質問しているとおり、私もデフォルトの uri_filter の必要性がわかりません…


 

FuelPHPのEmailパッケージを使ってエンコードがISO-2022-JPのメールを送る場合、subjectはmb_encode_mimeheaderしなくてよいです

最新のFuelPHP(自分がソースを見たのは1.5.1です。)のEmailパッケージを使ってエンコードがISO-2022-JPのメールを送る場合、subjectはmb_encode_mimeheaderしなくてよいです。

前提はemail.phpの設定を以下のようにしている場合です。

return array(
'defaults' => array(

中略

'charset' => 'ISO-2022-JP',
'encodeing' => '7bit',

中略

);
);

本やWebのドキュメントを見ながら「ISO-2022-JPでメールを送りたい」設定すると、上記のように設定するかなと思います。

その後、古いドキュメントを見てしまうと、メールを実際に送信する部分のソースは以下のように書かれていると思います。
早川聖司 (2012) FuelPHP入門 株式会社ソーテック社も該当します。

$email = Email::forge();
$email->from( 'foo@example.com', 'foo' );
$email->to( 'bar@example.com' );
$email->subject( mb_encode_mimeheader( '題名', 'ISO-2022-JP' ) );
$email->body( mb_convert_encoding( '内容', 'ISO-2022-JP' ) );
$email->send();

FuelPHP1.5のEmailパッケージのソース(\package\email\driver.php)にsubject関数は以下のように書いてあります。

public function subject($subject)
{
if ($this->config['encode_headers'])
{
$subject = $this->encode_mimeheader((string) $subject);
}
$this->subject = (string) $subject;

return $this;
}

エンコードはsubject関数がやってくれますので、以下のように書くのが正解です。
$email = Email::forge();
$email->from( 'foo@example.com', 'foo' );
$email->to( 'bar@example.com' );
$email->subject(  '題名' );
$email->body( mb_convert_encoding( '内容', 'ISO-2022-JP' ) );
$email->send();

FuelPHPでメール送信(smtp) : てるてる坊主によると、FuelPHP1.2からmb_encode_mimeheaderが不要になったようです。
 

FuelPHP1.5のpaginationにQuery Stringによるページネーションが追加されています

Pagination: Now support pagination using a Query String variable.
ということで、FuelPHP1.5にpaginationにQuery Stringによるページネーションが追加されています。

※1/23時点でFuelPHPの最新のVerは1.5.1です。FuelPHP » Blogsによるとit is strongly suggested you upgrade to 1.5.1とのことです…せっかくあげたばっかりなのに…coreのディレクトリだけ差し替えればいいのかな…

FuelPHP のクエリ文字列でのページネーション - A Day in Serenity @ kenjis
公式マニュアルに書かれている通りなのですが、この機能が追加されたのは

検索窓が設置されていて、検索結果を10件ごとに表示したい!という場合、URLは
http://hogehoge/hoge?serch=ほげほげ
な感じになると思うのですが、FuelPHPのページネーションのURLにGETパラメータが付加できない

な問題を解決するためだと思っています。

具体的な設定は以下のようになるかと思います。
    $pagination = Pagination::forge('mypagination', array(
        'total_items' => 100,
        'per_page' => 10,
        'uri_segment' => 'page',
    ));   

FuelPHP1.5では、pagination_urlを指定しないと、現在のurlを使います。
pagination_urlは指定しない使い方が自然になるのかなあと思います。

uri_segmentに数字ではなくて、任意の文字を設定すると、「任意文字=ページ数」なパラメータがurlにくっつきます。

例えば上記設定の場合、任意文字がpageなので、
http://hogehoge/hoge?serch=ほげほげ
の2ページ目は
http://hogehoge/hoge?serch=ほげほげ&page=2
になります。

※ちなみに
 http://hogehoge/hoge?serch=ほげほげ
 の2ページ目が
 http://hogehoge/hoge/2?serch=ほげほげ
な感じになるようにはできないと思います。

FuelPHPのPaginationClassはConfigurationの配列の順序を間違えるとうまく動かない

この話題はFuelPHP1.4に適応されます。

FuelPHPのPaginationClassは以下のように設定します。
$pagination = Pagination::forge('mypagination', array( 'pagination_url' => 'http://docs.fuelphp.com/', 'total_items' => 35, 'per_page' => 5, 'uri_segment' => 2, ));
※これは公式サイトのPagenation ClassのHow toに書いてある通りの設定です。

これを以下のように書くとちゃんと動きません。 
$pagination = Pagination::forge('mypagination', array( 'pagination_url' => 'http://docs.fuelphp.com/', 'uri_segment' => 2, 'total_items' => 35, 'per_page' => 5, ));
※これは公式サイトのPagenation Classforgeに書いてある通りの設定です。

違いは配列の順番です。
前者はuri_segmenttotal_itemsper_pageの上にあります。

後者の設定で $pagination->render()すると、5ページ目からおかしくなります。
$paginationをvar_dumpすると、5ページ目ですから、current_pageがint 5でなくてはいけないのに、float 4になってしまいます。

原因はpagination classにおいて、uri_segmentotal_itemsper_pageを内部変数にすべてセットしてからtotal_pagesを計算しなければいけないのに、_set関数で1つ値をセットするたびに_recalculate関数でtotal_pagesを計算してしまっていて、per_pageはpagination class内部においてデフォルトで10という値が設定されているのですが、total_pagesを10で計算してしまった結果、おかしくなっています。

ええと…修正方法ですがpagination classは後から値をセットするようにできていないので

\core\classes\pagination.php
public function __set($name, $value = null)
{
//中略 

// update the page counters
//$this->_recalculate(); ←ここをコメントアウト
}

public function __construct($config = array())
{
// update the instance default config with the data passed
foreach ($config as $key => $value)
{
$this->__set($key, $value);
}    
 
  $this->_recalculate(); ←これを追加
    


でいいかなと思います。
または、total_itemsを配列の一番先に書くのでもいいと思います。

もしかしたら1.5以降で直っているかもしれませんが、はまる方がいらっしゃるかもしれませんので、記録しておきます。

Twitter Bootstrapを学ぶにはドットインストールがお勧めです

FuelPHPはデフォルトのCSSとしてBootstrapを採用しています。
Bootstrapは公式HPを見れば、使い方が載っていたり、
なサイトがあったり、googleで検索すれば、たくさんのサイトがひっかかるので問題ないと思いますが、体系的に効率的に学ぶにはドットインストールがお勧めです。

 ドットインストールBootstrap以外にもHTMLやらCSSやら各種DBまで、1回あたり3分の動画で学習していきます。

3分というのがとてもよくて、プログラミングは「学ぶかー」と思うと案外時間的なハードルが高くて、本を開いて、読んで、試して、なんてことをしていると、結構まとまった時間がないと駄目だと思うのですが、  ドットインストールは1回3分で終わるので気軽に視聴できます。

3分で終わるのですが、案外学習が楽しくて、次の動画も見ておくかーとなって、結局長い時間視聴していたりしますが…


プログラミングって、やりたいことが先にあって、やりたいことを実践するにはどうするか?という順番でないと、学習してもすぐに忘れるので 、もし周りに「こんなことがやりたいんだけどなあ」という方がいたら、ドットインストールをお勧めしようと思います。


以下余談です。
プログラミングをまったく知らない方は、プログラムで何ができるのかがわからないので、そもそも「プログラムでやりたいこと」が分からないから、プログラムを学習するにいたることがない気がします。
でも、プログラムを学習しないと、プログラムで何ができるかの勘所が掴めないので、「あ、それ、自動化できるよ」と教えてあげると「えっ?そんなこともできるんですか?」と言われます。
「そんなこともできる」のか「できないのか」が判断できるようになるくらいに、なんでもいいので…、仕事でExcelを使っている場合はVBAを学んでみたり、Teratermを使っている場合はTeraterm Macroを学んでみたりするのがいいかなと思います。
思うのですが…今までプログラムに触れていなかった方に、「プログラムってこんなことが出来るんだよ」ということをなるべく効率的に学んでもらうにはどうしたらいいのかなあ…と思います。

FuelPHPのvalidationで独自のルールを作る

FuelPHPのvalidationは
  • 標準で用意されている検証ルールだけだと物足りない
  • 検証の結果エラーとなった場合のメッセージがいまいち。lang/ja/validation.phpで日本語にしてもいまいち。
  • 独自の検証ルールを作成するには的な感じで、今(2013/1/5)googleで検索すると、検証ルールを書いたクラスを 作成する方法がヒットするけど、クラスを作るほどじゃないし、使い回しもしない検証ルールなんだけど…と思う
ということから、validationを使うことにめげてしまいそうになります。

validationのルールには無名関数を使うことができます。
※ドキュメントに書いていないじゃないか!と思ったら、any valid PHP callback and Closures in addition to the provided validation methodsと書いてありました…例しか見てませんでした…でも、多分、下にリンクをはりましたスライド、ドキュメントを見なかったら使い方がわからなかったと思います。

無名関数を使うことによって、上に書いた3つの問題を解決できます。

具体的な方法は
です。
前者の方がお勧めです。

  public function validationPost()
  {
    $val = Validation::forge();
    $val->add('name', '名前')
        ->add_rule('trim')
        ->add_rule('required')
        ->add_rule('min_length',1)
        ->add_rule('max_length',100)
        ->add_rule(function ($val) {
            if (preg_match('/^( )+$/', $val))
            {
              \Validation::active()->set_message('closure', ':labelが入力されていません。labelを入力してください。');
              return false;
            }
            return true;          
         });
    if ($val->run())
    {
      return TRUE;
    }
    else
    {
      return $val->show_errors();
    } 
  } 

な感じに書くと、 trim関数は全角のスペースは取り除いてくれないので「   」な入力が許可されてしまうのですが、上のような感じに書くと、全角スペースだけの入力をチェックしてくれます。
また、FuelPHPに標準で用意されている検証パターンの「match_pattern」ですと、エラーメッセージが「The field :label must match the pattern :param:1」で、すごくいまいちなのですが、無名関数を使うと、そのフォームにあったエラーメッセージを表示できてうれしいです。
※上の例は汎用性がありそうなので、無名関数じゃなくてMyValidation的なクラスに書いてもいいかなと思いました…

FuelPHPで入力された文字がUTF-8かどうかをチェックする

Webアプリケーションに入力された文字エンコーディングはちゃんとチェックしてから次の処理に入るべきです。
ということは感覚的に分かるのですが、じゃあ実際どうしてなのかというと、私自身うまく説明できないです…

PHP以外では: 既にあたり前になりつつある文字エンコーディングバリデーション - 徳丸浩の日記(2009-09-14)
には以下のように書いてあります。

  1. 入力データがUTF-8(あるいは他の文字エンコーディング)であるというアプリケーション要件に対するチェック
  2. 内部データがUTF-8(あるいはUTF-16など)として妥当でないと、処理系が誤動作を起こすため
2.の理由はとても納得がいきます。
というのは、ErogameScapeでもUTF-8にない文字が入力されることがあって、その文字のおかげでアプリケーションが例外を出して止まるということがあるからです。(エロゲーのキャラクターの名前にUTF-8にいない文字が使われることがあって、そのキャラクター名で感想を書いて頂くと、アプリケーションが止まる…ということがよくありました。)

1.は…
1.に関連して、id:kazuhooku氏がはてなブックマークにて「UTF-8 を入れるべきフィールドに壊れた UTF-8 が渡されてきたら、そもそも受け付けるべきじゃない。8桁の郵便番号が入力されたら弾くのと同じ話」とコメントされていて、この意見に私も同意です。
と書いてあります。確かに…そうかも…

ErogameScapeはPHPもPostgreSQLもUTF-8を使っていますので、UTF-8以外の何かが入力されると、どんな動作をするか分からないので、入力フィルタはすべきです。

※株式会社ECナビはさんのセキュリティポリシーにおいても、入力された文字のエンコーディングはちゃんとチェックすることとなっているみたいです。5.6. PHP利用時の手順 — Infomation Security Policy alpha documentation

さて、実際にFuelPHPでチェックするには
FuelPHP でのセキュリティ対策(2) - A Day in Serenity @ kenjis
の入力フィルタの項目に記載されている方法でばっちりです。


FuelPHPのmodel_CRUDで接続するDBを切り替える方法

FuelPHPで1サイトを作ってみて気が付いた点などの「別DBのテーブルをModel_Crudで参照す」に書いてあります。
※自身で解決してから改めてぐぐったらすでに記事がありまして悲しかったです…

db.phpに

return array(
'default' => array(
'connection'  => array(
),
),
'root' => array(
'connection'  => array(
),
),
);
 
のように書いてあった場合、デフォルトでは「default」に書いてある設定でDBに接続しにいきます。
Model_Crudを継承したクラスの$_connectionに値を設定することで、その値の設定でDBに接続しにいきます。
例えば以下のような感じです。

class MyModel extends Model_Crud
{
  
  protected static $_table_name  = 'mymodel';
  protected static $_primary_key = 'id';
  protected static $_connection  = 'root';
  protected static $_created_at  = 'created_at';
  protected static $_updated_at  = 'updated_at';


Model_Crudに限らずクラスにどんなプロパティがあるかはソースを見た方がいいかもしれません。
ドキュメントに必ずしてもすべてのプロパティが書いてあるとは限らないからです。
※多分、$_connectionはドキュメントに書いていない…と思います。

FuelPHP1.4のModel_Crudのプロパティは以下のようになっています。

class Model_Crud extends \Model implements \Iterator, \ArrayAccess, \Serializable
{

/**
* @var  string  $_table_name  The table name (must set this in your Model)
*/
// protected static $_table_name = '';

/**
* @var  string  $_primary_key  The primary key for the table
*/
// protected static $_primary_key = 'id';

/**
* @var string   $_connection   The database connection to use
*/
// protected static $_connection = null;

/**
* @var  array  $_rules  The validation rules (must set this in your Model to use)
*/
// protected static $_rules = array();

/**
* @var  array  $_properties  The table column names (must set this in your Model to use)
*/
// protected static $_properties = array();

/**
* @var array  $_labels  Field labels (must set this in your Model to use)
*/
// protected static $_labels = array();

/**
* @var array  $_defaults  Field defaults (must set this in your Model to use)
*/
// protected static $_defaults = array();

/**
* @var  bool  set true to use MySQL timestamp instead of UNIX timestamp
*/
//protected static $_mysql_timestamp = false;

/**
* @var  string  fieldname of created_at field, uncomment to use.
*/
//protected static $_created_at = 'created_at';

/**
* @var  string  fieldname of updated_at field, uncomment to use.
*/
//protected static $_updated_at = 'updated_at';


}
 
作成したテーブルに折角
  created_at
  updated_at
列を作ったのに、値が入らなくて、なぜかと思っていたら、
 protected static $_created_at  = 'created_at';
 protected static $_updated_at  = 'updated_at';
 と書かないと駄目のようでした。
ということも、ソースを見て知りました。

※FuelPHPを使う場合、Model_Crudを使うよりは多分Ormを使うんじゃないかなあと思います。
 OrmでDBを切り替える方法は、 Mome — FuelPHPのormを複数DBに対応させる方法で完璧だと思います。

 

FuelPHPでパッケージを拡張する方法について

FuelPHPでアプリーションを作成する場合、Auth PackageのSimpleAuth等を使うかなと思います。
しかし、SimpleAuthそのままではとても使い勝手が悪いと思うこともあると思います。

例えば
  • メールアドレスが必須だけど、メールアドレスは必須にしたくない
  • ユーザー登録をするときにユーザー名が重複している場合の例外のメッセージが英語だけど日本語で例外を投げて欲しい
とかです。

そんな場合は、もともとのパッケージのclassを継承して、必要な部分だけ書き換えてあげるのがよいと思います。
 
※ErogameScapeを作っていて「継承」を使ったのは、CodeigniterでControllerクラスを継承してControllerを作成する程度のことだったのですが、ああ、継承ってこういう風に使えばいいんだ…便利なんだなあと思いました。

 「例えば」で書いたことを実現するために、FuelPHP1.4のSimpleAuthの場合、packages/auth/classes/auth/login/simpleauth.phpのcreate_userメソッドを書き換える必要があります。
create_userメソッドは以下のような書かれています。

public function create_user($username, $password, $email, $group = 1, Array $profile_fields = array())
{
$password = trim($password);
$email = filter_var(trim($email), FILTER_VALIDATE_EMAIL); ← Validationクラスで検証するので消すことにします。ちなみに、私はこれを読むまでfilter_var関数を知りませんでした…。勉強になります。

if (empty($username) or empty($password) or empty($email)) ← Validationクラスで検証するのでこのif文は消すことにします。
{
throw new \SimpleUserUpdateException('Username, password or email address is not given, or email address is invalid', 1);
}

$same_users = \DB::select_array(\Config::get('simpleauth.table_columns', array('*')))
->where('username', '=', $username)
->or_where('email', '=', $email) ← emailは必須とししないので、この条件を消すことにします。
->from(\Config::get('simpleauth.table_name'))
->execute(\Config::get('simpleauth.db_connection'));

if ($same_users->count() > 0)
{
if (in_array(strtolower($email), array_map('strtolower', $same_users->current()))) ← emailは必須とししないので、この条件を消すことにします。
{
throw new \SimpleUserUpdateException('Email address already exists', 2);
}
else
{
throw new \SimpleUserUpdateException('Username already exists', 3); ← 例外のメッセージを日本語にします。
}
}
以下略

それでは 「例えば」で書いたことを実現していきます。
ここからはFuelPHPのORMパッケージを拡張してみる。を真似しました。

fuel\packages下に以下のようにディレクトリを作成します。
\myauth\classes\auth\login

\myauth\に\auth\bootstrap.phpをコピーします。
\myauth\classes\auth\loginに\auth\classes\auth\login\simpleauthをコピーします。

\myauth\bootstrap.phpを以下のように編集します。
 
[オリジナル]

<?php

Autoloader::add_core_namespace('Auth');

Autoloader::add_classes(array(
'Auth\\Auth'           => __DIR__.'/classes/auth.php',
'Auth\\AuthException'  => __DIR__.'/classes/auth.php',

'Auth\\Auth_Driver'  => __DIR__.'/classes/auth/driver.php',

'Auth\\Auth_Acl_Driver'     => __DIR__.'/classes/auth/acl/driver.php',
'Auth\\Auth_Acl_SimpleAcl'  => __DIR__.'/classes/auth/acl/simpleacl.php',

'Auth\\Auth_Group_Driver'       => __DIR__.'/classes/auth/group/driver.php',
'Auth\\Auth_Group_SimpleGroup'  => __DIR__.'/classes/auth/group/simplegroup.php',

'Auth\\Auth_Login_Driver'          => __DIR__.'/classes/auth/login/driver.php',
'Auth\\Auth_Login_SimpleAuth'      => __DIR__.'/classes/auth/login/simpleauth.php',
'Auth\\SimpleUserUpdateException'  => __DIR__.'/classes/auth/login/simpleauth.php',
'Auth\\SimpleUserWrongPassword'    => __DIR__.'/classes/auth/login/simpleauth.php',
));

[編集後]
<?php

Autoloader::add_core_namespace('MyAuth');

Autoloader::add_classes(array(
'MyAuth\\Auth_Login_SimpleAuth'      => __DIR__.'/classes/auth/login/simpleauth.php',
));

namespaceを自分が命名したパッケージ名にして、add_classesには自分が編集するphpファイルの行を書きます。


\myauth\classes\auth\loginに\auth\classes\auth\login\simpleauthは以下のように編集しました。

[オリジナル]
<?php

namespace Auth;

中略

class Auth_Login_SimpleAuth extends \Auth_Login_Driver
{
中略 
 
public function create_user($username, $password, $email, $group = 1, Array $profile_fields = array())
{
$password = trim($password);
$email = filter_var(trim($email), FILTER_VALIDATE_EMAIL);

if (empty($username) or empty($password) or empty($email))
{
throw new \SimpleUserUpdateException('Username, password or email address is not given, or email address is invalid', 1);
}

$same_users = \DB::select_array(\Config::get('simpleauth.table_columns', array('*')))
->where('username', '=', $username)
->or_where('email', '=', $email)
->from(\Config::get('simpleauth.table_name'))
->execute(\Config::get('simpleauth.db_connection'));

if ($same_users->count() > 0)
{
if (in_array(strtolower($email), array_map('strtolower', $same_users->current())))
{
throw new \SimpleUserUpdateException('Email address already exists', 2);
}
else
{
throw new \SimpleUserUpdateException('Username already exists', 3);
}
}
以下略 

[編集後]
<?php

namespace MyAuth;

class Auth_Login_SimpleAuth extends \Auth\Auth_Login_SimpleAuth
{

public function create_user($username, $password, $email, $group = 1, Array $profile_fields = array())
{
$password = trim($password);

$same_users = \DB::select_array(\Config::get('simpleauth.table_columns', array('*')))
->where('username', '=', $username)
->from(\Config::get('simpleauth.table_name'))
->execute(\Config::get('simpleauth.db_connection'));

if ($same_users->count() > 0)
{
  throw new \SimpleUserUpdateException('入力頂いたユーザー名はすでにどなたがご使用です。', 3);    
}
 


\fuel\app\config\config.phpにmyauthパッケージを読みこむように設定を追加します。

/**************************************************************************/
/* Always Load                                                            */
/**************************************************************************/
'always_load'  => array(

/**
* These packages are loaded on Fuel's startup.
* You can specify them in the following manner:
*
* array('auth'); // This will assume the packages are in PKGPATH
*
* // Use this format to specify the path to the package explicitly
* array(
*     array('auth' => PKGPATH.'auth/')
* );
*/
'packages'  => array(
//'orm',
'auth',
 'myauth'
),


以上で、準備完了です。
あとは、普通にControllerから
$auth = Auth::instance();
$auth->create_user($data['input']['username'],$data['input']['password'],$data['input']['email']);
な感じて、 create_userを呼び出せば、myauthの方のcreate_userが呼び出されます。

 
 
記事検索