FuelPHPでアプリーションを作成する場合、Auth PackageのSimpleAuth等を使うかなと思います。
しかし、SimpleAuthそのままではとても使い勝手が悪いと思うこともあると思います。
例えば
そんな場合は、もともとのパッケージのclassを継承して、必要な部分だけ書き換えてあげるのがよいと思います。
※ErogameScapeを作っていて「継承」を使ったのは、CodeigniterでControllerクラスを継承してControllerを作成する程度のことだったのですが、ああ、継承ってこういう風に使えばいいんだ…便利なんだなあと思いました。
「例えば」で書いたことを実現するために、FuelPHP1.4のSimpleAuthの場合、packages/auth/classes/auth/login/simpleauth.phpのcreate_userメソッドを書き換える必要があります。
create_userメソッドは以下のような書かれています。
しかし、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パッケージを拡張してみる。を真似しました。
<?php
namespaceを自分が命名したパッケージ名にして、add_classesには自分が編集するphpファイルの行を書きます。
[オリジナル]
class Auth_Login_SimpleAuth extends \Auth_Login_Driver
\fuel\app\config\config.phpにmyauthパッケージを読みこむように設定を追加します。
以上で、準備完了です。
あとは、普通にControllerから
以下略
それでは 「例えば」で書いたことを実現していきます。
ここからは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が呼び出されます。
な感じて、 create_userを呼び出せば、myauthの方のcreate_userが呼び出されます。