Đầu tiên, trước khi chúng tôi truy cập Magento, điều quan trọng là phải hiểu rằng PHP có mô hình quy trình hoàn toàn khác với Java. Một singleton PHP (bất kể sự tham gia của Magento) là một cá thể duy nhất của một lớp theo Yêu cầu HTTP. Một chương trình PHP không liên tục trong bộ nhớ giống như một chương trình Java, do đó, điều chỉnh mong đợi của bạn về một "singleton" cho phù hợp.Tiếp theo, điều quan trọng là phải hiểu rằng Magento là một khung được xây dựng trên đầu trang của PHP, sử dụng PHP, và trong nhiều trường hợp các nhà phát triển Magento ban đầu muốn đẩy mọi thứ vào một kiến trúc giống Java hơn. Vì vậy, bạn sẽ thấy những thứ trông quen thuộc, quen thuộc, nhưng có thể khác biệt theo một số cách chính từ những gì bạn đang sử dụng bởi vì họ vẫn cần phải đi đến phiên bản của vũ trụ PHP.
Magento sử dụng mẫu nhà máy để khởi tạo các lớp Helpers, Blocks và "Model". Chuỗi
core/session
là bí danh lớp. Bí danh này được sử dụng để tra cứu tên lớp trong cấu hình của Magento. Tóm lại, chuỗi này được chuyển đổi thành các biểu thức đường dẫn tìm kiếm các tệp cấu hình của Magento để lấy ra một tên lớp, dựa trên ngữ cảnh (helper, block, model) mà nó được gọi. Trong một phiên bản dài hơn, hãy xem bài viết Magento's Class Instantiation Autoload của tôi.
Khái niệm về "Mô hình" hơi mờ trong Magento. Trong một số trường hợp, các mô hình được sử dụng làm miền hoặc mô hình dịch vụ. Trong các trường hợp khác, chúng được sử dụng như một mô hình cơ sở dữ liệu trung gian bền vững hơn. Sau khi làm việc với hệ thống trong một vài năm, tôi nghĩ rằng cách an toàn nhất để suy nghĩ về Mô hình là họ đang cố gắng của Magento để làm đi với instantiation lớp trực tiếp.
Có hai cách để khởi tạo lớp mô hình.
Mage::getModel('groupname/classname');
Mage::getSingleton('groupname/classname');
Biểu mẫu đầu tiên sẽ giúp bạn có một phiên bản lớp mới. Dạng thứ hai sẽ giúp bạn có được một cá thể lớp đơn. Sự trừu tượng hóa Magento đặc biệt này cho phép bạn tạo ra một singleton ra khỏi bất kỳ lớp nào của mô hình Magento, nhưng chỉ khi bạn gắn bó với các phương thức instantiation của Magento. Nghĩa là, nếu bạn gọi
Mage::getSingleton('groupname/classname');
cuộc gọi sau đó tiếp theo để
Mage::getSingleton('groupname/classname');
sẽ trở lại mà dụ singleton. (Điều này được thực hiện với một mẫu đăng ký). Tuy nhiên, không có gì ngăn bạn trực tiếp khởi tạo một phiên bản mới của lớp học bằng cách
$o = Mage::getModel('groupname/classname');
$o = new Mage_Groupname_Model_Classname();
Điều này đưa chúng tôi đến phiên. Mô hình yêu cầu của PHP, như HTTP, ban đầu được thiết kế là không trạng thái. Mỗi yêu cầu đi vào hệ thống với và chỉ với thông tin từ người dùng. Khi ngôn ngữ (và web) chuyển sang một nền tảng ứng dụng, một hệ thống cho phép thông tin được duy trì được giới thiệu để thay thế các hệ thống phát triển trong nhà đang được cắt xén. Hệ thống này được gọi là phiên. Các phiên PHP hoạt động bằng cách trưng ra một mảng siêu toàn cầu $ _SESSION cho người lập trình người dùng cuối cho phép thông tin được lưu trữ trên cơ sở mỗi người dùng web. Phiên được triển khai bằng cách đặt ID duy nhất làm cookie trên đầu người dùng và sau đó sử dụng cookie đó làm khóa tra cứu (cũng là thực hành tiêu chuẩn cho các ứng dụng web)
Lần lượt, hệ thống Magento xây dựng sự trừu tượng trên đầu trang của PHP phiên trừu tượng. Trong Magento, bạn có thể tạo một "mô hình phiên" kế thừa từ một lớp phiên cơ sở, thiết lập các thành viên dữ liệu trên đó và lưu/tải các thành viên dữ liệu đó giống như bạn làm với mô hình kiên trì cơ sở dữ liệu. Sự khác biệt là thông tin được lưu trữ trong phiên thay vì kho lưu trữ cơ sở dữ liệu. Khi bạn thấy
core/session
customer/session
đây là hai mô hình phiên khác nhau, mỗi mô hình lưu trữ dữ liệu khác nhau.Một thuộc về mô-đun Mage_Core, phần còn lại thuộc về mô hình Mage_Customer. Hệ thống này cho phép các mô-đun thiết lập và thao tác một cách an toàn dữ liệu phiên của riêng chúng, mà không vô tình bước lên các ngón chân của mô-đun khác, và cung cấp các phương thức lớp logic để thao tác dữ liệu đó.
Hy vọng rằng sẽ trả lời các câu hỏi bạn đã hỏi, cũng như những câu hỏi bạn đã không hỏi.
Cảm ơn bạn đã dành thời gian trả lời đầy đủ. Điều đó rất thông tin. – user265330
Alan, giải thích tuyệt vời - nhưng thông tin về cuộc gọi ban đầu tới getSingleton() theo sau là các cuộc gọi tới getModel() không hoàn toàn chính xác. Vi phạm mẫu Singleton, lệnh gọi thứ hai (để getModel()) trong một phạm vi thực thi đã cho sẽ trả về một cá thể hoàn toàn mới. Các cuộc gọi tiếp theo để getSingleton() tuy nhiên sẽ trả về đối tượng singleton như được mô tả. – benmarks
Lạ lùng, không chắc làm thế nào tôi có được một chút (sai) của singleton voodoo trong đầu tôi. Đã sửa văn bản. –