classの中でPear::Authを使用できません - PHPプロ!Q&A掲示板

62

  • 100P

classの中でPear::Authを使用できません

質問日時 / 2006年7月3日 14:38    回答数 / 10件

Questioner:  yagisaba  このエントリーをはてなブックマークに追加 

キーワード / smarty    class    Auth   

いままでclassを使用しないでAuthを利用していました。
今回Smartyにて構築しようとしてSmarty派生クラス(mySmarty)にて
認証をすませてしまおうと考えています。
login.tplに独自ログイン画面を作ってあります。

mySmartyの中で
// Login制御
public function login(){
  $params=array(いろいろパラメータ指定);
  $objAuth=new Auth("DB",$params,"mainLogin",TRUE);
  $objAuth->start();
}
// login画面
function mainLogin(){
  $this->display("login.tpl");
}

上記のように指定したのですがlogin.tplの画面が表示されず、Authのデフォルトのログイン画面が表示されてしまいます。
試しにコンストラクタの中に$this->mainLogin();を書いてみたらきちんと独自ログイン画面が表示されます。

ご教授宜しくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01tetsunosuke>public function login(){ > $params=array(
┃┗A01-1yagisabatetsunosukeさん、有難う御座います。 mainLoginを
┣A02updoorはじめまして。 >いままでclassを使用しないでA
┃┗A02-1yagisabaupdoorさん、有難う御座います。 $objAuth=new Aut
┣A03tetsunosuke先ほど回答した内容についてですが 具体的には以下
┃┗A03-1yagisabatetsunosukeさん、度々有難う御座います。 独自ロ
┣A04updoorupdoorです。 > $objAuth=new Auth("DB&qu
┃┗A04-1yagisabaupdoolさん、度々有難う御座います。 call_user_fu
┣A05tetsunosukeupdoolさんの回答に補足なんですが Auth.phpを見る
┗A06updoortetsunosukeさん補足ありがとうございます. たしかに

回答一覧

並び替え:

A01
answerertetsunosuke [7月3日 15:40]

>public function login(){
>  $params=array(いろいろパラメータ指定);
>  $objAuth=new Auth("DB",$params,"mainLogin",TRUE);
>  $objAuth->start();
>}
>// login画面
>function mainLogin(){
>  $this->display("login.tpl");
>}
>
>上記のように指定したのですがlogin.tplの画面が表示されず、Authのデフォルトのログイン画面が表示されてしまいます。
>試しにコンストラクタの中に$this->mainLogin();を書いてみたらきちんと独自ログイン画面が表示されます。

mainLoginは、new Authしたところから見て$this->mainLoginになるからだと思います。(従って呼び出すことができず、デフォルトのdrawLoginになってしまう)

解決策として
mySmarty.phpファイル内で

class mySmarty
{
  ...
  function mainLogin()
  {
     ...
  }
}
ではなくて

class mySmarty{
}

function mainLogin()
{
  $mySmarty = new MySmarty();
  $mySmarty->display( 'login.tpl' );
  ...
  
}

のようにclassの外に出すことになるのではないでしょうか。

あとはPHP5の例ですが、drawLoginをオーバーライドする手で行くと良いと思います。
http://ns1.php.gr.jp/pipermail/php-users/2004-December/024433.html

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryagisaba [7月3日 17:07]

tetsunosukeさん、有難う御座います。

mainLoginをclassの外に出してやってみました。
そしたらブラウザからの応答がなく30秒くらい待っても変化がなかったので中止を押してとめました。

drawLoginをオーバーライドする方法を読んでみます。

この意見に回答する

ツリーへ TOPへ

A02
answererupdoor [7月3日 15:42]

はじめまして。

>いままでclassを使用しないでAuthを利用していました。
>今回Smartyにて構築しようとしてSmarty派生クラス(mySmarty)にて
>認証をすませてしまおうと考えています。
>login.tplに独自ログイン画面を作ってあります。
>
>mySmartyの中で
>// Login制御
>public function login(){
>  $params=array(いろいろパラメータ指定);
>  $objAuth=new Auth("DB",$params,"mainLogin",TRUE);
>  $objAuth->start();
>}
>// login画面
>function mainLogin(){
>  $this->display("login.tpl");
>}
>
>上記のように指定したのですがlogin.tplの画面が表示されず、Authのデフォルトのログイン画面が表示されてしまいます。
>試しにコンストラクタの中に$this->mainLogin();を書いてみたらきちんと独自ログイン画面が表示されます。
>
>ご教授宜しくお願いします。


上記の"mainLogin"ですが、この指定ではコールバック関数の指定となるため、mySmartyクラスの中に定義された下のmainLoginメソッドは呼べなかったように思います。
Authの中では"call_user_func_array"を呼んでいるだけなので、もしオブジェクトのメソッドを呼ぶ場合には、mainLoginの部分を
array(mySmarty, 'mainLogin')
で指定してあげるといいみたいです。

このときusernameと自分自身を該当関数(またはメソッド)に渡してあげてるみたいです。

ご参考になれば。

この意見に回答する

ツリーへ TOPへ

A02-1
replyeryagisaba [7月3日 17:12]

updoorさん、有難う御座います。

$objAuth=new Auth("DB",$params,"array(mySmarty, 'mainLogin')",TRUE);

指定の書き方がおかしいのかな?
上記の書き方でやってみました。状況は同じでした。

この意見に回答する

ツリーへ TOPへ

A03 満足
answerertetsunosuke [7月3日 17:36]

先ほど回答した内容についてですが

具体的には以下で検証してみました。
クラスの部分を実際には他のファイルにすることになると思いますが・・・。

<?php
require_once 'Auth.php';
require_once 'Smarty.class.php';

class MySmarty extends Smarty{
 //テキトウに拡張クラスをつくりました。
 function MySmarty(){
  $this->Smarty();
  $this->template_dir = SMARTY_DIR . "template/";
  $this->compile_dir = SMARTY_DIR . "template_c/";
 }
  
 function login(){
  $objAuth = new Auth("DB", $params, "mainLogin",TRUE);
  $objAuth->start();
 }
}

function mainLogin(){
 $smarty = new MySmarty();
 $smarty->display("login.tpl");
}

// ログイン画面描画
$smarty = new MySmarty();
$smarty->login();
?>

無応答ってのは謎ですね・・・^-^;

実際にはどういう拡張クラスを書いたのか提示していただけると何かわかるかもしれません。

この意見に回答する

ツリーへ TOPへ

A03-1
replyeryagisaba [7月4日 15:05]

tetsunosukeさん、度々有難う御座います。

独自ログイン画面の表示部分がnewされていない状態だからAuth側から表示出来ないという事で理解しました。

class自体を理解していない質問でお恥ずかしい・・・^^;

ログイン制御を別に記述し、呼び出して使うようにします。

ご丁寧な回答、有難う御座いました。

この意見に回答する

ツリーへ TOPへ

A04 満足
answererupdoor [7月3日 20:43]

updoorです。

> $objAuth=new Auth("DB",$params,"array(mySmarty, 'mainLogin')",TRUE);

ここの部分ですが、配列で指定ですので、""で囲んでしまうと、文字列として認識されます。
ので、これを外してみてください。

$objAuth = new Auth(
    "DB",
    $params,
    array(mySmarty, 'mainLogin'),
    TRUE
);

ちなみに、マニュアルのcall_user_func_arrayの項です。
http://jp2.php.net/manual/ja/function.call-user-func-array.php
この例では、文字列で指定されていますが、動作的には
http://jp2.php.net/manual/ja/function.call-user-func.php
こちらと同じはずです。

以上ご参考になれば。

この意見に回答する

ツリーへ TOPへ

A04-1
replyeryagisaba [7月4日 15:07]

updoolさん、度々有難う御座います。

call_user_func_arrayの部分、理解しました。

トンチンカンな事をしていたと思います。^^;

ログイン制御を別に記述し、呼び出して使うようにします。

ご丁寧な回答、有難う御座いました。

この意見に回答する

ツリーへ TOPへ

A05
answerertetsunosuke [7月4日 15:28]

updoolさんの回答に補足なんですが

Auth.phpを見る限りでは

function drawLogin($username = '')
 {
  if (is_callable($this->loginFunction)) {
   call_user_func($this->loginFunction, $username, $this->status, $this);
(略)

となっているんですよね。

それに問題になっているコンストラクタでは
function Auth($storageDriver, $options = '', $loginFunction = '', $showLogin = true)
{
(略)

 if ($loginFunction != '' && is_callable($loginFunction)) {
  $this->loginFunction = $loginFunction;
 }
(略)
}

先にis_callableでチェックをしています。

つまり、is_callableを通って、かつ呼び出すときにはcall_user_funcを使っている、というのが「実情」だと思います。
#ちなみに、Auth.phpの私の手元のバージョンは
#// $Id: Auth.php,v 1.67 2003/10/20 06:36:34 yavo Exp $

この意見に回答する

ツリーへ TOPへ

A06
answererupdoor [7月4日 15:49]

tetsunosukeさん補足ありがとうございます.
たしかに自分も見たときにそれには気づきましたが,端折ってしまいました.
人様に何らかの情報を提供するときは,そういうところも気を付けないといけませんね.

ともあれ無事解決されたようで,よかったです.

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
マジッククォートとmysql_real_escape_string
 このエントリーをはてなブックマークに追加 
A
magic_quotes_gpcでは、SQLインジェクション対処は十分できません。主な理由として、以下が上げられます。 ・magic_quotes_gpcは文字コードを考慮しないで処理するので、Shift_JISを使っている場合、SQLインジェ...

>>続きを読む

SQLインジェクション対策は時と場合で使う関数が変わります。その時にあったものを使いましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)