Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. WordPress Plugins
Code

Sử dụng Không gian tên và Autoload trong Plugin của WordPress, Phần 4

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Using Namespaces and Autoloading in WordPress Plugins.
Using Namespaces and Autoloading in WordPress Plugins, Part 3

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Nếu đây là hướng dẫn đầu tiên mà bạn đang đọc trong loạt bài này, thì tôi khuyên bạn nên theo kịp những gì mà chúng tôi đã khái quát cho đến lúc này.

Về cơ bản, bạn đang đến với phần cuối của loạt bài. Tại thời điểm này, chúng ta đã đặt nền móng cho plugin của chúng ta, viết plugin và định nghĩa và tìm hiểu không gian tên và autoload. Tất cả những gì còn lại là áp dụng những gì mà chúng ta đã học.

Vì vậy trong hướng dẫn này, chúng ta sẽ kết hợp tất cả lại với nhau. Cụ thể, chúng ta sẽ xem lại mã nguồn của plugin, tổ chức tất cả các lớp có liên quan theo không gian tên, và viết một autoload để chúng ta có thể xóa tất cả các câu lệnh include của chúng ta.

Tôi sẽ thảo luận chi tiết tất cả mọi thứ khi chúng ta làm việc trên code. Một lần nữa, nếu đây là hướng dẫn đầu tiên bạn đang đọc trong loạt bài này, hãy theo kịp với những gì mà chúng tôi đã đề cập đến và sau đó quay trở lại hướng dẫn này.

Trước khi Chúng ta Viết Bất kỳ Code nào

Tại thời điểm này, bạn chắc là đã nắm vững cách chúng ta thiết lập môi trường phát triển của chúng ta. Nhắc lại một chút, đây là phần tóm lược nhanh về những phần mềm mà chúng ta đang sử dụng:

  • ít nhất là PHP 5.6.20
  • máy chủ web Apache
  • một máy chủ cơ sở dữ liệu MySQL
  • WordPress 4.6.1
  • kiến thức về WordPress Plugin API

Bạn cũng sẽ cần mã nguồn của plugin mà chúng ta đang làm việc. Bạn có thể tải về một phiên bản của nó ngay tại đây. Giả sử nó đã được cài đặt, kích hoạt, và bạn đã có một IDE, chúng ta hãy bắt đầu.

Áp dụng Không gian tên

Nhắc lại hướng dẫn trước, tôi là một fan hâm mộ trong việc đảm bảo rằng không gian tên của chúng ta tuân theo cách tổ chức của các tập tin trên ổ đĩa. Nếu bạn nhìn vào cấu trúc thư mục của plugin hoặc nếu bạn đã theo dõi loạt bài cho đến lúc này, thì bạn sẽ thấy một vài thứ như sau:

The directory structure of our plugin

Lưu ý rằng, nếu bạn đã cài đặt plugin của bạn theo cách khác, thì cũng tốt thôi. Không gian tên của bạn có thể sẽ khác, nhưng điều đó không ảnh hưởng đến bất cứ điều gì được đề cập trong loạt bài này cả.

Sử dụng cấu trúc thư mục làm tham chiếu, chúng ta hãy đi qua tất cả các tập tin PHP tạo nên plugin của chúng ta và định nghĩa không gian tên của chúng. Thực hiện điều này rất dễ: Chỉ cần sử dụng từ khoá namespace và đặt tên đủ tiêu chuẩn ở đầu mỗi tập tin.

Tôi sẽ liệt kê từng cái ở dưới đây.

tutsplus-namespace-demo.php

class-meta-box.php

class-meta-box-display.php

interface-assets.php

class-css-loader.php

class-question-reader.php

Có một số thứ cần lưu ý về các quy ước mà tôi đã sử dụng ở trên:

  • Không gian tên gốc là Tutsplus_Namespace_Demo, tương ứng với tên thư mục của plugin.
  • Phần còn lại của không gian tên chẳng hạn như Tutsplus_Namespace_Demo\AdminTutsplus_Namespace_Demo\Admin\Util cũng tương đương với các thư mục tương ứng của chúng; Tuy nhiên, các tên thư mục được đặt ở dạng viết hoa chữ cái đầu (so với chữ thường).

Cuối cùng, nếu bạn thử làm mới lại trang hoặc thử điều hướng qua lại trên WordPress kể từ khi đưa ra các câu lệnh về không gian tên, thì rất có thể bạn sẽ thấy một lỗi trong console giống như sau:

PHP Errors when loading namespaced code

Và nó bao gồm thông báo sau:

PHP Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'tutsplus_namespace_demo' not found or invalid function name in /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php on line 524

Hoặc có thể nó hiển thị:

PHP Fatal error: Class 'Meta_Box' not found in /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php on line 48

Hoặc bạn có thể trông thấy bất kỳ số lượng các thông báo lỗi tương tự khác. Điều đó không sao cả. Nó bình thường thôi.

Nhưng câu hỏi đặt ra là: Điều gì xảy ra với plugin của chúng ta? May mắn thay, không có gì cả. Đây là hành vi như mong đợi.

Thông báo đầu tiên mà bạn nhìn thấy có thể là kết quả của một plugin khác mà bạn đã cài đặt. Tôi không thể mô phỏng lại nó; Tuy nhiên, khi tôi hủy kích hoạt một vài plugin khác mà tôi đang chạy, thì plugin tạo ra thông báo thứ hai (đó là thông báo mà tôi muốn minh hoạ).

Khi bạn áp dụng không gian tên, PHP kỳ vọng xác định vị trí một lớp bên trong một không gian tên nhất định. Về mặt khái niệm, bạn có thể hình dung các lớp của bạn bây giờ thuộc về gói của riêng nó (hoặc gói con) hoặc tuỳ theo cách bạn xác định nó. Và để cho một hàm truy cập vào một lớp trong một gói, nó cần phải nhận biết các các gói tồn tại.

Đây là nơi tính năng bổ sung của không gian tên và autoload phát huy tác dụng. Vì vậy, trước khi chúng ta cố gắng truy cập vào code của chúng ta thông qua không gian tên của chúng, thì chúng ta hãy làm việc trên một autoload.

Tất cả Xoay quanh Autoload

Viết một autoload sẽ đòi hỏi những thứ sau đây:

  1. hiểu rõ một hàm PHP có tên là spl_autoload_register
  2. viết một hàm mà sẽ tự động nạp các tập tin đã áp dụng không gian tên của chúng ta
  3. include hàm autoload tuỳ biến của chúng ta

Đừng để cái tên spl_autoload_register đe doạ bạn. Nó chỉ đơn giản có nghĩa đây là một hàm nằm trong "Thư viện PHP Tiêu chuẩn" và đó là cách chúng ta "đăng ký" hàm "autoload". Đó là một câu nói cửa miệng và rất nhiều ký tự để viết, nhưng nó chỉ là một hàm mà chúng ta sẽ sử dụng để nói với PHP cách để phân tích không gian tên và tên lớp và nơi nó có thể tìm thấy các tập tin của chúng ta.

Hàm này là những gì cho phép chúng ta viết code riêng của chúng ta cho các tập tin autoload và sau đó hook hàm đã nói vào PHP. Nghĩa là, chúng ta sẽ nói cho PHP nơi để tìm các tập tin của chúng ta và cách phân tích không gian tên, tên tập tin, vân vân, để nó include các tập tin.

Với tất cả những điều đã nói, chúng ta đã sẵn sàng để thật sự viết một autoload.

Viết một Autoload

Khi viết một autoload, điều cần ghi nhớ là cách các tập tin của chúng ta được tổ chức. Nghĩa là, chúng ta muốn biết cách để ánh xạ không gian tên vào thư mục của chúng ta.

Trong ví dụ mà chúng ta đang sử dụng, nó đơn giản: Các không gian tên là các phiên bản được viết hoa ký tự đầu của cấu trúc thư mục. Điều này không phải lúc nào cũng đúng cho các dự án khác; tuy nhiên, đó là một lý do khác lý giải tại sao tôi muốn tổ chức hợp lý các tập tin của tôi dựa trên vị trí thật của chúng.

Khi PHP cố gắng nạp một lớp, autoload của chúng ta sẽ cần phải làm như sau:

  1. Phân tách không gian tên dựa trên dấu gạch chéo.
  2. Phân tách gói và các gói con dựa trên dấu gạch dưới và thay thế bằng dấu gạch nối (nếu cần).
  3. Biết cách ánh xạ tên lớp, giao diện, và vân vân thành tên tập tin.
  4. Tạo một chuỗi đại diện cho tên tập tin dựa trên các thông tin ở trên.
  5. Bao gồm một tập tin.

Với tất cả những điều đó đã được thực hiện xong, chúng ta đã có được mọi thứ thích hợp cho chúng ta. Trong thư mục plugin, hãy tạo một thư mục con đặt tên là inc, và trong thư mục inc tạo một tập tin có tên là autoload.php.

Trong tập tin đó, hãy tiếp tục và trích ra hàm mà chúng ta sẽ sử dụng để autoload các tập tin của chúng ta. Nó sẽ trông giống như sau:

Rõ ràng, điều này vẫn chưa thực hiện bất cứ điều gì cả.

Một Lưu ý Ngoài lề Trong việc  Viết một Autoload

Lưu ý rằng tôi sẽ viết code và chú thích để giải thích một cách đầy đủ những gì chúng ta đang làm. Nếu bạn tự liều mình làm điều này lần đầu tiên, thì việc viết một autoload cùng với việc sử dụng không gian tên và làm việc với các tập tin có thể làm bạn thấy nản. Đây là nơi một trình sửa lỗi và sử dụng các tập tin log (nhật ký) trở nên có ích.

Điều này vượt ra ngoài phạm vi của hướng dẫn này, nhưng hãy biết rằng, viết một autoload không phải là điều mà bạn có thể làm đúng ngay lần đầu tiên bạn thực hiện nó.

Hoàn tất Autoload

Hãy bắt đầu thêm một số chức năng cho các bước được liệt kê lúc bắt đầu phần này.

Trước tiên, chúng ta cần phải thiết lập một vòng lặp mà sẽ lặp ngược qua các phần của tên tập tin được truyền vào hàm autoload. Chúng ta làm điều này là bởi vì nó giúp dễ dàng hơn để xây dựng một đường dẫn đến tập tin để autoload.

Sau điều này, chúng ta cần phải tìm kiếm tập tin $file_parts và thay thế tất cả các lần xuất hiện của dấu gạch dưới bằng một dấu gạch nối bởi vì tất cả các tên lớp và giao diện của chúng ta sử dụng dấu gạch dưới trong khi tên tập tin của chúng ta sử dụng dấu gạch nối.

Hai dòng sau đây là hai dòng đầu tiên bên trong vòng lặp mà chúng ta đã trích ra ở trên:

Tiếp theo, chúng ta sẽ cần một điều kiện để thực hiện một vài thứ.

  1. Nó cần phải kiểm tra để xem phân đoạn nào của đường dẫn của tên tập tin mà chúng ta đang đọc.
  2. Nếu chúng ta đang ở phân đoạn đầu tiên, thì chúng ta đang ở tại tên tập tin; Nếu không, chúng ta đang ở trong không gian tên của nó.
  3. Tiếp theo, nếu chúng ta đang đọc phân đoạn đầu tiên, chúng ta cần phải xác định xem chúng ta đang cố autoload một giao diện hay chúng ta đang nạp một lớp.
  4. Nếu đó là giao diện, thì chúng ta cần phải điều chỉnh tên của giao diện để chúng ta nạp nó một cách hợp lý dựa trên tên tập tin của nó; nếu không, chúng ta sẽ nạp lớp dựa trên giá trị trong biến $current.

Đọc ra thì rất nhiều, nhưng nó không đến nỗi quá phức tạp. Hãy xem các chú thích code dưới đây:

Xong những cái đó, đến lúc tạo một đường dẫn đủ điều kiện đến tập tin. May mắn thay, điều này cơ bản hơn việc nối chuỗi một chút:

Cuối cùng, chúng ta cần phải chắc chắn rằng tập tin có tồn tại. Nếu không, chúng ta sẽ hiển thị một thông báo lỗi tiêu chuẩn của WordPress:

Và tại thời điểm này, chúng ta có một autoload đầy đủ (có thể được tải về bằng liên kết trong thanh sidebar của bài viết này vì mã nguồn quá dài để có thể đăng ở trong hướng dẫn).

Cuối cùng, điều quan trọng cần lưu ý là hàm đặc biệt này có thể (hoặc nên) được viết lại như là một lớp. Hơn nữa, lớp này nên bao gồm một số hàm nhỏ hơn để dễ kiểm thử, chịu trách nhiệm thực hiện một nhiệm vụ duy nhất, và rõ ràng hơn những gì ở trên. Có lẽ trong một hướng dẫn khác, tôi sẽ khái quát quá trình đó sẽ như thế nào.

Nhưng Chúng ta Vẫn đang Include các Tập tin

Nếu bạn nhìn vào gần phía trên của tập tin chính của plugin (hoặc tập tin mà chúng ta thường gọi là tập tin khởi động), bạn sẽ thấy một số câu lệnh include như sau:

Với công việc mà chúng ta đã thực hiện cho đến lúc này, cuối cùng chúng ta cũng có thể loại bỏ các câu lệnh này và thay thế chúng bằng một cái duy nhất:

Hay nói đúng hơn, chúng ta đang thay thế nó bằng autoload của chúng ta. Tại thời điểm này, chúng ta chắc đã hoàn tất plugin của chúng ta.

Tổng hợp

Bây giờ thì chúng ta đã áp dụng không gian tên cho code của chúng ta để cung cấp một cách tổ chức hợp lý các lớp có liên quan, và viết một autoload để tự động include các tập tin dựa trên không gian tên và vị trí của từng lớp, chúng ta có thể khởi động plugin của chúng ta và nó hoạt động hoàn toàn giống với phiên bản đầu tiên.

Điều cuối cùng mà chúng ta cần làm là đảm bảo rằng chúng ta cập nhật tập tin khởi động để chúng ta hướng dẫn PHP sử dụng không gian tên cho Meta_Box, Meta_Box_Display, Question_ReaderCSS_Loader.

Lưu ý trong đoạn code ở trên, chúng ta đang sử dụng từ khóa use của PHP, và chúng ta đang thêm tiền tố vào tên lớp của chúng ta bằng các gói con trực tiếp. Bạn có thể đọc thêm về use trong hướng dẫn sử dụng, nhưng một cách ngắn gọn nó là:

Từ khóa use phải được khai báo ở phạm vi ngoài cùng của một tập tin (phạm vi toàn cục) hoặc bên trong các khai báo không gian tên. Điều này là do việc import được thực hiện lúc biên dịch mà không phải là lúc chạy, vì vậy nó không thể bị khoá phạm vi.

Với tất cả những điều đó và giả sử mọi thứ đều hoạt động một cách chính xác, thì bạn sẽ có thể điều hướng đến trang Add New Post (hoặc Edit Post), xem meta-box của chúng ta và nhìn thấy một câu hỏi nhắc nhở ở phía trên cùng của thanh sidebar:

The meta box prompting users for inspiration

Nếu vậy, thì xin chúc mừng. Bạn đã xây dựng thành công plugin của bạn để áp dụng không gian tên và autoload. Nếu không, hãy kiểm tra lại code của bạn với code mà chúng tôi đã chia sẻ ở đây, xem lại nhật ký (log) lỗi của bạn và đảm bảo rằng không có gì khác thường hiển thị trên màn hình chính của WordPress.

Nếu bạn thật sự thấy một cái gì đó, cá là nó có liên quan đến một thứ gì đó không đáng kể. Hãy xem lại code mà chúng ta đã thảo luận, so sánh code này với nội dung tập tin đính kèm trong bài viết này (trong thanh side cùng với nút màu xanh lớn) và xem bạn có thể thu hẹp được vấn đề hay không.

Tóm tắt

Tại thời điểm này, chúng ta đã đi đến phần kết thúc của loạt bài này. Xuyên suốt bốn hướng dẫn, chúng ta đã đề cập đến rất nhiều vấn đề:

  • Chúng ta đã xây dựng một plugin nhắc người dùng bằng các câu hỏi để giúp họ bắt đầu viết blog.
  • Chúng ta đã sử dụng các hàm PHP để đọc các tập tin từ hệ thống và kết xuất nó lên trên màn hình.
  • Chúng ta đã định nghĩa không gian tên và autoload, và tìm hiểu cách chúng có thể được áp dụng.
  • Chúng ta đã tổ chức code và viết autoload của chúng ta, làm cho code dễ đọc, được tổ chức tốt và ít lộn xộn hơn.

Cuối cùng, rất nhiều kiến thức được đề cập trong loạt bài này có thể được sử dụng trong các dự án hiện tại và tương lai mà bạn có thể làm việc.

Hãy nhớ rằng, bạn cũng có thể tìm thấy các sản phẩm khác liên quan đến WordPress trên Market của chúng tôi. Và nếu bạn muốn tìm hiểu thêm về việc phát triển các giải pháp cho WordPress, thì bạn có thể tìm thấy tất cả các hướng dẫn và loạt bài viết trên trang tiểu sử của tôi. Đừng ngần ngại theo dõi tôi trên blog hoặc trên Twitter của tôi vì tôi thảo luận về phát triển phần mềm trong ngữ cảnh của WordPress hầu như hàng ngày.

Và hãy nhớ rằng, liên kết để tải mã nguồn hoàn chỉnh là trong thanh sidebar, trong nút có tiêu đề Download Attachment. Tất nhiên, đừng ngần ngại đặt bất kỳ câu hỏi nào và đưa ra ý kiến của bạn!

Nguồn tài nguyên

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.