RobotLoader: Αυτόματη φόρτωση κλάσης

Το RobotLoader είναι ένα εργαλείο που σας δίνει την άνεση της αυτοματοποιημένης φόρτωσης κλάσεων για ολόκληρη την εφαρμογή σας, συμπεριλαμβανομένων των βιβλιοθηκών τρίτων κατασκευαστών.

  • Εξαλείψτε όλες τις δηλώσεις require
  • Θα φορτώνονται μόνο τα απαραίτητα σενάρια
  • Δεν απαιτεί αυστηρές συμβάσεις ονοματοδοσίας για καταλόγους ή αρχεία
  • Εξαιρετικά γρήγορο
  • Καμία χειροκίνητη ενημέρωση της προσωρινής μνήμης, όλα εκτελούνται αυτόματα
  • Ώριμη, σταθερή και ευρέως χρησιμοποιούμενη βιβλιοθήκη

Έτσι, μπορούμε να ξεχάσουμε αυτά τα γνωστά μπλοκ κώδικα:

require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
//...

Εγκατάσταση

Μπορείτε να κατεβάσετε το RobotLoader ως ένα μεμονωμένο αρχείο RobotLoader.php, το οποίο θα συμπεριλάβετε χρησιμοποιώντας το require στο σενάριό σας και θα απολαύσετε αμέσως άνετη αυτόματη φόρτωση για ολόκληρη την εφαρμογή.

require '/path/to/RobotLoader.php';

$loader = new Nette\Loaders\RobotLoader;
//...

Αν κατασκευάζετε μια εφαρμογή χρησιμοποιώντας το Composer, μπορείτε να το εγκαταστήσετε μέσω:

composer require nette/robot-loader

Χρήση

Παρόμοια με τον τρόπο με τον οποίο το ρομπότ της Google ανιχνεύει και ευρετηριάζει ιστοσελίδες, ο RobotLoader περνάει από όλα τα σενάρια PHP και σημειώνει ποιες κλάσεις, διεπαφές, γνωρίσματα και enums βρήκε. Στη συνέχεια αποθηκεύει τα αποτελέσματα στην κρυφή μνήμη για χρήση σε επόμενες αιτήσεις. Απλά πρέπει να καθορίσετε ποιους καταλόγους θα πρέπει να περάσει και πού θα αποθηκεύσει την κρυφή μνήμη:

$loader = new Nette\Loaders\RobotLoader;

// Κατάλογοι για τον RobotLoader για ευρετηρίαση (συμπεριλαμβανομένων των υποκαταλόγων)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// Ορίστε την προσωρινή αποθήκευση στον κατάλογο 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Ενεργοποίηση του RobotLoader

Και αυτό είναι όλο, από εδώ και πέρα, δεν χρειάζεται να χρησιμοποιήσουμε το require. Φοβερό!

Εάν το RobotLoader συναντήσει ένα διπλότυπο όνομα κλάσης κατά τη διάρκεια της ευρετηρίασης, θα πετάξει μια εξαίρεση και θα σας ειδοποιήσει. Ο RobotLoader ενημερώνει επίσης αυτόματα την κρυφή μνήμη όταν χρειάζεται να φορτώσει μια άγνωστη κλάση. Συνιστούμε να το απενεργοποιήσετε αυτό στους διακομιστές παραγωγής, δείτε την ενότητα Caching.

Αν θέλετε το RobotLoader να παραλείπει ορισμένους καταλόγους, χρησιμοποιήστε το $loader->excludeDirectory('temp') (μπορεί να κληθεί πολλές φορές ή να περάσει πολλούς καταλόγους).

Από προεπιλογή, το RobotLoader αναφέρει σφάλματα σε αρχεία PHP πετώντας μια εξαίρεση ParseError. Αυτό μπορεί να καταστραφεί με τη χρήση του $loader->reportParseErrors(false).

Εφαρμογή Nette

Μέσα στην εφαρμογή Nette, όπου το $configurator χρησιμοποιείται στο Bootstrap.php, μπορείτε να ρυθμίσετε το RobotLoader με αυτόν τον τρόπο:

$configurator = new Nette\Bootstrap\Configurator;
//...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->addDirectory(__DIR__ . '/../libs')
	->register();

Αναλυτής αρχείων PHP

Το RobotLoader μπορεί επίσης να χρησιμοποιηθεί καθαρά για την εύρεση κλάσεων, διεπαφών, χαρακτηριστικών και enums σε αρχεία PHP χωρίς τη χρήση της λειτουργίας αυτόματης φόρτωσης:

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');

// Σαρώνει καταλόγους για κλάσεις/διεπαφές/traits/enums
$loader->rebuild();

// Επιστρέφει έναν πίνακα από ζεύγη κλάσεων => ονόματα αρχείων
$res = $loader->getIndexedClasses();

Ακόμα και με μια τέτοια χρήση, μπορείτε να χρησιμοποιήσετε την προσωρινή αποθήκευση. Αυτό διασφαλίζει ότι τα αμετάβλητα αρχεία δεν θα σαρωθούν εκ νέου:

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');

// Ορίστε την προσωρινή αποθήκευση στον κατάλογο 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');

// Σαρώνει καταλόγους χρησιμοποιώντας την κρυφή μνήμη
$loader->refresh();

// Επιστρέφει έναν πίνακα από ζεύγη κλάσης => όνομα αρχείου
$res = $loader->getIndexedClasses();

Caching

Το RobotLoader είναι πολύ γρήγορο επειδή χρησιμοποιεί έξυπνα την προσωρινή αποθήκευση.

Κατά τη διάρκεια της ανάπτυξης, δύσκολα θα παρατηρήσετε ότι εκτελείται στο παρασκήνιο. Ενημερώνει συνεχώς την κρυφή μνήμη του, λαμβάνοντας υπόψη ότι κλάσεις και αρχεία μπορούν να δημιουργηθούν, να διαγραφούν, να μετονομαστούν κ.λπ. Και δεν πραγματοποιεί εκ νέου σάρωση αμετάβλητων αρχείων.

Σε έναν διακομιστή παραγωγής, από την άλλη πλευρά, συνιστούμε να απενεργοποιήσετε τις ενημερώσεις της προσωρινής μνήμης με τη χρήση του $loader->setAutoRefresh(false) (σε μια εφαρμογή Nette, αυτό συμβαίνει αυτόματα), επειδή τα αρχεία δεν αλλάζουν. Ταυτόχρονα, είναι απαραίτητο να καθαρίσετε την προσωρινή μνήμη cache όταν ανεβάζετε μια νέα έκδοση στη φιλοξενία.

Η αρχική σάρωση των αρχείων, όταν η κρυφή μνήμη δεν υπάρχει ακόμα, μπορεί φυσικά να πάρει λίγο χρόνο για μεγαλύτερες εφαρμογές. Το RobotLoader έχει ενσωματωμένη πρόληψη κατά της αδημονία της cache. Πρόκειται για μια κατάσταση όπου ένας μεγάλος αριθμός ταυτόχρονων αιτήσεων σε έναν διακομιστή παραγωγής θα ενεργοποιούσε το RobotLoader και, εφόσον η προσωρινή μνήμη δεν υπάρχει ακόμη, θα άρχιζαν όλες να σαρώνουν αρχεία, γεγονός που θα υπερφόρτωνε τον διακομιστή. Ευτυχώς, το RobotLoader λειτουργεί με τέτοιο τρόπο ώστε μόνο το πρώτο νήμα να ευρετηριάζει τα αρχεία, να δημιουργεί την κρυφή μνήμη και τα υπόλοιπα να περιμένουν και στη συνέχεια να χρησιμοποιούν την κρυφή μνήμη.

PSR-4

Σήμερα, μπορείτε να χρησιμοποιήσετε το Composer για αυτόματη φόρτωση τηρώντας το PSR-4. Με απλά λόγια, πρόκειται για ένα σύστημα όπου τα namespaces και τα ονόματα των κλάσεων αντιστοιχούν στη δομή των καταλόγων και τα ονόματα των αρχείων, π.χ. το App\Router\RouterFactory θα βρίσκεται στο αρχείο /path/to/App/Router/RouterFactory.php.

Το RobotLoader δεν δεσμεύεται από καμία σταθερή δομή, οπότε είναι χρήσιμο σε περιπτώσεις όπου δεν θέλετε να έχετε τη δομή καταλόγου σχεδιασμένη ακριβώς όπως τα namespaces της PHP, ή όταν αναπτύσσετε μια εφαρμογή που ιστορικά δεν χρησιμοποιεί τέτοιες συμβάσεις. Είναι επίσης δυνατό να χρησιμοποιήσετε και τους δύο φορτωτές μαζί.

έκδοση: 4.0