php架構yii入門遇到的問題
最近在學習php 一個流行的架構yii,聽說封裝得很好,但是在學習過程中也遇到了一些問題,先總結如下:
?
(1)The table "{{tbl_user}}" for active record class "User" cannot be found in the database.
詳細錯誤:
?錯誤原因:實體類User 的方法tableName 返回的是“'{{tbl_user}}'”
/** * @return string the associated database table name */public function tableName(){return '{{tbl_user}}';}
?但是在應用設定檔(D:\study\yii\yii\demos\shop_goods\protected\config\main.php)中,沒有指定tablePrefix 。
解決方案:
方法一:去掉兩邊的花括弧,改為:
/** * @return string the associated database table name */public function tableName(){return 'tbl_user';}
?
方法二:在應用設定檔(D:\study\yii\yii\demos\shop_goods\protected\config\main.php)中指定
tablePrefix
(2)使用CPasswordHelper::verifyPassword($password,$this->password); 有問題
return CPasswordHelper::verifyPassword($password,$this->password); 有問題,
返回false,但是實際上$password,$this->password 是相等。
(3)php中調用成員變數時使用->,而不是.
有java工作經驗的開發人員,在使用yii架構時非常容易使用. 來引用成員變數,這是java的文法,不是php的文法。
?
(4)對於註冊頁面,在對應的controller的action方法中,會使用$_POST['RegisterForm'] 來擷取表單輸入項的值,那麼$_POST中的屬性名稱(如RegisterForm)是由什麼決定的呢?
是由render方法的第二個參數決定的
?
(5)如何區分情境
比如使用者註冊時需要輸入email和repassword,而使用者登入時不需要輸入email和repassword。這就是不同的情境校正的要素不同。如何?呢?
在RegisterForm 的rules()方法中
public function rules(){return array(// username and password are requiredarray('username, password', 'required'),array('email,repassword', 'required','on'=>'register'),// rememberMe needs to be a booleanarray('rememberMe', 'boolean','on'=>'login'),// password needs to be authenticatedarray('password', 'authenticate','on'=>'login'),);}
?'on'=>'register' 表示在“register”情境中才需要校正。
那麼如何選擇情境呢?
在controller 中new RegisterForm 時指定
$model=new RegisterForm('register');
?
例如
array('username, password', 'required', 'on'=>'login, register'),
array('email', 'required', 'on'=>'register'),
如上所示, username 和password 特性在login 情境中是必填項。而username, password 和email 特性在register 場
景中是必填項。於是,如果我們在login 情境中執行塊賦值,就只有username 和password 會被塊賦值。因為只有它
們出現在login 的驗證規則中。另一方面,如果情境是register ,這三個特性就都可以被塊賦值。
// 在登入情境中
$model=new User('login');
if(isset($_POST['User']))
$model->attributes=$_POST['User'];
// 在註冊情境中
$model=new User('register');
if(isset($_POST['User']))
$model->attributes=$_POST['User'];
?
?(6)如何批量擷取表單的輸入值
$model->attributes=$_POST['RegisterForm'];
?在一個類的執行個體被建立後,我們通常需要用終端使用者提交的資料填充它的特性。這可以通過如下塊賦值( massive
assignment)方式輕鬆實現:
$model=new LoginForm;
if(isset($_POST['LoginForm']))
$model->attributes=$_POST['LoginForm'];
最後的運算式被稱作塊賦值(massive assignment) ,它將$_POST['LoginForm'] 中的每一項複製到相應的模型特性
中。這相當於如下賦值方法:
foreach($_POST['LoginForm'] as $name=>$value)
{
if($name 是一個安全的特性)
$model->$name=$value;
}
?
(7)表單中的* 是怎麼產生的
是$model 中的rules() 方法決定的.
?我們看到郵箱沒有*,那是因為在RegisterForm 的rules() 沒有約束email 是必須的.
public function rules(){return array(// username and password are requiredarray('username, password', 'required','on'=>'register,login'),array('repassword', 'required','on'=>'register'),// rememberMe needs to be a booleanarray('rememberMe', 'boolean','on'=>'login'),// password needs to be authenticatedarray('password', 'authenticate','on'=>'login'),// 在註冊情境中,密碼repassword 必須和password 一致。array('repassword', 'compare', 'compareAttribute'=>'password', 'on'=>'register'),);}
?
?
(8)include(authenticate.php): failed to open stream: No such file or directory
有問題的代碼:
?
原因:沒有authenticate()方法
把30注釋掉就好了.