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

4 χρόνια πριν Από το David Grudl  

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

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

  • IDE να συμπληρώνει σωστά την αυτόματη συμπλήρωση
  • στατική ανάλυση για τον εντοπισμό σφαλμάτων

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

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

Θα περάσουμε τα δεδομένα στο πρότυπο ως αντικείμενο μιας κλάσης που ορίζει όλες τις μεταβλητές και τους τύπους τους. Χρησιμοποιώντας τα νέα χαρακτηριστικά της 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,
));

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

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

{templateType MailTemplate}

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

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

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

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

Επίσης, ο τύπος μπορεί να καθοριστεί στο {var}, {default} ή {define}:

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

Σημείωση: για ιστορικούς λόγους, ήταν δυνατό να γράφονται μεταβλητές στις ετικέτες {var} και {default} χωρίς το σύμβολο του δολαρίου στην αρχή. Επειδή αυτό δημιουργεί ασάφεια ως προς το αν πρόκειται για τύπο ή μεταβλητή, αυτή η σύνταξη έχει ξεπεραστεί και το Latte θα σας προειδοποιεί όταν τη χρησιμοποιείτε.

Πώς απλοποιείτε τη δουλειά σας;

Πώς να γράψετε μια κλάση προτύπου ή το {varType} όσο το δυνατόν πιο εύκολα; Δημιουργήστε τα. Αυτό ακριβώς κάνει το ζεύγος ετικετών {templatePrint} και {varPrint}.

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

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

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

Συμπλήρωση κώδικα IDE

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

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

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

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

Τελευταίες θέσεις