{"id":269,"date":"2013-11-21T18:45:34","date_gmt":"2013-11-21T18:45:34","guid":{"rendered":"http:\/\/e-ware.org\/blog\/?p=269"},"modified":"2014-05-20T07:51:55","modified_gmt":"2014-05-20T07:51:55","slug":"readbeanphp-orm-per-tutti","status":"publish","type":"post","link":"http:\/\/e-ware.org\/blog\/readbeanphp-orm-per-tutti\/","title":{"rendered":"ReadBeanPHP: ORM per tutti!"},"content":{"rendered":"<p style=\"text-align: justify;\">La prototipazione\u00a0nel campo dello sviluppo software \u00e8 un importante processo del workflow poich\u00e9 \u00e8 uno dei primi step che permette la conversione delle idee in codice. Questa\u00a0importante fase, molto spesso, si avvale dell&#8217;uso di librerie preconfezionate da altri sviluppatori che servono proprio all&#8217;agevolazione del lavoro del programmatore cos\u00ec da aiutarlo a dar forma alle proprie idee per poi dedicarsi a successivi miglioramenti sia nella struttura che nelle performance.<\/p>\n<p style=\"text-align: justify;\">Quando si parla di software che sfruttano un database, uno strumento davvero utile per la gestione dei dati e delle relazione sono sicuramente le librerie per l&#8217;ORM management.<\/p>\n<p style=\"text-align: justify;\">L&#8217;<strong>ORM<\/strong> (<em>Object-relational mapping<\/em>) \u00e8 una tecnica di programmazione che permette di gestire le relazioni e i dati del database sfruttando la praticit\u00e0 della programmazione ad oggetti. In pratica le tabelle vengono rimappate come classi ed i dati al suo interno sono parte della classe stessa. In questo modo la classe metter\u00e0 a disposizione diverse funzioni per interagire con i dati ed i normali processi CRUD possono essere gestiti in maniera rapida e indolore senza ricorrere alle query pure.<\/p>\n<p style=\"text-align: justify;\">Essendo alla ricerca di un ORM per PHP mi sono imbattuto in quello che, secondo i miei gusti personali, \u00e8 la libreria di prototipazione pi\u00f9 semplice che esista: <a href=\"http:\/\/redbeanphp.com\/\" target=\"_blank\">RedBeanPHP<\/a>.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/e-ware.org\/blog\/wp-content\/uploads\/2013\/11\/redbeanphp.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-283\" src=\"http:\/\/e-ware.org\/blog\/wp-content\/uploads\/2013\/11\/redbeanphp-300x104.png\" alt=\"RedBeanPHP Logo\" width=\"300\" height=\"104\" srcset=\"http:\/\/e-ware.org\/blog\/wp-content\/uploads\/2013\/11\/redbeanphp-300x104.png 300w, http:\/\/e-ware.org\/blog\/wp-content\/uploads\/2013\/11\/redbeanphp.png 611w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Come lo stesso sito dice, RedBeanPHP \u00e8 una leggerissima libreria ORM che non necessita di alcun file di configurazione. Essa infatti, una volta aperta la connessione con il database, si occuper\u00e0 di gestire le tabelle e i dati nella maniera opportuna e creer\u00e0 per noi tabelle, campi e relazioni dove necessario. Questo ultimo passo \u00e8 una delle caratteristiche che rende RedBeanPHP un passo avanti rispetto ai concorrenti. La libreria, infatti, creer\u00e0 per noi tutto il necessario e questo risulta utilissimo nelle prime fase di prototipazione di un&#8217;applicazione che fa largo uso di database. Tutto quello che bisogna fare \u00e8 rispettare le convenzioni nella scrittura del codice ed il nostro fidato amico si occuper\u00e0 di tutto il resto.<\/p>\n<p style=\"text-align: justify;\"><strong>Esempio di codice<\/strong><\/p>\n<p style=\"text-align: justify;\">Qui di seguito vedremo un piccolo esempio di codice riportato sul sito ufficiale per capire come funziona, in maniera basilare, RedBeanPHP.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nrequire 'rb.php';\r\nR::setup();\r\n\r\n$post = R::dispense('post');\r\n$post-&gt;text = 'Hello World';\r\n\r\n$id = R::store($post); \/\/Create or Update\r\n$post = R::load('post',$id); \/\/Retrieve\r\nR::trash($post); \/\/Delete<\/pre>\n<p style=\"text-align: justify;\">Innanzitutto partiamo con il precisare che RedBean ragiona in <strong>Bean<\/strong> ovvero oggetti con propriet\u00e0 pubbliche. Ogni record che la libreria genera e gestisce \u00e8 una classe a s\u00e9 stante che pu\u00f2 essere manipolata, creata e distrutta in maniera abbastanza pratica. Il concetto stesso di record viene esteso e pertanto ci si sposta ad un livello di sviluppo diverso rispetto a quello a cui \u00e8 abituati quando si parla di gestione dei database nel proprio codice.<\/p>\n<p style=\"text-align: justify;\">Con la prima riga di codice abbiamo semplicemente detto al nostro script di includere la libreria e di permetterci di usarla. RedBeanPHP viene distribuito anche come libreria all-in-one gi\u00e0 preconfezionata con i diversi plugin sviluppati ad hoc.<\/p>\n<p style=\"text-align: justify;\">Successivamente ci preoccupiamo di aprire una connessione verso il nostro database. In questo caso la funzione setup() \u00e8 priva di parametri. Questo generer\u00e0 un database di tipo sqlite contenuto in maniera provvisoria sul sistema in uso. Mediante il passaggio dei parametri \u00e8 possibile sfruttare <a href=\"http:\/\/redbeanphp.com\/compatible\" target=\"_blank\">altri engine<\/a> come Postgresql o Mysql.<\/p>\n<p style=\"text-align: justify;\">Alla riga 3 troviamo una delle prime funzioni utili: dispense(). Essa si preoccupa di istanziare un oggetto di tipo Bean totalmente nuovo. Se a tale funzione viene passato solo il primo parametro essa gestir\u00e0 un solo Bean come un nuovo record della tabella definita dal parametro stesso (nel nostro caso &#8216;post&#8217;). Se invece ad essa viene passato anche il secondo parametro sotto forma di intero, verranno generati <em>n<\/em> Beans dove <em>n<\/em> \u00e8 dato da questo ultimo valore.<\/p>\n<p style=\"text-align: justify;\">La gestione degli id con RedBeanPHP \u00e8 totalmente automatica ed essi sono gestiti come interi progressivi di nome &#8216;id&#8217;. Attenzione per\u00f2: aver istanziato un Bean con dispense() non significa aver creato un record nella tabella corrispondente ma vuol dire gettare le basi per far ci\u00f2 in un secondo momento.<\/p>\n<p style=\"text-align: justify;\">Andando avanti troviamo la prima definizione di un campo. Al nostro oggetto, infatti, viene associata una nuova variabile pubblica e ad essa viene assegnato un valore (in questo caso stringa). Senza la minima costruzione di valori e senza nessuna definizione particolare abbiamo appena detto a RedBean che nella tabella &#8216;post&#8217; ci dovr\u00e0 essere un campo di nome &#8216;text&#8217; di tipo &#8216;varchar&#8217;. Con una sola riga di codice. Ovviamente allo stesso modo possono essere definiti valori diversi di tipo diverso.<\/p>\n<p style=\"text-align: justify;\">Grazie alla funzione store() possiamo realmente salvare quanto abbiamo appena definito ed ottenere dalla stessa funzione l&#8217;id automaticamente associato al nuovo record nella tabella.<\/p>\n<p style=\"text-align: justify;\">Per meglio comprendere l&#8217;uso dell&#8217;id, nella riga 8 \u00e8 stata sfruttata la funzione load() che permette di caricare un record definendo da quale tabella deve essere prelevato e a quale id deve corrispondere.<\/p>\n<p style=\"text-align: justify;\">Infine trash() si occupa di eliminare il record prelevato.<\/p>\n<p style=\"text-align: justify;\">Come si evince da questo esempio le potenzialit\u00e0 della libreria sono molte e risulta essere molto potente se usata a dovere. Con sole poche righe di codice si \u00e8 potuta creare un&#8217;intera tabella e definirne i campi in essa contenuta. Grazie a questo piccolo specchietto di codice \u00e8 stato possibile analizzare come RedBeanPHP gestisce il CRUD.<\/p>\n<p style=\"text-align: justify;\">Per qualsiasi approfondimento vi rimando al <a href=\"http:\/\/redbeanphp.com\/\" target=\"_blank\">sito ufficiale<\/a> o ai commenti qui sotto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La prototipazione\u00a0nel campo dello sviluppo software \u00e8 un importante processo del workflow poich\u00e9 \u00e8 uno dei primi step che permette la conversione delle idee in codice. Questa\u00a0importante fase, molto spesso, si avvale dell&#8217;uso di librerie preconfezionate da altri sviluppatori che servono proprio all&#8217;agevolazione del lavoro del programmatore cos\u00ec da aiutarlo a dar forma alle proprie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,74],"tags":[78,79],"class_list":["post-269","post","type-post","status-publish","format-standard","hentry","category-php","category-redbeanphp","tag-orm","tag-prototipazione"],"views":1668,"_links":{"self":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/269","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/comments?post=269"}],"version-history":[{"count":13,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/269\/revisions"}],"predecessor-version":[{"id":385,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/269\/revisions\/385"}],"wp:attachment":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/media?parent=269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/categories?post=269"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/tags?post=269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}