Hầu hết các khung php nghiêm ngặt MVC [đã đóng]


8

Tôi đã cố gắng xoay quanh mô hình MVC trong khoảng 6 tháng. Tôi đã đọc hàng tấn bài viết, hỏi đáp và bài đăng trên blog về các mẫu MVC và HMVC, nhưng tôi chỉ đơn giản là không nhận được 100%.

Tôi đã thử học MVC bằng cách thực hiện một trong các khung PHP MVC được sử dụng rộng rãi, CodeIgniter. Tôi đã triển khai một vài trang web nội bộ cho công ty của mình với nó. Và VẪN, tôi không nhận được 100%. Tôi tin rằng một trong những cách tốt nhất để học một cái gì đó là tuân theo các quy tắc được xác định nghiêm ngặt.

Vì vậy, câu hỏi của tôi là: Khung PHP nghiêm ngặt nhất về cách triển khai mô hình MVC là gì? Một trong đó xác định cách tôi sử dụng các mô hình, bộ điều khiển và khung nhìn để tôi hoàn toàn có thể có được MVC là gì?

Câu trả lời:


13

Câu trả lời ngắn

Không có những điều như vậy.

Phiên bản dài hơn:

Các khung không triển khai mẫu thiết kế lấy cảm hứng từ MVC hoặc MVC. Ứng dụng của bạn nào.

MVC không phải là một loại nước sốt kỳ diệu, mà bạn có thể thêm vào ứng dụng của mình bằng cách bỏ nó vào một khung công tác. Thay vào đó, bạn thực sự sẽ phải học và hiểu mô hình đã nói (và các nguyên tắc và thực tiễn đi kèm, như RẮN , LoD , SoC ) . Chỉ sau đó bạn có thể cố gắng sử dụng nó trong sự lựa chọn của bạn về một khung.

Nếu một khung quảng cáo rằng nó "có MVC" , sau đó nó là hoàn toàn hoàn toàn Dren . Trong tình huống đó, nó được sử dụng để "bán" khung cho các noobs quan tâm nhiều hơn đến sự cường điệu mới nhất sau đó về thiết kế ứng dụng và thực hành mã hóa.

Mục tiêu của một khung sẽ là cung cấp cho bạn bộ sưu tập các công cụ, khi được sử dụng toàn bộ, cung cấp cho bạn một môi trường phát triển được thay đổi / cải tiến. Họ xử lý các vấn đề như định tuyến, tự động tải, trừu tượng hóa mức độ thấp để lưu trữ (không, tôi không nói về chống mẫu bản ghi hoạt động) và phần còn lại giúp bạn tiết kiệm thời gian trong việc phát triển và bảo trì boh.

Tóm lại là.

Không có khung MVC trong PHP. Tất cả những người tuyên bố với tôi như vậy thực sự là một trong những người tồi tệ nhất. Cụ thể - codeigniter, cakephp và yii. Tránh chúng bằng mọi giá (trừ khi bạn được trả tiền thực sự tốt cho nó).

Nếu bạn cần sử dụng khung, hiện tại các tùy chọn tốt nhất của bạn sẽ là phiên bản mới nhất của Symfony 2.x, Zend Framework 2.x hoặc Laravel 4.x. Những cái này sẽ không triển khai MVC cho bạn, nhưng thay vào đó sẽ gây hại ít nhất cho kiến ​​trúc ứng dụng của riêng bạn.


7
-1 Rõ ràng một số khung công tác phù hợp với MVC hơn các khung khác. Thông thường đó là những cái bao gồm mô hình, khung nhìn và bộ điều khiển.
Rein Henrichs

7
Mô hình không phải là một lớp học. nó là một lớp ứng dụng Nếu bạn có một khung công tác có "mô hình", thì đó là một dấu hiệu rõ ràng thậm chí không liên quan từ xa đến thiết kế MVC hoặc các khái niệm về MVC được xây dựng trên đó.
mefisto

7
... Đó là một lớp ứng dụng cần được thống nhất theo một cách nào đó. Trong ngôn ngữ OO thường có nghĩa là sử dụng các đối tượng, có nghĩa là sử dụng các lớp. Trong mọi trường hợp, tôi không quan tâm đến việc tham gia với ai đó một cách công khai thô lỗ và thù địch với ý tưởng của người khác nên tôi sẽ để việc này một mình.
Rein Henrichs

6
-1 OP đã yêu cầu một khung thực thi nghiêm ngặt việc sử dụng mẫu MVC trong ứng dụng bằng cách sử dụng khung. Câu trả lời của bạn là về khung "tốt nhất" và triết lý về khung nói chung và không trả lời câu hỏi của OP.
lập trình viên

3
+1 Tôi đã đi đến cùng một kết luận trong những năm qua. Cake & co là những kẻ phạm tội tồi tệ nhất; bạn thể có được một cái gì đó MVCish từ chúng nếu bạn sử dụng chúng đủ lâu, nhưng chúng thực sự không hướng đến thiết kế MVC thực tế. Sự lựa chọn tốt nhất thực sự là các khung công tác chỉ là một bộ sưu tập các thành phần lỏng lẻo và cho phép bạn thực hiện ứng dụng của riêng mình bằng các công cụ tổng quát của chúng.
lừa dối

7

Tôi chỉ có thể nói chuyện với Cake, và tôi không có gì hay để nói về điều đó về MVC. Họ không làm đúng MVC. Codeigniter là rất nhiều trong cùng một tĩnh mạch. Không có gì lạ khi bạn không "hiểu" MVC ngay cả khi đã sử dụng nó một thời gian.

MVC chỉ đơn giản là phân tách đúng ba thành phần riêng biệt trong logic ứng dụng của bạn: cốt lõi của ứng dụng , bản trình bày và chất keo cần thiết để làm cho cả hai hoạt động trong bối cảnh thế giới thực.

Cốt lõi của ứng dụng của bạn, chứa tất cả logic nghiệp vụ, tương tác cơ sở dữ liệu, dịch vụ, tiếng bíp và boop làm cho ứng dụng của bạn "ứng dụng của bạn" là mô hình. Mô hình không phải là một điều cụ thể trong một hình dạng cụ thể, nó là bất cứ điều gì cần thiết để làm cho ứng dụng của bạn hoạt động theo cách nó làm. Bạn chỉ có một "mô hình", đó là ứng dụng của bạn.

Chế độ xem được sử dụng để xuất ra một cách nào đó mô hình của bạn làm gì. Đó là giao diện người dùng. Đó là bất cứ điều gì cần thiết để hiển thị thông tin hữu ích cho người dùng. Đây có thể là một trang web, nó có thể là một giao diện dòng lệnh, nó có thể là một GUI máy tính để bàn riêng. Bạn có thể sử dụng cả ba trong ứng dụng của bạn.

Bộ điều khiển chỉ đơn giản là bất cứ thứ gì còn lại để làm cho công việc đó, chủ yếu là thứ lấy đầu vào của người dùng và hướng nó đến nơi thích hợp. Bạn có thể có một số loại bộ điều khiển khác nhau cho các loại bối cảnh khác nhau, ví dụ: một loại có thể xử lý các yêu cầu HTTP đến, một loại xử lý đầu vào dòng lệnh và một loại được nối với các sự kiện GUI.

Những hình dạng cụ thể mà các bộ phận riêng lẻ này phụ thuộc hoàn toàn vào ứng dụng của bạn. Tất cả ba có thể được sắp xếp các ứng dụng nhỏ của riêng họ. Bất kỳ "mô hình" khung mẫu prefab nào được tạo cho một trường hợp tổng quát để giúp bạn có được một cái gì đó và chạy nhanh; nó thường không phải là hình thức tối ưu mà mô hình của bạn nên dùng. Bạn sẽ phải đưa ra cấu trúc của riêng mình cho ứng dụng của bạn , bất cứ điều gì phù hợp nhất để xây dựng nó. Xem xét các nguyên tắc OOP, RẮN, tiêm phụ thuộc, vv và xây dựng mô hình cốt lõi của bạn theo các hướng dẫn này. Sau đó bọc quan điểm và bộ điều khiển xung quanh nó khi cần thiết.

Điểm của sự tách biệt này chỉ đơn giản là làm cho ứng dụng có thể duy trì và mở rộng. Mô hình không chứa bất cứ thứ gì cụ thể cho bất kỳ hình thức đầu vào hoặc đầu ra cụ thể nào. Ví dụ: nó không chứa bất kỳ văn bản cụ thể định dạng nào (như thông báo lỗi ở định dạng HTML). Nó không giả định bất kỳ hình thức đầu vào cụ thể nào (như yêu cầu HTTP). Chế độ xem ngược lại không chứa bất kỳ logic nghiệp vụ nào, công việc của nó chỉ là đầu ra . Và bộ điều khiển cũng không chứa bất kỳ logic nghiệp vụ nào, công việc của nó chỉ là "nhập liệu" . Lý do đơn giản là cả bộ điều khiển và khung nhìn đều có thể hoán đổi cho nhau, nhưng ứng dụng của bạn thì không.

Nếu bạn muốn sử dụng một khung cho việc này, hãy sử dụng một khung theo mô-đun và cho phép bạn làm bất cứ điều gì bạn cần làm. Zend, Symfony, Laravel và các khung chọn và lựa chọn dựa trên thành phần tương tự phù hợp nhất cho việc này.


Cảm ơn đã làm sáng tỏ một số nghi ngờ! Tôi sắp xếp những gì bạn muốn nói khi đọc dòng này. cả bộ điều khiển và khung nhìn đều có thể hoán đổi cho nhau, nhưng ứng dụng của bạn thì không. Một câu hỏi mặc dù: Trong bất kỳ cấu trúc thư mục khung nào, có một thư mục gọi là 'mô hình'. Nếu 'ứng dụng của tôi' là 'mô hình', thì chúng, những gì trong thư mục 'mô hình' này, thực sự được gọi là gì?
kidonchu

Thêm một câu hỏi nữa ... hướng dẫn này có được coi là tương tự với sự hiểu biết của bạn về mẫu MVC không? Có vẻ như họ có những điểm chung, nhưng tôi không chắc chắn; đặc biệt, nhận xét của quản trị viên về việc có tất cả các logic trong một mô hình với nhiều lớp thực thể, liên kết này .
kidonchu

Tôi vừa đọc lướt hướng dẫn đó, nhưng có vẻ phù hợp hơn với MVC "thực". Mô hình có vẻ hơi mỏng, nhưng hy vọng chỉ vì nó chỉ là một ví dụ. Tôi đặt tên thư mục mô hình của mình là "model", nhưng trong đó tôi tạo ra một số thư mục con; thông thường tôi ít nhất phân biệt giữa "primitves" (như Book), dịch vụ ("hành động", thích collateBookCollection) và lưu trữ ( saveBookToDatabase). Điều bạn cần quan tâm là bạn không đặt quá nhiều mã vào bộ điều khiển, đó là thứ gì đó Cake & co. nhận sai hoàn toàn Làm cho mô hình của bạn thực sự béo thay thế.
lừa dối

Tôi đặt tên cho tôi domain: p
Esailija

7

Một khung như vậy không thể tồn tại vì một số lý do.

Trước hết, Model trong mẫu MVC là phần làm cho ứng dụng của bạn trở thành ứng dụng của bạn . Nếu một khung công tác xác định chính xác mô hình trông như thế nào, thì khung đó sẽ chỉ có thể sử dụng được cho một hoặc nhiều nhất là một số ít các ứng dụng. Điều này có hiệu quả ngăn chặn nó là một khuôn khổ.

Vấn đề thứ hai là không có sự đồng thuận phổ quát về một ứng dụng phù hợp của mẫu MVC trông như thế nào. Ví dụ: một số người sẽ nói rằng Bộ điều khiển phải cung cấp cho Chế độ xem dữ liệu cần thiết từ Mô hình, trong khi những người khác sẽ nói rằng Chế độ xem nên tự lấy thông tin cần thiết và Bộ điều khiển chỉ cần đảm bảo rằng Chế độ biết phải ở đâu tìm mô hình.
Một ví dụ khác, cụ thể hơn cho các ứng dụng web, là số lượng xử lý mà Chế độ xem có thể thực hiện. Đối với một số người, Chế độ xem chỉ bao gồm các tệp HTML trong đó một số chủ sở hữu địa điểm thay thế bằng nội dung thực tế (thường được Bộ điều khiển lấy từ Mô hình), trong khi những người khác hoàn toàn thoải mái khi để Chế độ xem xử lý liên quan đến giao diện người dùng, như quốc tế hóa của nội dung trình bày.


1
Tôi hiểu rồi. Tôi nghĩ rằng tôi đã từng thấy câu nói này "Nếu bạn hỏi" MVC là gì "với mười người khác nhau, bạn sẽ nhận được mười câu trả lời khác nhau". Tôi đoán đó là ý nghĩa thứ hai của bạn.
kidonchu

@kidonchu: Đó là một phần của nó, mặc dù bạn cũng không nên ngạc nhiên khi nhận được 11 câu trả lời khác nhau từ 10 người đó ;-)
Bart van Ingen Schenau

2

Tôi hiểu bài đăng này là cũ, đó là lý do trớ trêu tôi đăng bài phản hồi này. Trước hết, một số người trả lời câu hỏi này là đúng. Bạn sẽ không bao giờ thực sự tìm thấy một Khung công tác PHP có sẵn "MVC Ready" ngay lập tức. Xem như khung công tác được coi là một nền tảng nơi Dev's có thể xây dựng dựa trên nó, theo MVC. Tuy nhiên, trong năm ngoái kể từ khi điều này được đăng, một số khung công tác PHP ngoài kia chắc chắn đã đi một chặng đường dài .

Tôi đã loay hoay với CakePHP một chút, thậm chí cho đến ngày nay, nó là một thiết lập khủng khiếp, lộn xộn của các thư mục và cấu trúc, không có sự phân biệt rõ ràng giữa logic, nó có mã nhận xét khá kém và mọi thứ được nhồi nhét vào nhau trong một gói lộn xộn. Đó không phải là một lời ca ngợi trên CakePHP làm phiền bạn, đó là sự thật đơn giản.

Zend, là tuyệt vời. Họ cung cấp tài liệu và nhận xét mã tuyệt vời, có một cộng đồng rất thân thiện và cung cấp một khuôn khổ rất đẹp cho các nhà phát triển mới làm quen và trung gian. Họ đã đi một chặng đường dài kể từ khi OP đăng bài này.

Và với những người nói rằng không có khuôn khổ nào để trả lời câu hỏi của OP, họ đã đúng như tôi đã nói ở trên. Tuy nhiên, họ cũng sai. Zend, Laravel và CodeIgniter là những khung tuyệt vời và trong khi họ không "cung cấp" cho bạn MVC, họ chắc chắn mở đường cho bạn là nhà phát triển để tạo một ứng dụng MVC được xây dựng đẹp mắt, xem xét rằng bạn, là nhà phát triển theo MVC tốt thực hành.

Đối với những người trong chủ đề này nói CodeIgniter là khủng khiếp. Bạn khá sai lầm, ít nhất là theo tiêu chuẩn ngày nay. Tại thời điểm của bài đăng này, tôi đã không tham gia vào các khuôn khổ vì vậy tôi đã không nhìn vào nó sau đó. Vào thời điểm đó, nó có thể là khủng khiếp. Nhưng tôi sử dụng nó TẤT CẢ các ứng dụng web của tôi bây giờ. Họ làm rất tốt việc tạo ra một khung vững chắc với cấu trúc thư mục dễ hiểu, cũng như cung cấp cho bạn một số công cụ tuyệt vời để bắt đầu MVC. Họ làm rất tốt công việc phân biệt logic, họ có một cộng đồng tuyệt vời để hỗ trợ và họ nói chung cung cấp một khung công tác miễn phí tuyệt vời, một lần nữa nếu bạn tuân theo các thực tiễn MVC tốt, có thể biến thành một số ứng dụng tuyệt vời.

Đến điểm chính. Tôi muốn xen vào ý kiến ​​của tôi về chủ đề này. Bạn sẽ không bao giờ tìm thấy khung công tác hoàn hảo, được xây dựng bằng MVC . Tuy nhiên, nếu bạn sử dụng các thực tiễn MVC tốt và chọn một khung vững chắc như Zend, Laravel và / hoặc CodeIgniter, bạn sẽ ổn. Bởi vì sự thật thô thiển là, MVC tùy thuộc vào nhà phát triển về cách anh ta thực hiện thực tiễn tốt chứ không phải khung. Khung cung cấp nền tảng, phần còn lại là tùy thuộc vào nhà phát triển.

Các khung tốt để sử dụng làm tài liệu tham khảo

  • CodeIgniter
  • Khung Zend
  • Ấu trùng
  • Symfony 2 (Đã thêm sau khi đọc bình luận, vì đó cũng là một khung xuất sắc)

Chỉ cần nhớ khi sử dụng chúng, nhà phát triển phải tuân theo các thực hành MVC tốt. Có rất nhiều hướng dẫn về các thực hành MVC tốt. Tôi tình cờ thấy trang web của một quý ông có một số hướng dẫn tuyệt vời , và anh ta nhắm đến MVC phù hợp, và cho đến nay các bài đăng trên blog của anh ta khá nguy hiểm, và anh ta là một nơi tuyệt vời để bắt đầu tìm hiểu.

Tài liệu tham khảo


Tôi hiểu bài đăng này là cũ, đó là lý do trớ trêu tôi đăng bài phản hồi này. Câu hỏi bây giờ thực sự được coi là lạc đề và tôi đã bỏ phiếu để đóng nó như vậy. Một trong những lý do mà bây giờ chúng tôi coi các bài đăng như ngoài chủ đề là chính xác vì thông tin đã lỗi thời quá dễ dàng.
Martijn Pieters

Tôi đã tự hỏi tại sao bạn lại bỏ Symfony 2. Sau đó tôi thấy tài liệu tham khảo về Tommy và tất cả đã trở nên rõ ràng.
Cerad 15/03/2015

Bạn đúng. Tôi đã quên symfony. Tôi luôn quên cái đó vì tôi hiếm khi sử dụng nó. Nhưng tôi tò mò, làm thế nào mà tài liệu tham khảo của tôi về Tommy "làm cho nó rõ ràng"? Điều đó có nghĩa là gì = P
Jason

Chà, hãy nói rằng vài năm trước Tom đã làm phiền một trong những nhà phát triển nghiêm túc hơn đủ để nhà phát triển lấy ra bình xịt lỗi của mình. Tom rất vui khi đọc nhưng sống trong một thực tế khác.
Cerad 15/03/2015

Tôi sẽ không đồng ý ở đó lol. Anh ấy kén chọn và rất thú vị và chắc chắn nhất là sống trong thực tế của chính mình. Nhưng tôi rất ngưỡng mộ loạt Model View Confusion của anh ấy. Và với tôi, anh ấy có một cách tiếp cận tuyệt vời về MVC thích hợp. Nhưng đó chỉ là ý kiến ​​của tôi. Cảm ơn đã làm rõ @Cerad
Jason

1

Có vẻ như bạn đang gặp khó khăn trong việc "kết hợp tất cả lại" bởi vì nhiều hướng dẫn rất kém trong việc giải thích MVC một cách rõ ràng. Tôi khuyên bạn nên dùng tay "bẩn" và xây dựng một ứng dụng đơn giản với khoảng 3 đến 5 khung khác nhau để xem cách chúng thường tiếp cận vấn đề. Một số có tài liệu về cách thiết lập kiến ​​trúc MVC cơ bản cho một ứng dụng và nếu không, bạn luôn có thể google cho một vài hướng dẫn mvc cho khung cụ thể đó.

FWIW Tôi thích đề xuất bố cục dự án / thư mục của Zend: http://framework.zend.com/manual/1.12/en/project-structure.project.html

Ngoài ra, hãy xem "Khung công tác PHP MVC không có khung" của Rasmus. Nó cho thấy bạn không thực sự cần một khung, bạn chỉ có thể tự xây dựng để phù hợp với nhu cầu cụ thể của mình. Thêm vào đó, bạn sẽ nhận được một ý kiến! http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html


Vâng, tôi thừa nhận tôi không thể tập hợp tất cả lại thành một mảnh. Liên kết của bạn đến bài viết của Rasmus đã xóa một số nghi ngờ. Đặc biệt, ý tưởng chính, 'không cần khung để triển khai mô hình MVC'. Cảm ơn!
kidonchu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.