2008-09-29 40 views
7

tôi có một ứng dụng web lớn chạy trong perl CGI. Nó chạy ok, nó cũng được viết, nhưng như nó đã được thực hiện trong quá khứ, tất cả các html được định nghĩa hardcoded trong các cuộc gọi CGI, để bạn có thể tưởng tượng, rất khó để mantain, cải thiện và vv Vì vậy, bây giờ tôi muốn bắt đầu để thêm một số khuôn mẫu và tích hợp với một khuôn khổ (chất xúc tác hoặc CGI :: ứng dụng). Câu hỏi của tôi là: Ai đó ở đây có một trải nghiệm như thế? Có bất kỳ điều gì mà tôi phải chú ý không? Tôi biết rằng với cả hai khung công tác, tôi có thể chạy các tập lệnh CGI gốc, vì vậy nó tốt vì tôi có thể chạy cả hai (mã quảng cáo gốc "CGI") cùng nhau mà không có bất kỳ chấn thương nào. Có lời khuyên nào không?Cách tiếp cận tốt nhất để di chuyển CGI sang Khung là gì?

Trả lời

10

Viết kiểm tra trước (ví dụ: Test::WWW::Mechanize). Sau đó, khi bạn thay đổi những điều bạn luôn biết nếu có điều gì đó bị phá vỡ, và những gì nó là phá vỡ.

Sau đó, trích xuất HTML thành mẫu và các đăng ký thường được sử dụng thành các mô-đun. Sau đó, nó là một miếng bánh để chuyển sang một khuôn khổ.

Nói chung, hãy đi từng bước để bạn luôn có một ứng dụng đang hoạt động.

4

Giải mã HTML khỏi logic xử lý trong tập lệnh CGI. Xác định tất cả các mã có ảnh hưởng đến đầu ra HTML, vì đây là những ứng cử viên để trở thành biến mẫu. Phân tách tệp đó thành tệp HTML, với các phần được xác định được đánh dấu bằng biến mẫu. Cuối cùng, bạn sẽ có thể cấu trúc lại trang sao cho tất cả quá trình xử lý được thực hiện ở đầu mã và mẫu HTML vừa được gọi vào cuối tất cả quá trình xử lý.

3

Trong loại tình huống này, viết lại từ đầu về cơ bản, mã cũ hữu ích cho thử nghiệm A) và B) chi tiết thiết kế. Lý tưởng nhất là bạn thực hiện một loạt các kiểm tra, cho tất cả các chức năng cơ bản mà bạn muốn sao chép, hoặc ít nhất các bài kiểm tra phân tích các trang kết quả cuối cùng để bạn có thể thấy mã mới trả về cùng một thông tin cho cùng các đầu vào.

Chi tiết thiết kế bên trong mã có thể vô ích, tùy thuộc vào mức khung được xử lý tự động. Nếu bạn có một bộ kiểm tra tốt và một chuyển đổi đơn giản hoạt động tốt, bạn đã hoàn tất. Nếu hành vi của cái mới không khớp với cái cũ, bạn có thể cần phải đào sâu hơn vào "tại sao?" và đó có thể là một cái gì đó kỳ lạ tìm kiếm, điều đó không có ý nghĩa ở cái nhìn đầu tiên.

Một điều cần ghi nhớ trước tiên là tìm hiểu xem có ai đã làm điều gì đó tương tự trong khung bạn đang sử dụng hay không. Bạn có thể tiết kiệm cho mình rất nhiều thời gian và tiền bạc.

+0

Viết lại từ đầu không phải là tùy chọn cho hệ thống có nhiều hơn 5k dòng. Nhưng dù sao, cảm ơn cho đầu vào của bạn! –

3

Sau đây là cách tôi đã làm nó bằng Python thay vì Perl, nhưng đó không phải vấn đề:

  1. Ly ra HTML và đang vào các tập tin riêng biệt. Tôi đã sử dụng công cụ mẫu mẫu cho điều đó.
  2. Đã tạo chức năng từ mã được hiển thị mẫu với một bộ thông số.
  3. Đã tổ chức các chức năng (mà tôi đã gọi lượt xem, lấy cảm hứng từ Django) một cách hợp lý. (Chế độ xem quản trị, Chế độ xem của người dùng, v.v.) Lượt xem tất cả theo cùng quy ước gọi!
  4. refactored ra cơ sở dữ liệu và yêu cầu thứ để các xem sẽ chỉ chứa xem mã cụ thể (đọc: Xử lý GET, POST yêu cầu, vv nhưng không có gì ở mức độ thấp). Dựa nhiều vào các thư viện hiện có cho điều đó.

Tôi đang ở đây vào lúc này. :-) Bước rõ ràng tiếp theo là tất nhiên:

  • Viết phối mà bản đồ URL-quan điểm của bạn. Điều này cũng sẽ dẫn đến các URL đẹp hơn và xử lý lỗi 404 và lỗi tốt hơn.
3

Một trong những giả định mà khung làm cho là các url ánh xạ tới mã. Ví dụ trong một khuôn khổ thông thường bạn sẽ thấy như sau:

http://app.com/docs/list 
http://app.com/docs/view/123 

Thông thường mặc dù các kịch bản CGI cũ không có tác dụng như vậy, bạn có nhiều khả năng có cái gì đó như:

http://app.com/docs.cgi?action=view&id=123 

Để tận dụng lợi thế của khung công tác, bạn có thể cần phải thay đổi tất cả các url. Cho dù bạn có thể làm điều này và cách bạn giữ liên kết cũ hoạt động, cũng có thể tạo thành một phần lớn trong quyết định của bạn.

Ngoài ra, khung công tác còn hỗ trợ cho một số loại ORM (trình ánh xạ quan hệ đối tượng) tóm tắt các cuộc gọi cơ sở dữ liệu và cho phép bạn chỉ xử lý các đối tượng. Đối với Catalyst, điều này thường là DBIx::Class. Bạn nên đánh giá chi phí chuyển đổi cho điều này sẽ là bao nhiêu.

Có thể bạn sẽ thấy rằng bạn muốn viết lại hoàn toàn, với mã cũ làm nền tảng tham chiếu. Điều này có thể ít hơn nhiều so với bạn mong đợi. Tuy nhiên bắt đầu với một vài trang web đồ chơi để có được một cảm giác cho bất kỳ khuôn khổ/orm/mẫu bạn quyết định đi với.

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