Δημιουργία προσαρμοσμένων συναρτήσεων
Προσθέστε εύκολα προσαρμοσμένες βοηθητικές συναρτήσεις στα πρότυπα Latte. Καλέστε λογική PHP απευθείας στις εκφράσεις για υπολογισμούς, πρόσβαση σε υπηρεσίες ή δημιουργία δυναμικού περιεχομένου, διατηρώντας τα πρότυπά σας καθαρά και ισχυρά.
Τι είναι οι συναρτήσεις;
Οι συναρτήσεις στο Latte σας επιτρέπουν να επεκτείνετε το σύνολο των
συναρτήσεων που μπορούν να κληθούν εντός των εκφράσεων στα πρότυπα
({...}
). Μπορείτε να τις φανταστείτε ως προσαρμοσμένες
συναρτήσεις PHP διαθέσιμες μόνο εντός των προτύπων σας Latte. Αυτό
φέρνει πολλά πλεονεκτήματα:
Ευκολία: Μπορείτε να ορίσετε βοηθητική λογική (όπως υπολογισμούς,
μορφοποίηση ή πρόσβαση σε δεδομένα εφαρμογής) και να την καλέσετε
χρησιμοποιώντας απλή, οικεία σύνταξη συναρτήσεων απευθείας στο
πρότυπο, ακριβώς όπως θα καλούσατε το strlen()
ή το date()
στην PHP.
{var $userInitials = initials($userName)} {* π.χ. 'J. D.' *}
{if hasPermission('article', 'edit')}
<a href="...">Επεξεργασία</a>
{/if}
Χωρίς ρύπανση του καθολικού χώρου: Σε αντίθεση με τον ορισμό μιας πραγματικής καθολικής συνάρτησης στην PHP, οι συναρτήσεις Latte υπάρχουν μόνο στο πλαίσιο της απόδοσης του προτύπου. Δεν χρειάζεται να επιβαρύνετε τον καθολικό χώρο ονομάτων της PHP με βοηθητικά προγράμματα που είναι ειδικά μόνο για πρότυπα.
Ενσωμάτωση με τη λογική της εφαρμογής: Το PHP callable πίσω από μια
συνάρτηση Latte μπορεί να είναι οτιδήποτε – μια ανώνυμη συνάρτηση, μια
στατική μέθοδος ή μια μέθοδος στιγμιότυπου. Αυτό σημαίνει ότι οι
συναρτήσεις σας στα πρότυπα μπορούν εύκολα να έχουν πρόσβαση σε
υπηρεσίες της εφαρμογής, βάσεις δεδομένων, διαμόρφωση ή οποιαδήποτε
άλλη απαραίτητη λογική συλλαμβάνοντας μεταβλητές (στην περίπτωση
ανώνυμων συναρτήσεων) ή χρησιμοποιώντας dependency injection (στην περίπτωση
αντικειμένων). Το παραπάνω παράδειγμα hasPermission
το δείχνει σαφώς,
όταν πιθανώς καλεί στο παρασκήνιο μια υπηρεσία εξουσιοδότησης.
Υπερκάλυψη εγγενών συναρτήσεων (προαιρετικά): Μπορείτε ακόμη και
να ορίσετε μια συνάρτηση Latte με το ίδιο όνομα με μια εγγενή συνάρτηση PHP.
Στο πρότυπο, αντί για την αρχική συνάρτηση, θα κληθεί η δική σας έκδοση.
Αυτό μπορεί να είναι χρήσιμο για την παροχή συμπεριφοράς ειδικής για
το πρότυπο ή για τη διασφάλιση συνεπής επεξεργασίας (π.χ. διασφάλιση
ότι το strlen
είναι πάντα ασφαλές για πολλαπλά byte). Χρησιμοποιήστε
αυτή τη δυνατότητα με προσοχή για να αποφύγετε παρεξηγήσεις.
Από προεπιλογή, το Latte επιτρέπει την κλήση όλων των εγγενών συναρτήσεων PHP (εκτός εάν περιορίζονται από το Sandbox). Οι προσαρμοσμένες συναρτήσεις επεκτείνουν αυτήν την ενσωματωμένη βιβλιοθήκη με τις συγκεκριμένες ανάγκες του έργου σας.
Εάν απλώς μετασχηματίζετε μια μοναδική τιμή, μπορεί να είναι πιο κατάλληλο να χρησιμοποιήσετε ένα προσαρμοσμένο φίλτρο.
Δημιουργία και καταχώριση συναρτήσεων
Παρόμοια με τα φίλτρα, υπάρχουν διάφοροι τρόποι για να ορίσετε και να καταχωρήσετε προσαρμοσμένες συναρτήσεις.
Άμεση καταχώριση μέσω addFunction()
Η απλούστερη μέθοδος είναι η χρήση του addFunction()
στο αντικείμενο
Latte\Engine
. Καθορίζετε το όνομα της συνάρτησης (όπως θα εμφανίζεται
στο πρότυπο) και το αντίστοιχο PHP callable.
$latte = new Latte\Engine;
// Απλή βοηθητική συνάρτηση
$latte->addFunction('initials', function (string $name): string {
preg_match_all('#\b\w#u', $name, $m);
return implode('. ', $m[0]) . '.';
});
Χρήση στο πρότυπο:
{var $userInitials = initials($userName)}
Τα ορίσματα της συνάρτησης στο πρότυπο περνούν απευθείας στο PHP callable
με την ίδια σειρά. Οι λειτουργίες της PHP όπως type hints, προεπιλεγμένες
τιμές και μεταβλητές παράμετροι (...
) λειτουργούν όπως
αναμένεται.
Καταχώριση μέσω επέκτασης
Για καλύτερη οργάνωση και επαναχρησιμοποίηση, καταχωρήστε συναρτήσεις εντός μιας επέκτασης Latte. Αυτή η προσέγγιση συνιστάται για πιο σύνθετες εφαρμογές ή κοινόχρηστες βιβλιοθήκες.
namespace App\Latte;
use Latte\Extension;
use Nette\Security\Authorizator;
class MyLatteExtension extends Extension
{
public function __construct(
// Υποθέτουμε ότι υπάρχει η υπηρεσία Authorizator
private Authorizator $authorizator,
) {
}
public function getFunctions(): array
{
// Καταχώριση μεθόδων ως συναρτήσεων Latte
return [
'hasPermission' => $this->hasPermission(...),
];
}
public function hasPermission(string $resource, string $action): bool
{
return $this->authorizator->isAllowed($resource, $action);
}
}
// Καταχώριση (υποθέτουμε ότι το $container περιέχει DIC)
$extension = $container->getByType(App\Latte\MyLatteExtension::class);
$latte = new Latte\Engine;
$latte->addExtension($extension);
Αυτή η προσέγγιση δείχνει παραστατικά πώς οι συναρτήσεις που ορίζονται στο Latte μπορούν να υποστηρίζονται από μεθόδους αντικειμένων, οι οποίες μπορούν να έχουν τις δικές τους εξαρτήσεις που διαχειρίζονται από τον container dependency injection της εφαρμογής σας ή από ένα factory. Αυτό διατηρεί τη λογική των προτύπων σας συνδεδεμένη με τον πυρήνα της εφαρμογής, διατηρώντας παράλληλα σαφή οργάνωση.
Συναρτήσεις που χρησιμοποιούν μια κλάση με attributes
Όπως και τα φίλτρα, οι συναρτήσεις μπορούν να οριστούν ως μέθοδοι
στην κλάση παραμέτρων του
προτύπου σας χρησιμοποιώντας το attribute #[Latte\Attributes\TemplateFunction]
.
use Latte\Attributes\TemplateFunction;
class TemplateParameters
{
public function __construct(
public string $userName,
// άλλες παράμετροι...
) {}
// Αυτή η μέθοδος θα είναι διαθέσιμη ως {initials(...)} στο πρότυπο
#[TemplateFunction]
public function initials(string $name): string
{
preg_match_all('#\b\w#u', $name, $m);
return implode('. ', $m[0]) . '.';
}
}
// Πέρασμα του αντικειμένου στο πρότυπο
$params = new TemplateParameters(userName: 'John Doe', /* ... */);
$latte->render('template.latte', $params);
Το Latte ανακαλύπτει και καταχωρεί αυτόματα τις μεθόδους που επισημαίνονται με αυτό το attribute, όταν το αντικείμενο παραμέτρων περνιέται στο πρότυπο. Το όνομα της συνάρτησης στο πρότυπο αντιστοιχεί στο όνομα της μεθόδου.
{* Χρήση της συνάρτησης που ορίζεται στην κλάση παραμέτρων *}
{var $inits = initials($userName)}
Συναρτήσεις περιβάλλοντος;
Σε αντίθεση με τα φίλτρα, δεν υπάρχει άμεση έννοια “συναρτήσεων
περιβάλλοντος” που θα λάμβαναν ένα αντικείμενο παρόμοιο με το
FilterInfo
. Οι συναρτήσεις λειτουργούν εντός εκφράσεων και τυπικά
δεν χρειάζονται άμεση πρόσβαση στο περιβάλλον απόδοσης ή σε
πληροφορίες τύπου περιεχομένου με τον ίδιο τρόπο που κάνουν τα φίλτρα
που εφαρμόζονται σε μπλοκ.