2011-02-01 20 views
13

Tôi đã cố gắng tìm hiểu xem tôi có thể áp dụng kiến ​​trúc MVC cho thủ tục và cách tôi có thể thực hiện điều này vào mã của mình hay không. Theo hiểu biết của tôi, MVC về cơ bản đại diện cho việc tách logic nghiệp vụ, lớp trình bày và logic khác mặc dù nó dường như luôn hướng đến OO-PHP nói riêng.Tôi có thể áp dụng Mẫu thiết kế MVC cho Thủ tục PHP

Bạn có thể giới thiệu cách tốt nhất để tiếp cận MVC trong ngữ cảnh thủ tục không?

Cảm ơn.

+1

+1 @Daniel Câu hỏi hay, tôi đang tìm kiếm điều gì đó theo cách này có thời gian dài và cho đến bây giờ tôi không có câu trả lời hay, tôi hy vọng ai đó cung cấp cho bạn câu trả lời hay. Về cơ bản phong cách lập trình thủ tục là rất nhiều chỉ dẫn gần như ở cùng một nơi, tôi có nghĩa là mã dài, bảo trì khó khăn, vv .. và trong OO nó là khác nhau. Cách đây một thời gian, tôi đã làm mysqlf searate trong 3 phần khác nhau. Bussines Logic, mẫu (giao diện, có thể có một mẫu logic) và cuối cùng là trừu tượng dữ liệu. Nói chung MVC làm một cái gì đó như thế này, phụ thuộc vào khuôn khổ bạn đang sử dụng .. nó là một chút phức tạp .. – B4NZ41

+0

Tôi rất khuyến khích mọi người bắt đầu một dự án mới với thủ tục PHP. Trong trường hợp bạn muốn sử dụng MVC trong một dự án cũ: hãy viết lại dự án của bạn trong OOP. Tin tôi đi. OOP mở dự án của bạn đến một thế giới hoàn toàn mới. – Shoe

+0

Vâng tôi đang gặp một số vấn đề khi OO làm việc cho tôi một cách chính xác và muốn thử và triển khai kiến ​​trúc MVC vào mã của tôi. Tôi không sử dụng bất kỳ khung công tác nào, tôi đang viết mã từ đầu. –

Trả lời

10

MVC là mô hình OO và bạn muốn tiếp cận nó với một bối cảnh thủ tục.

Điều này hoàn toàn sai. MVC không có gì để làm với mã hóa hướng đối tượng.

MVC là một mẫu kiến ​​trúc phần mềm nhằm mục đích phân tách thông tin từ sự tương tác của người dùng với nó.

Cách bạn đạt được điều đó tùy thuộc vào bạn. Bạn có thể đạt được điều đó bằng cách sử dụng bất kỳ hình thức mã hóa nào bạn muốn, đối tượng theo định hướng, thủ tục, chức năng, và những gì không.

Đối với câu hỏi trong tầm tay: Cách dễ nhất để đạt được mẫu MVC khi bạn đang mã hóa thủ tục PHP là sử dụng nhiều hàm nhỏ trong đó mỗi hàm cụ thể có nhiệm vụ duy nhất của riêng nó. Đừng để một hàm có nhiều nhiệm vụ. Bằng cách đó, việc tách riêng mọi thứ trở nên dễ dàng hơn. Cũng không giữ nhiều chức năng trong cùng một tệp. Thay vào đó tập hợp các hàm liên quan lại với nhau thành các nhóm nhỏ hơn trong mỗi nhóm trong tệp riêng của nó (những gì thực sự được thực hiện trong OO với các lớp).

Có người làm nó ở đây với một ví dụ đơn giản, MVC mà không OO: http://www.fluffycat.com/PHP-Design-Patterns/Non-OO-MVC/

+0

Vâng tôi phải đồng ý. Điều này khá lâu rồi. Trên thực tế đã kết thúc làm một cái gì đó tương tự như ví dụ của bạn. Mặc dù nó dễ dàng hơn khi sử dụng OO vì nó buộc bạn phải tạo các hàm riêng biệt. –

11

Yep, mà về khoản tiền lên MVC ... nhưng nó không phải được hướng đối tượng ... bạn chỉ cần làm theo một vài quy tắc vàng:

  1. Bộ điều khiển nhận và xử lý đầu vào, tạo ra bất kỳ dữ liệu nào và đặt nó vào trong mô hình.
  2. Chế độ xem lấy dữ liệu từ mô hình và hiển thị.
  3. Bộ điều khiển không được định dạng dữ liệu để xem - không nên biết cách/tại sao/chế độ xem mong muốn (ví dụ: không chèn HTML vào chuỗi văn bản vì đầu ra có thể là JSON)
  4. Chế độ xem nên không tra cứu bất kỳ dữ liệu nào cho chính nó - nếu nó không có trong mô hình thì bộ điều khiển thất bại trong công việc của nó (ném/báo cáo lỗi).

Ngoài ra, bạn có thể làm mọi thứ theo ý muốn. Về cơ bản, bạn cần một bộ thủ tục để hoạt động như bộ điều khiển - phân tích cú pháp $_REQUEST vars (nhiều khả năng là GET/POST/COOKIE) thực hiện bất kỳ công cụ tra cứu dữ liệu nào, điền vào mô hình, và một bộ thủ tục khác trong mô hình và hiển thị nó cho người dùng. Mô hình có thể đơn giản như một mảng kết hợp.

+0

Cảm ơn, tôi chỉ cần tách các mô hình và chế độ xem thành các tệp riêng biệt và tôi nên sắp xếp điều này. Chỉ cần một câu hỏi nhanh, tất cả các yêu cầu phải đi qua tệp index.php hoặc nó có thể là một cái gì đó giống như, bấm vào điều hướng var để đi tới search.php, sau đó trang tìm kiếm có thể truy cập vào mô hình và khung nhìn cho chức năng tìm kiếm thông qua bộ điều khiển? –

+3

Tuyệt đối. Một mẫu thiết kế không có gì hơn thế, một khuôn mẫu. Bạn có thể thực hiện nó trong bất kỳ mô hình nào. +1 – ircmaxell

+2

Miễn là mỗi trang '.pp' có một cuộc gọi điều khiển (không có kết quả đầu ra) và sau đó một cuộc gọi xem không có lý do bạn không thể chia nó thành các trang riêng biệt. – Rudu

0

Điều này thật lạ lùng. MVC là mẫu OO và bạn muốn tiếp cận nó với ngữ cảnh thủ tục.

Điều đầu tiên đến với tâm trí của tôi là có một số loại động cơ templating để tách PHP khỏi mã HTML. Điều này sẽ là một bước tiến lớn hướng tới thủ tục MVC :)

Điều tiếp theo là đặt tên các hàm của cùng một nhóm (có nghĩa là, các hàm chứa logic cho các đối tượng liên quan) với tiền tố (giống như phương thức nhóm dưới tên lớp) .

Ví dụ - nhìn PHP chức năng thủ tục để làm việc với mysql:

mysql_connect() 
mysql_real_escape_string(); 
mysql_select_db(); 
mysql_query(); 

, vv Và nhóm các chức năng trong tập tin riêng biệt. Điều này sẽ giúp tách rời một chút logic.

Nếu bất cứ điều gì khác đến tâm trí của tôi, tôi sẽ sửa bài của tôi :)

+0

Cảm ơn, tôi thực sự không chắc chắn làm thế nào để giải quyết điều này, tôi đã thử nó trong OO-PHP nhưng tìm thấy một số vấn đề trong việc thực hiện kiến ​​trúc một cách chính xác. –

0

Nếu bạn đang thực hiện một mẫu thiết kế mới nhiều khả năng bạn đang refactoring hoặc viết một cái gì đó từ đầu. Tôi khuyên bạn nên chuyển sang OOP nếu bạn dự định sử dụng MVC. Nó có thể được thực hiện một cách thủ tục nhưng sẽ rất khó khăn và không phải là một giải pháp tốt.

Có một số giải pháp MVC php miễn phí mà bạn có thể dễ dàng nhận.Dưới đây là một vài ví dụ:

  • Zend Framework
  • Kohana
  • Mã Ignighter
+1

Cảm ơn, nhưng tôi cần phải viết mã này từ đầu thay vì sử dụng một khung công tác. –

+0

Lựa chọn tốt. Nó thậm chí còn tốt hơn để tạo khuôn khổ của riêng bạn. – Shoe

+0

Tôi cũng muốn nhưng tôi không biết bắt đầu từ đâu với điều đó! –

0

Chắc chắn rồi. Sử dụng bất kỳ kết hợp nào sau đây:

  1. Sử dụng bao gồm tệp.
  2. Chức năng sử dụng.
  3. Tách các tệp nguồn của bạn.
  4. Chia các phần của mã trong các tệp nguồn.
  5. Sử dụng các khối mã (dấu ngoặc nhọn).
  6. Tách biệt các tệp PHP và/hoặc HTML và/hoặc JS.

Bất kỳ thứ gì sắp xếp mã của bạn dọc theo dòng Mô hình, Chế độ xem và Bộ điều khiển. Nó có thể không phải là MVC "thuần khiết" hoặc "đúng" trong tâm trí của một số người ... nhưng nếu nó tổ chức mã thủ tục của bạn có ý nghĩa hơn hoặc dạy bạn nhiều hơn về MVC, thì đó là một điều tốt.

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