Diferència entre revisions de la pàgina «Laravel»
m (→Heroku) |
|||
Línia 154: | Línia 154: | ||
* Quan utilitzem el scaffold d'autenticació, falla el logout. Això es deu a un canvi del mètode de GET a POST per motius de seguretat (amb POST, només podran fer logout des de la pròpia app Laravel ja que porta el csrf_token). | * Quan utilitzem el scaffold d'autenticació, falla el logout. Això es deu a un canvi del mètode de GET a POST per motius de seguretat (amb POST, només podran fer logout des de la pròpia app Laravel ja que porta el csrf_token). | ||
*: https://laracasts.com/discuss/channels/laravel/laravel-53-logout-methodnotallowed | *: https://laracasts.com/discuss/channels/laravel/laravel-53-logout-methodnotallowed | ||
+ | |||
+ | |||
+ | == Laravel i LDAP == | ||
+ | Aquest mòdul està pensat per a Active Directory, però també funciona amb OpenLDAP si s'ajusta bé: | ||
+ | https://github.com/Adldap2/Adldap2-Laravel | ||
+ | |||
+ | Primer cal configurar un servidor [[LDAP]]. | ||
+ | |||
+ | Desprésm, tingues en compte que cal ajustar els següents paràmetres en el .env: | ||
+ | ADLDAP_CONTROLLERS=localhost | ||
+ | #ADLDAP_PORT=389 | ||
+ | ADLDAP_ADMIN_USERNAME="cn=admin,dc=cacauet,dc=org" | ||
+ | ADLDAP_ADMIN_PASSWORD="enric123" | ||
+ | ADLDAP_BASEDN="dc=cacauet,dc=org" | ||
+ | |||
+ | Podem fer una autenticació seguint algun d'aquests exemples. | ||
+ | |||
+ | Exemple 1: cercar un element del directori | ||
+ | <syntaxhighlight lang="php"> | ||
+ | $user = Adldap::search()->where("mail","=","[email protected]")->get(); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Exemple 2: autenticar un usuari | ||
+ | <syntaxhighlight lang="php"> | ||
+ | if( Adldap::auth()->attempt("cn=pepe,ou=usuaris,dc=cacauet,dc=org","pepe123")) { | ||
+ | // autenticació exitosa | ||
+ | return "Pepe OK!"; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
<br> | <br> |
Revisió del 13:27, 11 abr 2017
Contingut
Intro i referències
Laravel és un framework web per a PHP que està agafant molta força.
Tutorials:
- Principal tutorial per seguir el curs:
https://ajgallego.gitbooks.io/laravel-5/content/index.html
- https://scotch.io/tutorials/simple-laravel-crud-with-resource-controllers
- https://selftaughtcoders.com/from-idea-to-launch/lesson-23/laravel-5-application-form-model-binding-laravelcollective-forms-html-library-bootstrap-framework/
- Apunts del Sergi Coll: https://seicoll.github.io/DAW-M07-UF2-Apunts/
- https://styde.net/laravel-5/
Plugins:
- https://github.com/FrozenNode/Laravel-Administrator
- http://crudbooster.com/
- https://iamacoder.com/post/5-must-have-laravel-5-packages/
Referències:
- Instal·lació: https://laravel.com/docs/5.3/installation
- Getting Started amb Eloquent ORM: https://laravel.com/docs/5.3/eloquent
Instal·lació i setup
Instal·lació: https://laravel.com/docs/5.3/installation
Prerequisits:
- Cal PHP >= 5.6.4
- Si utilitzes Ubuntu 14 o menor actualitza la teva versió de PHP a la 7.0
- Calen els paquets següents:
$ sudo apt-get install php7.0-mbstring php7.0-zip php7.0-xml
Anem a posar-nos-hi. Utilitzarem Laravel v. 5.3, tot i que en futures versions les passes no haurien de diferir molt (però ho fan):
- Instal·la el gestor de paquets COMPOSER.
- Instal·la Laravel 5.3.
- Laravel s'instal·la a
$HOME/.composer
però per poder executar les properes comandes necessitarem tenir$HOME/.composer/vendor/bin
al nostre $PATH. Inserta això al teu$HOME/.profile
:PATH=$PATH:~/.composer/vendor/bin
- Laravel s'instal·la a
- Crea una app Laravel allà on et faci més ràbia:
$ laravel new laravelapp1
- o també:
$ composer create-project --prefer-dist laravel/laravel laravelapp1
- o també:
- Arrenca l'aplicació de prova:
$ php artisan serve
- Comprova la app amb el navegador a
http://localhost:8000
Incidències vàries
Aquest és un bon tutorial:
https://ajgallego.gitbooks.io/laravel-5/content/index.html
Igualment, podríem trobar algunes incidències. Us dono pistes:
Treballant amb GIT i clonant
Al pujar el projecte a un repo GIT, i clonar-lo després caldrà:
- Re-instal·lar les dependències:
$ composer install
- Regenerar arxiu
.env
: com que depèn de cada entorn no es fica al projecte (es posa a.gitignore
), però pots copiar i modificar de.env.example
- Error The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths. Es soluciona amb :
$ php artisan key:generate
Creant controllers
Per crear un controller complert, és més simple si ho fem com a RESOURCE. Ens crearà tots els mètodes i les rutes necessàries per a un CRUD.
- Ja no es pot fer amb
sinó amb:Route::controller
Route::resource("cosa","CosaController");
- Per exemple, per crear un controller per al model "Cosa" ho faríem amb -r (de resource):
$ php artisan make:controller -r CosaController
Treballant amb SQLITE
Per configurar la BD amb SQLITE cal crear el fitxer abans amb:
$ touch db.sqlite
Configurar la BD a .env:
DB_CONNECTION=sqlite DB_DATABASE=/path/absolut/al/db.sqlite
I creant la BD inicial amb:
$ php artisan migrate:install
Eliminant models o migracions
Si en algun moment heu afegit algun model o migració innecessàries, i les voleu esborrar, només cal esborrar l'arxiu pertinent i, seguidament, fer:
$ composer dump-autoload
...i es tornaran a generar els arxius d'autoload sense els arxius que volíem esborrar.
Quickstart per a fer un CRUD
Crear projecte:
$ laravel new proj1
Crear DB:
$ touch db.sqlite
Crear taules i migracions:
$ php artisan make:migration crea_taula_items --create=items
Crear models:
$ php artisan make:model Item
Editar la migració per crear les taules adequades.
Crear controllers amb els mètodes estàndard (index, create-store, show, edit-update, destroy):
$ php artisan make:controller -r ItemController
Crear rutes a routes/web.php
:
Route::resource("item","ItemController");
Crear plantilles per als mètodes (l'exemple diu "tema" enlloc de "item"):
$ php artisan route:list +--------+-----------+-----------------------+----------------+-----------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+-----------------------+----------------+-----------------------------------------------+--------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|HEAD | tema | tema.index | App\Http\Controllers\TemaController@index | web | | | POST | tema | tema.store | App\Http\Controllers\TemaController@store | web | | | GET|HEAD | tema/create | tema.create | App\Http\Controllers\TemaController@create | web | | | GET|HEAD | tema/{tema} | tema.show | App\Http\Controllers\TemaController@show | web | | | PUT|PATCH | tema/{tema} | tema.update | App\Http\Controllers\TemaController@update | web | | | DELETE | tema/{tema} | tema.destroy | App\Http\Controllers\TemaController@destroy | web | | | GET|HEAD | tema/{tema}/edit | tema.edit | App\Http\Controllers\TemaController@edit | web | +--------+-----------+-----------------------+----------------+-----------------------------------------------+--------------+
Crear les views (plantilles blade) adequades per a tots els mètodes necessaris: index, create-store, show, edit-update, destroy
Editar el codi del Controller per cridar pertinentment a les views.
Fent un projectet amb Laravel
Aquest és el projecte que he realitzat per entrenar-me, et pot servir d'exemple. El pots veure en producció aquí: https://jolgorio.tk
https://github.com/emieza/laravel-karaoke
Fes-li un cop d'ull al readme.md per veure com posar-lo en marxa.
MOLT IMPORTANT PEL PROJECTE: Cal crear un README.md (com per exemple aquest). No acceptaré cap projecte sense README.md
Per entrenar-vos amb el Markdown teniu aquest tester:
http://dillinger.io/
Anem per feina:
- Clarificar la idea de la funcionalitat que vols implementar.
- Clarificar la BD: mínim 2 taules i 1 relació (FK), màxim 3 taules i 2 relacions (per no fer el projecte massa llarg). En el meu cas, tinc:
- Taula "llistes"
- Taula "temes"
- Taula "vots"
- Clarificar les rutes que vols implementar per al projecte. En el meu cas, tinc:
- /llista/crea (GET per formulari + POST per store)
- /llista (index de llistes)
- /llista/{id} (show)
- /llista/{id}/crea (GET + POST, per crear temes en les llistes)
- /vota/{idtema}
- Crear rutes (veure exemple) a
routes/web.php
- Crear migració
$ php artisan make:migration taules
- Editar arxiu de migracions a
database/migrations
i afegir les noves taules al mètode up. Recorda posar els "drop" al mètode down. - Migrar, és a dir, crear la BD. Per fer-ho caldrà configurar:
- Crear el
.env
(copia'l del.env.example
) - Configurar el .env amb les dades de la teva BD (sqlite, mysql, etc.). Veure més amunt...
- Crear les dades a la BD:
$ php artisan migrate
- Crear el
- Crear Controllers. Posa -r si és un CRUD complert, si no, millor no:
$ php artisan make:controller -r ItemController
- Crear models. La majoria de casos estaran buits i no caldrà afegir-hi res a la classe:
$ php artisan make:model Item
- Això crearà
app/Item.php
. Al meu exemple (Llista.php) he modificat la $table ja que Laravel acostuma a assignar la taula amb el nom de la classe + "s" (plural). Com que en català fem "llista"->"llistes" (canviem la "a" per "e") el mètode automàtic falla i hem d'especificar-li que la seva taula és la "llistes" i no "llistas".
- Això crearà
- Afegir el codi necessari i plantilles:
- Codi: als Controllers pertinents. Mira't l'exemple de les llistes de karaoke.
- Plantilles: a resourcs/views/xxxx.blade.php . Mira't l'exemple un altre cop.
Cabos sueltos
Alguns temes a solucionar:
- Quan utilitzem el scaffold d'autenticació, falla el logout. Això es deu a un canvi del mètode de GET a POST per motius de seguretat (amb POST, només podran fer logout des de la pròpia app Laravel ja que porta el csrf_token).
Laravel i LDAP
Aquest mòdul està pensat per a Active Directory, però també funciona amb OpenLDAP si s'ajusta bé:
https://github.com/Adldap2/Adldap2-Laravel
Primer cal configurar un servidor LDAP.
Desprésm, tingues en compte que cal ajustar els següents paràmetres en el .env:
ADLDAP_CONTROLLERS=localhost #ADLDAP_PORT=389 ADLDAP_ADMIN_USERNAME="cn=admin,dc=cacauet,dc=org" ADLDAP_ADMIN_PASSWORD="enric123" ADLDAP_BASEDN="dc=cacauet,dc=org"
Podem fer una autenticació seguint algun d'aquests exemples.
Exemple 1: cercar un element del directori
$user = Adldap::search()->where("mail","=","[email protected]")->get();
Exemple 2: autenticar un usuari
if( Adldap::auth()->attempt("cn=pepe,ou=usuaris,dc=cacauet,dc=org","pepe123")) {
// autenticació exitosa
return "Pepe OK!";
}
Laravel en producció
Heroku
Pots posar en marxa un projecte Laravel a Heroku fàcilment seguint aquesta documentació. Segueix el tutorial per iniciar la app:
https://devcenter.heroku.com/articles/getting-started-with-laravel
L'inconvenient és posar en marxa la base de dades. Si ho fas amb sqlite utilitza el propi sistema d'arxius, però la contrapartida és que Heroku utilitza un sistema d'arxius efímer, i quan tornem a fer un push s'esborra tot.
En el cas de voler un MySQL, tot i que els termes d'ús són gratuïts si no hi ha gaire volum de dades i/o trànsit, demanarà que entris la targeta de crèdit.
En canvi, el add-on de POSTGRESQL és gratuït i sense targeta de crèdit! :) Som-hi, doncs!
Només cal fer:
$ heroku addons:create heroku-postgresql:hobby-dev
I configurar la nostra base de dades perquè el Laravel la utilitzi. Primer de tot observem el connection string que ens dona Heroku quan hem creat la BBDD:
$ heroku config -s | grep -i post
Ens ho dona en la següent forma (exemple a continuació):
DATABASE_URL='postgres://<usuari>:<password>@<maquina>:<port>/<bbdd>' DATABASE_URL='postgres://mxlsfebqyopadb:3e5af56b52cc06574645123ea9d9f7504564e207804dcc71a2db2848446ba064@ec2-156-73-167-43.compute-1.amazonaws.com:5432/d353ihheo564q7'
Així, doncs, només caldrà ajustar les següents variables d'entorn que necessita el Laravel perquè això funcioni:
DB_CONNECTION=pgsql DB_HOST=ec2-156... DB_PORT=5432 DB_DATABASE=d353... DB_USERNAME=mxls... DB_PASSWORD=3e5a...
Per fer-ho cal anar executant les següents ordres:
$ heroku config:set DB_CONNECTION=pgsql $ ...etc...
I un cop acabats, migrem la nostra base de dades:
$ heroku run php artisan migrate
...et voilà!
Desplegament en servidor propi (VPS)
El desplegament de Laravel bàsicament només necessita publicar la carpeta /public
. Si no veus aquesta carpeta (ni tampoc la /vendor) segurament necessites reconstruir el projecte (llegeix més amunt per veure com).
Guia pel desplegament en un VPS:
- Accedir al nostre servidor via SSH
- Descarregar el codi Laravel (via GIT o scp) a una carpeta no-pública, però a la que Apache pugui accedir, típicament
/var/www
- Es requereix el mòdul mod_rewrite d'Apache (o Nginx)
- Publicar la carpeta
/public
del projecte Laravel, d'alguna d'aquestes maneres:- Crear un VirtualHost i apuntar la ServerRoot del domini o subdomini a /var/www/<projecte>/public
- Crear un link simbòlic de la carpeta pública d'Apache a la carpeta public del Laravel amb la comanda
$ ln -s /var/www/<projecte>/public /var/www/html/lara1
- Cal activar els arxius
.htaccess
, afegint la directivaAllowOverride all
A l'arxiu de conf. del nostre VirtualHost (a /etc/apache2/sites-available
):
<Directory /var/www/> AllowOverride All </Directory>
És important remarcar que per SEGURETAT no hem de mostrar mai els arxius interns de Laravel, només cal publicar el contingut de /public