2010-08-28 2 views
6

Tôi đã cố gắng xác thực dữ liệu Mô hình người dùng của mình và tôi đã gặp phải sự cố này.Làm thế nào để chỉ sử dụng một bộ xác thực nhất định để xác thực dữ liệu trong Bánh PHP?

Giả sử tôi có quy tắc xác nhận sau, lưu trữ trong biến $ validate:

var $validate=array(
     "username" => array(
      "usernameCheckForRegister" => array(
       "rule" => ..., 
       "message" => ... 
      ), 
      "usernameCheckForLogin" => array(
       "rule" => ..., 
       "message" => ... 
      ) 
     ), 
     //rules for other fields 
    ); 

Trong bộ điều khiển UsersController, tôi có hai hành động: đăng ký() và đăng nhập(). Vấn đề là, làm cách nào để xác thực trường tên người dùng trong hành động register() bằng cách sử dụng CHỈ quy tắc usernameCheckForRegister và làm cách nào để xác thực trường tên người dùng trong hành động login(), sử dụng quy tắc khác, usernameCheckForLogin? Có bất kỳ hành vi hoặc phương pháp nào trong CakePHP cho phép tôi chọn bộ quy tắc nào áp dụng cho trường biểu mẫu khi xác thực không?

Cảm ơn bạn trước sự giúp đỡ của bạn!

+0

Câu hỏi của tôi là lý do bạn muốn xác thực tên người dùng khi đăng nhập? Khi đăng nhập, câu hỏi duy nhất cần được trả lời là "tên người dùng có mật khẩu này có tồn tại trong cơ sở dữ liệu không?" Nó không quan trọng cho dù tên người dùng là hợp lệ hay không. Nếu không, đăng nhập sẽ không thành công do tên người dùng không tồn tại. – deceze

+0

Lý do tôi muốn xác thực tên người dùng khi đăng nhập là vì tôi cũng đang sử dụng xác thực phía máy khách, điều này sẽ cho người dùng biết liệu họ có để trống trường tên người dùng hay không. – linkyndy

+0

Rất tiếc, vẫn chưa nhận được. :) Thông báo "Thông tin đăng nhập không hợp lệ" chung là đủ, thậm chí có thể tốt hơn. Các thiết lập xác thực mô hình bánh là để đảm bảo rằng chỉ có dữ liệu được xác thực mới được lưu vào cơ sở dữ liệu. Khi đăng nhập, bạn không lưu bất cứ thứ gì vào cơ sở dữ liệu, vì vậy bạn không nên sử dụng các quy tắc xác thực. Nếu bạn chỉ muốn cảnh báo người dùng về đầu vào trống, hãy thực hiện ngay mà không cần sử dụng quy tắc xác thực mô hình. – deceze

Trả lời

8

Tôi nghĩ rằng tôi đã chạy qua giải pháp phù hợp với nhu cầu của mình.

http://bakery.cakephp.org/articles/view/multivalidatablebehavior-using-many-validation-rulesets-per-model

Thay vì xác định một số quy tắc đối với từng lĩnh vực, hành vi này ngụ ý việc xác định một số quy tắc "chung", theo đó bạn xác định tất cả các quy tắc lĩnh vực liên quan đến bạn.

Vì vậy, thay vì thực hiện:

var $validate=array(
    "username" => array(
     "usernameCheckForRegister" => array(
      "rule" => ..., 
      "message" => ... 
     ), 
     "usernameCheckForLogin" => array(
      "rule" => ..., 
      "message" => ... 
     ) 
    ), 
    //rules for other fields 
); 

bạn làm:

/** 
* Default validation ruleset 
*/ 
var $validate = array(
     'username' => /* rules */, 
     'password' => /* rules */, 
     'email' => /* rules */ 
    ); 

/** 
* Custom validation rulesets 
*/ 
var $validationSets = array(
    'register' => array(
     'username' => /* rules */, 
     'password' => /* rules */, 
     'email' => /* rules */, 
    ), 
    'login' => array(
     'username' => /* rules */, 
     'password' => /* rules */ 
    ) 
); 

Và sau đó trong bộ điều khiển của bạn, bạn chuyển đổi giữa các bộ xác nhận như thế này: $this->User->setValidation('register');

Mặc dù bạn phải viết thêm một chút mã, tôi nghĩ giải pháp này phù hợp nhất với nhu cầu của tôi

+0

nếu loại giải pháp đó cũng tồn tại đối với quy tắc ràng buộc cho mỗi hành động? –

0

Kiểm tra manual:

var $validate=array(
     "username" => array(
      "usernameCheckForRegister" => array(
       "rule" => ..., 
       "message" => ..., 
       "on" => "create" 
      ), 
      "usernameCheckForLogin" => array(
       "rule" => ..., 
       "message" => ..., 
       "on" => "update" 
      ) 
     ), 
     //rules for other fields 
    ); 

UPDATE: Oh ... Tôi chỉ nhận thấy rằng nó dường như không thể sử dụng quy tắc xác nhận về đăng nhập, trừ khi bạn cập nhật cho người dùng tại mỗi nỗ lực đăng nhập. Bạn có thể sửa đổi phương thức login() để xác minh tên người dùng thay thế.

+0

Cảm ơn câu trả lời của bạn. Tuy nhiên, tôi không nghĩ rằng đó sẽ là một giải pháp sạch sẽ. Tôi đã tìm kiếm một cái gì đó như $ this-> useValidationRule ("usernameCheckForRegister"); – linkyndy

0

Bit của một giải pháp clunky nhưng tôi đã chỉ được unsetting những cái tôi không sử dụng từ bên trong Controller. Có thể nhận được lộn xộn nhưng đối với một đăng nhập đơn giản/đăng ký nó hiện các trick.

unset($this->User->validate['username']['usernameCheckForRegister']); 
+0

Các giải pháp hoạt động, nhưng tôi muốn một cái gì đó linh hoạt hơn, vì tôi sẽ sử dụng nhiều bộ quy tắc xác nhận hợp lệ. – linkyndy