Κατηγορία: php

  • Με προσοχή το hydrate σε queries με joins

    Με προσοχή το hydrate σε queries με joins

    Το laravel είναι ωραιότατο! Βάζει μια τάξη στην άναρχη PHP, της δίνει έναν αέρα από ASP.NET με MVC, χωρίς όμως το γνωστό βαρύ περίβλημα. Παραμένουμε δηλαδή στην PHP, γιατί είναι γρήγορη και δυναμική, δομώντας την όμως καθαρά και σωστά άλα laravel. Αυτά όμως τα ξέρετε και δεν είναι επί του παρόντος. Θα ξέρετε ακόμα και ότι το laravel είναι αυτό που είναι χάρη στο eloquent, το συμπαθητικό ORM, της ίδιας ακριβώς ιδιοσυγκρασίας με το laravel. Έχει όμως και τα τερτίπια του. Και ειδικά όταν η ΒΔ μεγαλώνει, τα πράγματα περιπλέκουν, τα queries απαιτούν πολλά join και το eloquent στενάζει. Ή πιο σωστά ο προγραμματιστής στενάζει προσπαθώντας να απεικονίσει με eloquent αυτό που τόσα χρόνια έκανε με τρεις γραμμές sql. Και γιατί όχι λέει ο Τaylor! Γράψτο όπως ξέρεις και ενυδάτωσέ το!

    Λογοπαίγνιο για το hydrate ήταν αυτό, ένα παράδειγμα πάντα βοηθάει:

    $result = \DB::table('users')->take(2)->get();
    $users = \App\User::hydrate($result); 
    

    Και για τα πιο hardcore τυπάκια, χωρίς table, με ξερό select:

    $result = \DB::select('select * from users limit 2 ')->get();
    $users = \App\User::hydrate($result); 
    

    Τι κάναμε; Στην πρώτη γραμμή, με ένα ξερό select, η PHP μας γυρνάει ένα γενικού τύπου collection. Στη δεύτερη, χάρη στο hydrate, το αγνώστου τύπου collection παίρνει σάρκα και οστά και γίνεται collection του model User!

    Και φυσικά, για ένα τόσο απλό παράδειγμα, δεν έχει νόημα!

    Θα μπορούσαμε να πετύχουμε ακριβώς τα ίδια με μια γραμμή eloquent, χωρίς ίχνος sql!

    Tα ωραία κόλπα μας θα αρχίσουν με τα join στους ρόλους, στους people και όπου αλλού λαχταράει η ψυχή σας για join. Ειδικά μάλιστα αν είναι αποφύγουμε τα ιδιάζοντα whereHas, whereIn, wherePivot, whereSomethingNew… και να χρησιμοποιήσουμε κάτι πιο οικείο, αυτό που ξέρουμε από τη δεκαετία του ενενήντα: S.Q.L. χωρίς να σπάσουμε το κεφάλι μας για το πως γίνεται το καθετί.

    Μην ξεχάσετε όμως στο τέλος να ενυδατώσετε το ξερό query.

    $result = \DB::select('select * from users inner join roles on users.role_id = roles.id where roles.type="admin" ')->get();
    $users = \App\User::hydrate($result); 
    

    Πως σας φαίνεται το παραπάνω; Ωραιότατο! Δεν θα ήθελα ούτε καν να σκεφτώ πως πρέπει να το συντάξω με eloquent. Αυτό το παραπάνω querάκι μου βγήκε έτσι, αυθόρμητα, χωρίς πολλά-πολλά, σαν να γράφω τη λίστα με τα ψώνια.

    Προσοχή όμως γιατί κρύβεται κάτι σατανικό – κάτι που μόνο ένα δίωρο debugging θα το αποκαλύψει, ή εγώ ευθύς αμέσως:

    Τι γίνεται αν users και roles έχουν πεδία με ίδια ονόματα – πχ. κλειδάκι με όνομα id; Τι θα κάνει το hydrate σε αυτή την περίπτωση; Θα τα σκατώσει! Και καλά θα κάνει, δεν θα φταίει αυτό! Εμείς φταίμε που δεν ορίσαμε με σαφήνεια τι θα ενυδατωθεί! Ζητήσαμε να ενυδατωθεί το αστεράκι (*) συνεπώς δεν αποκλείεται το hydrate να βάλει στον χρήστη το id του ρόλου!

    Ποια είναι η λύση;

    Η αποσαφήνιση του αστερίσκου. Πολλά λόγια δεν χρειάζονται. Δείτε παρακάτω και θα καταλάβετε:

    $result = \DB::select('select users.* from users inner join roles on users.role_id = roles.id where roles.type="admin" ')->get();
    $users = \App\User::hydrate($result); 
    

    Έτσι αποφεύγουμε τις κακοτοπιές, δηλώνουμε ρητά ότι είναι τα πεδία του πίνακα users που θα γίνουν map με το model User!

  • wordpress emails via smtp, php 5.6+ and self signed mail server

    Εξ ορισμού το wordpress στέλνει email με το php function. Υπάρχει λοιπόν ένα ωραίο plugin που λέγεται wp mail smtp που επιτρέπει την αποστολή μέσω smtp. Πολλοί mail server διαθέτουν self signed certificate, ενώ η php, από τη 5.6 και μετά, δεν δέχεται τα self signed έτσι απρόσκοπτα για την αποστολή email. Ο developer του plugin δεν έφτιαξε ακόμα ένα ωραίο φλαγκ που να αποδέχεται τα self signed certificate αλλά προνόησε με το να επιτρέπει την χρήση του functions.php για το κατάλληλο hook.

    Αν πέσατε λοιπόν πάνω στην άσκηση (wp smtp mail) + (php>5.6) + (self signed mail server) = ? δείτε τη λύση παρακάτω.

    (περισσότερα…)

  • plug and play json restful api για mysql και όχι μόνο

    plug and play json restful api για mysql και όχι μόνο

    Όσοι γνωρίζετε το https://github.com/alixaxel/ArrestDB δεν χρειάζεται να διαβάσετε παρακάτω.

    Όσοι όμως δεν το έχετε ξανακούσει, αξίζει να διαβάσετε τη συνέχεια και ίσως να το δοκιμάσετε.

    Ας υποθέσουμε ότι έχετε σχεδιάσει μια φανταστική database – σε MySql, PostgreSQL ή SQLite και αναρωτιέστε πως θα τη διασυνδέσετε με τη mobile / web / desktop εφαρμογή σας. Τρόποι υπάρχουν πάμπολλοι, άλλοι πιο δύσκολοι, άλλοι πιο εύκολοι, άλλοι σωστοί και άλλοι προβληματικοί.

    Ένας από αυτούς, εξαιρετικά απλός και γρήγορος, είναι το ArrestDB που υπόσχεται να χτίσει σε μηδέν χρόνο ένα RESTful API γύρω από την database σας με μία γραμμή κώδικα – που αφορά στο connection string της db.

    Το project είναι γραμμένο σε PHP αλλά δεν χρειάζεται να γνωρίζετε τίποτα γι αυτήν, εκτός από το γεγονός ότι θα πρέπει να διαθέτετε την v5.4 – κάπως περιοριστικό αφού η 5.3 εξακολουθεί να μεσουρανεί.

    Για την εγκατάσταση κοπιάρετε στον web server σας το ένα και μοναδικό αρχείο του ArrestDB (index.php), τροποποιείτε καταλλήλως την πρώτη γραμμή του, φτιάχνετε και ένα htaccess για το routing και είστε έτοιμοι να δοκιμάσετε το api. Αν έχετε ξαναπαίξει με άλλο api, δεν θα βρείτε πρακτικά διαφορές, είναι έτσι όπως το φαντάζεστε:

    • Για να δείτε τον πελάτη του πίνακα customer με όνομα Nick:
      GET http://api.example.com/customer/name/Nick/
    • Για να τροποποιήσετε τον πελάτη του πίνακα customer με κωδικό 100:
      PUT http://api.example.com/customer/100/

    Για security, ούτε λόγος, στην καλύτερη, ότι προσφέρει ο apache. Ίσως οι πιο απαιτητικοί από εσάς να μην καλυφθούν, αλλά ο,τιδήποτε πιο advanced απαιτεί σαφώς περισσότερο κόπο, κι έτσι το ArrestDB καθίσταται μοναδικό για testing και για ταχύτατη υλοποίηση.

  • λίγα λόγια για τον composer

    λίγα λόγια για τον composer

    Όπως πιθανότατα έχετε καταλάβει, δεν θα μιλήσουμε για τον Beethoven, αλλά για τον συμπαθητικό dependency manager της PHP. Επιμένουμε στον όρο dependency, διευκρινίζοντας ότι δεν πρόκειται για package managemenet, αφορά σε εξαρτήσεις per project. Αυτό σε απλά ελληνικά σημαίνει ότι, ενώ ένας package manager θα αναλάμβανε τις προσθαφαιρέσεις βιβλιοθηκών globally στο σύστημα, o composer αναλαμβάνει την εγκατάσταση στο φάκελο vendor του project σας.

    Το πλεονέκτημα της φιλοσοφίας του composer είναι ότι αντιγράφοντας το φάκελο του project στον production server, έχετε πάρει μαζί σας όλα όσα χρειάζεστε για το τελικό deployment. Ακόμα μεγαλύτερο πλεονέκτημα αποτελεί το γεγονός ότι δεν χρειάζεται να κατεβάσετε, να ξεζιπάρετε, να ενσωματώσετε στο project σας την τάδε βιβλιοθήκη, εφόσον φυσικά είναι συμβατή με τον composer, απλά δηλώστε το όνομά της, την έκδοσή της και ο composer θα αναλάβει τα υπόλοιπα για εσάς. Αντιγράφουμε το χαρακτηριστικό παράδειγμα από το επίσημο site του composer:


    {
    "require": {
    "monolog/monolog": "1.2.*"
    }
    }

  • ενεργοποίηση του xdebug στην php

    ενεργοποίηση του xdebug στην php

    Η php χρησιμοποιείται σε πολλά δημοφιλή open source προγράμματα και εξακολουθεί να είναι από τις πιο σημαντικές γλώσσες σήμερα – στην έκτη θέση σύμφωνα με το tiobe index. Όπως σε κάθε γλώσσα, έτσι και στην php, χωρίς έναν καλό debugger, ο προγραμματιστής είναι άοπλος στη μάχη με τον κώδικα. Στην php συχνά χρησιμοποιείται ο xdebug και στα παρακάτω δείχνουμε πως ενεργοποιείται.

    (περισσότερα…)