Latte: πώς να χρησιμοποιήσετε το σύστημα τύπων;

πριν από 5 χρόνια Από David Grudl  

Σύστημα τύπων. Ένα βασικό ζήτημα για την ανάπτυξη στιβαρών εφαρμογών, στο οποίο η PHP έχει αποκτήσει μεγάλο προβάδισμα έναντι δυναμικών γλωσσών όπως η Python, η Ruby ή η JavaScript. Το Nette Framework καθοδηγεί τους προγραμματιστές προς τον τυποποιημένο και αυστηρό προγραμματισμό από την αρχή. Το Latte 2.7 έφερε υποστήριξη τύπων και στα templates.

Γνωρίζοντας τον τύπο δεδομένων ή αντικειμένου σε κάθε μεταβλητή, μπορούμε:

  • Το IDE να παρέχει σωστή αυτόματη συμπλήρωση
  • Η στατική ανάλυση να εντοπίζει σφάλματα

Δύο σημεία που βελτιώνουν θεμελιωδώς την ποιότητα και την ευκολία της ανάπτυξης.

Πώς να δηλώσετε τύπους στην πλευρά της PHP;

Θα περάσουμε δεδομένα στο template ως αντικείμενο μιας κλάσης που ορίζει όλες τις μεταβλητές και τους τύπους τους. Χρησιμοποιώντας τα νέα χαρακτηριστικά της PHP 7.4, θα μπορούσε να μοιάζει κάπως έτσι:

class MailTemplate
{
	public string $lang = 'cs';
	public Address $address;
	public string $subject;
	public ?float $price = null;
}

Χρήση:

$template = new MailTemplate;
$template->price = $this->getPrice();
...
$latte->render('mail.latte', $template);

Ενημέρωση: χάρη στα νέα χαρακτηριστικά της PHP 8, το παράδειγμα μπορεί να γραφτεί ακόμα πιο ενδιαφέροντα ως εξής:

class MailTemplate
{
	public function __construct(
		public string $lang = 'cs',
		public Address $address,
		public string $subject,
		public ?float $price = null,
	) {}
}

$latte->render('mail.latte', new MailTemplate(
	lang: $this->lang,
	subject: $title,
	price: $this->getPrice(),
	address: $userAddress,
));

Πώς να δηλώσετε τύπους στο template;

Μπορούμε τώρα να συνδέσουμε την παραπάνω κλάση με το template. Αρκεί να το δηλώσουμε στην αρχή:

{templateType MailTemplate}

Και με αυτό, ορίσαμε ότι το template θα έχει τέσσερις μεταβλητές $lang, $address, $subject και $price συμπεριλαμβανομένων των αντίστοιχων τύπων τους.

Μια εναλλακτική είναι να ορίσουμε τους τύπους των μεμονωμένων μεταβλητών απευθείας στο template, δηλαδή χωρίς να δημιουργήσουμε μια κλάση. Για αυτό χρησιμοποιείται το tag {varType}:

{varType string $lang}
{varType Address $address}

Φυσικά, και τα δύο μπορούν να συνδυαστούν. Δημιουργήστε μια κλάση, καθώς αυτό διασφαλίζει την αυτόματη συμπλήρωση στην πλευρά του presenter, συνδέστε την με το template χρησιμοποιώντας το {templateType} και χρησιμοποιήστε το {varType} για άλλες τοπικές μεταβλητές σε μπλοκ κ.λπ. Μπορούμε να το θεωρήσουμε ως ανάλογο του /** @var type $variable */, το οποίο είναι ένα σχόλιο που μερικές φορές χρησιμοποιούμε στον κώδικα PHP για να καθοδηγήσουμε το IDE ή τον στατικό αναλυτή.

Ο τύπος μπορεί τώρα να δηλωθεί και στα tags {var}, {default} ή {define}:

{var Model\Page $page = $items['page']}
{define form, string $name}
	...
{/define}

Σημείωση: για ιστορικούς λόγους, ήταν δυνατό να γράφονται μεταβλητές στα tags {var} και {default} χωρίς το αρχικό σύμβολο του δολαρίου (και με βέλος αντί για ίσον). Επειδή αυτό δημιουργεί αμφισημία ως προς το αν πρόκειται για τύπο ή μεταβλητή, αυτή η σύνταξη είναι απαγορευμένη και το Latte θα σας προειδοποιήσει αν τη χρησιμοποιήσετε. Ένας απλός τρόπος για να ελέγξετε τα templates σας για αυτήν την παλιά σύνταξη είναι να αναζητήσετε τις κανονικές εκφράσεις /\{(var|default) [^$]/ και /\{(var|default) [^}]*=>/.

Πώς να εξοικονομήσετε δουλειά;

Ποιος είναι ο ευκολότερος τρόπος για να γράψετε μια κλάση template ή τα tags {varType}; Αφήστε τα να δημιουργηθούν αυτόματα. Γι' αυτό ακριβώς υπάρχουν τα δύο tags {templatePrint} και {varPrint}.

Αν τοποθετήσετε ένα από αυτά τα tags σε ένα template, αντί για την κανονική απόδοση, θα εμφανιστεί μια πρόταση κώδικα για την κλάση ή μια λίστα με τα tags {varPrint} αντίστοιχα. Στη συνέχεια, μπορείτε απλά να επιλέξετε τον κώδικα με ένα κλικ και να τον αντιγράψετε στο έργο σας.

Το nette/application 3.1 (σε έκδοση beta) περιλαμβάνει ένα υπερφορτωμένο tag {templatePrint} που παράγει κώδικα καλύτερα προσαρμοσμένο για presenters.

Το tag {varPrint} εμφανίζει τοπικές μεταβλητές που δεν είναι παράμετροι του template. Αν θέλετε να εμφανίσετε όλες τις μεταβλητές, χρησιμοποιήστε το {varPrint all}.

Αυτόματη συμπλήρωση στο IDE

Η τελευταία έκδοση του Latte plugin για το PhpStorm μπορεί να χρησιμοποιήσει τα παραπάνω tags και στη συνέχεια να παρέχει αυτόματη συμπλήρωση βάσει τύπων. Το plugin γνωρίζει επίσης τους τύπους των τυπικών μεταβλητών όπως $user, $presenter, $basePath κ.λπ.

Στατική ανάλυση

Ο στόχος είναι όλοι οι δηλωμένοι τύποι να μπορούν να χρησιμοποιηθούν και για στατική ανάλυση. Για παράδειγμα, ώστε με τη χρήση του PHPStan να είναι δυνατός ο έλεγχος των templates τόσο εύκολα όσο και άλλων αρχείων PHP.

Δουλεύουμε πάνω σε αυτό και θα το δείτε σε κάποια από τις επόμενες εκδόσεις του Latte.

Πρόσφατες δημοσιεύσεις