2009-08-18 14 views
5

Tôi phải xử lý khoảng 20 thông số POST và tôi không chắc chắn nên thực hiện điều đó ở đâu.Tôi có nên truy cập POST-Parameters trong mô hình hoặc chuyển làm đối số phương thức từ bộ điều khiển không?

Tôi có thể xác định từng đối số của phương thức trên mô hình và chuyển chúng từ bộ điều khiển khi phương thức được gọi. Điều này sẽ dẫn đến khá nhiều công việc và làm cho hàm gọi ít dễ đọc hơn, do số lượng đối số.

Hoặc tôi có thể gọi phương thức trên mô hình và chỉ truy cập trực tiếp vào tham số.

Truyền tham số làm đối số sẽ cho phép tôi kiểm soát nhiều hơn đối với các tham số mà hàm truy cập và tài liệu sẽ tự giải thích hơn. Nhưng nếu các tham số mới được thêm vào sau này, chúng sẽ phải được thêm vào cuối cuộc gọi phương thức, vì không phá vỡ mọi cuộc gọi hiện tại. Tôi tưởng tượng rằng điều này sẽ trở nên khá khó hiểu nếu nó xảy ra một vài lần, vì các đối số không thể được nhóm hợp lý.

Nếu tôi truy cập tham số trong mô hình, không có tham số nào phải được chuyển từ bộ điều khiển đến mô hình, làm cho phương thức gọi là terser. Nhưng tôi không có quyền kiểm soát các tham số được truy cập, vì chúng có thể dễ dàng và không có giới hạn được thêm vào hoặc loại bỏ. Điều này đòi hỏi kỷ luật cao hơn từ các nhà phát triển khác, và tôi không thích phụ thuộc vào điều đó, bởi vì sớm hay muộn ai đó bị ràng buộc vào "chỉ (thêm | thay đổi | sửa chữa) điều này thật nhanh".

Tôi không biết nên đi đường nào. Tôi có xu hướng chỉ làm tất cả trong mô hình, vì điều này là nhanh hơn để viết, có vẻ dễ dàng hơn để duy trì (không có hỗn loạn đối số) và khái niệm phù hợp tốt hơn vào quan điểm của tôi về một mô hình. Mặt khác, tôi không chắc chắn quan điểm của mình về mô hình là chính xác và nếu nó sẽ kết thúc trong hỗn loạn nếu tôi phụ thuộc vào các nhà phát triển khác để luôn cập nhật tài liệu sau mỗi thay đổi.

Vì vậy, tôi nên làm gì?

+0

Tôi đã chọn không chấp nhận bất kỳ câu trả lời nào cho câu hỏi của mình, vì không có câu trả lời rõ ràng. Nói chung, tôi sẽ theo cách tiếp cận của Ignas 'và Lucas', vì dữ liệu bị hạn chế tốt hơn. Đối với trường hợp này trong ứng dụng của chúng tôi, câu trả lời karims phù hợp hơn. – Thomas

Trả lời

1

Vâng, tại sao bạn không thể chấp nhận mảng (kết hợp) làm tham số trong phương thức đó của mô hình, và sau đó vượt qua toàn bộ mảng $ _POST? Ít nhất theo ý kiến ​​của tôi, nó sẽ không phá vỡ đóng gói.

EDIT: Và nếu bạn không thích sử dụng các mảng kết hợp cho điều đó, bạn cũng có thể sử dụng cái gọi là "Plain Old Objects" (đối tượng mà chỉ được sử dụng để thực hiện dữ liệu, như struct trong C). Ví dụ: nếu điều này có liên quan đến việc lưu biểu mẫu đăng ký đã gửi:

class UserData 
{ 
    protected $name; 
    protected $username; 
    protected $password; 

    public function getName() { /* <...> */ } 
    public function setName() { /* <...> */ } 
    /* other accessors go here */ 
} 

class UserController extends Controller 
{ 
    public function register() 
    { 
     $userData = UserData::create() 
      ->setName($_POST['name']) 
      ->setUsername($_POST['username']) 
      ->setPassword($_POST['password']); 
     Users::add($userData); 
    } 
} 

Điều này sẽ cho phép bạn sử dụng nghiêm ngặt việc nhập người dùng :: thêm và cũng làm cho quá trình làm tài liệu dễ dàng hơn.

+0

Tôi đã thêm một giải pháp khác cho câu trả lời của tôi như một câu trả lời cho nhận xét này của tác giả: "Câu hỏi này thực sự giống nhau, nhưng tôi không thích chuyển mảng kết hợp <...>" –

+0

Như tôi đã trả lời cho daff, tôi chắc chắn sẽ ưu tiên chuyển đối tượng vào mảng kết hợp , Tôi sẽ ghi nhớ ví dụ của bạn. – Thomas

0

Tôi đã trả lời a similar question một thời gian trước đây. Imho bạn nên vượt qua chúng, ví dụ: như đã được đề xuất như một mảng kết hợp (và thực hiện tất cả các kiểm tra bảo mật trước đây). Bằng cách đó bạn có thể dễ dàng sử dụng lại các dấu vết của mình.

+2

Câu hỏi này thực sự giống nhau, nhưng tôi không thích đi qua các mảng kết hợp. Đối với tài liệu và mục đích hạn chế họ về cơ bản là vô dụng, bởi vì tôi không thể (hoặc chỉ với nỗ lực to lớn) tài liệu hoặc hạn chế nội dung của họ. Chúng trở thành một cái bình cho bất cứ thứ gì tôi muốn ném vào đó. Trong trường hợp này, việc xác minh được thực hiện trong bộ điều khiển và nếu không thành công, phương pháp trên mô hình sẽ không bao giờ được gọi. Vì vậy, đi qua một mảng kết hợp không có lợi ích để truy cập trực tiếp $ _POST. – Thomas

+0

Vâng, nhưng nó là một cấu trúc ngôn ngữ cơ bản của PHP, vậy tại sao không sử dụng nó. Mặt khác, nếu bạn có một thiết kế OO thích hợp, bạn sẽ không bao giờ phải xử lý 20 tham số trong một cuộc gọi hàm. – Daff

+0

Vấn đề tôi thấy với các mảng là "looseness" của họ, mọi nhà phát triển đều có thể thêm hoặc xóa các trường và không ai có thể nhận thấy. Các lớp học tốt hơn, vì chúng xác định cách dữ liệu được cấu trúc. Nhưng trong trường hợp này tôi sẽ theo karim79, vì chúng ta không thay đổi các giá trị trong POST-Array. – Thomas

0

Bộ điều khiển. Bởi vì dữ liệu yêu cầu và thao tác mô hình không giống nhau. Do đó, việc đặt logic dựa trên dữ liệu yêu cầu trong mô hình sẽ là bắt buộc đối với tất cả các yêu cầu có thể khác và điều đó là xấu

+0

Tôi không nghĩ rằng các tham số truy cập được tính là logic. Xác nhận vv đã được thực hiện bộ điều khiển. Ngoài ra, phương pháp này chỉ có ý nghĩa đối với trường hợp này, vì vậy không có kế hoạch sử dụng lại nó cho một yêu cầu khác. – Thomas

1

Tôi đã gặp khó khăn với cùng vấn đề này và giải pháp mà tôi đưa ra là linh hoạt, giữ mã của tôi có thể sử dụng lại và là khoan dung của những thay đổi cho front-end: Tôi thích sử dụng setters. Tất nhiên, có một setter cho mỗi giá trị duy nhất là một nỗi đau, do đó, nhóm dữ liệu theo cách hợp lý giúp:

 
$user = new User(); 
$user->setName($_POST['lastName'],$_POST['firstName']); 
$user->setAddress($_POST['address1'],$_POST['address2'],$_POST['city'],$_POST['state'],$_POST['zip']); 

Bạn nhận được điểm.Sau khi lưu vào các biến đối tượng, bạn có thể sử dụng các giá trị này trong tất cả các phương thức của đối tượng của bạn.

Làm cho các mô hình của bạn phụ thuộc vào superglobals là không linh hoạt. Nó cũng làm cho đơn vị thử nghiệm một cơn đau.

+0

Đây là một gợi ý thú vị. Đáng buồn thay, trong trường hợp này, tôi không thể nhóm bất kỳ tham số nào theo ngữ cảnh, vì vậy tôi phải có một setter cho mỗi tham số, và do đó giải pháp karim79 làm cho mọi thứ trở nên dễ dàng hơn. Nhưng tôi sẽ ghi nhớ điều này trong các trường hợp khác. – Thomas

0

Dưới đây là những gì tôi làm ...

//Object Oriented POST Replacement 
    if ($_SERVER['REQUEST_METHOD'] == 'POST') 
    { 
     $_POST = json_decode(file_get_contents('php://input')); 
    } 

tôi chủ yếu viết các API mà chuyển thông tin qua JSON với Content-Type: application/json. Tuy nhiên, điều này sẽ làm việc (và là tốt hơn trong quan điểm của tôi) không có vấn đề làm thế nào $_POST đang được dân cư.

Dù bạn đang làm gì, tôi khuyên bạn nên biến $_POST siêu toàn cầu thành một đối tượng. Trong các mô hình của bạn chấp nhận một đối tượng đơn lẻ làm đối số và kéo các thuộc tính hoặc thuộc tính con.

Từ đó, chỉ cần đặt các phương pháp điều khiển của bạn để gọi các phương thức mô hình với đối tượng hướng đối tượng $_POST siêu toàn cầu của bạn làm đối số duy nhất.

Các vấn đề liên quan