Parte 2 - Autoloading

La prima parte del nostro viaggio al centro di Laravel comincia dall'autoloading.
francesco
Francesco Malatesta
03/10/2014 in

In questa serie, traduzione autorizzata di quella pubblicata da Christopher Pitt su Rebuilding Laravel, esploreremo in profondità il framework in tutti i suoi aspetti. Dall'autoloading alla configurazione, passando per le operazioni di pulizia ed il routing.

Ho pensato che il posto migliore per cominciare potesse essere il luogo dove tutto inizia... per cui eccoci qui in public/index.php!

Regole di Rewrite

Perché proprio questo file? Beh, in realtà non ci vuole molto a capirlo ma puoi dare uno sguardo al file public/.htaccess che contiene alcune regole di riscrittura degli url per il mod_rewrite.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    
    RewriteEngine On
    
    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Le linee che ci interessano sono RewriteRule e RewriteCond. La prima RewriteRule spiega ad Apache che gli URL con lo slash finale devono essere reindirizzate alla loro versione senza slash.

Le RewriteCond, invece, spiegano ad Apache di ignorare qualsiasi altra regola se l'indirizzo specificato corrisponde ad una directory o ad un file esistente. In parole povere: inserisci l'url di un file o di una cartella? Niente redirect.

L'ultima RewriteRule, infine, spiega che ogni altra cosa deve essere reindirizzata a public/index.php. Mentre la prima RewriteRule effettua a tutti gli effetti un redirect, quest'ultima effettuerà il redirect in modo trasparente.

Questo file public/.htaccess mi fa pensare che Laravel sia stato costruito per essere usato con Apache. L'unico altro webserver "mainstream" è Nginx, che ignora i file .htaccess. Ad ogni modo è possibile installare tranquillamente Laravel su Nginx, su questa pagina. Lovro Papež, inoltre, ha scritto una guida per configurare questi URL anche su IIS.

File di Autoload

Laravel è stato costruito per lavorare con Composer. Tutte le dipendenze usate vengono caricate tramite Composer e tutte le classi in autoloading vengono gestite automaticamente dall'autoloader di Composer.

Ok, magari non proprio tutto... aprendo il file public/index.php la prima linea significativa è:

require __DIR__.'/../bootstrap/autoload.php';

Aprendo questo file troviamo un po' di codice dedicato al profiling, seguito immediatamente dopo dal richiamo all'autoloader di Composer.

require __DIR__.'/../vendor/autoload.php';

Questa istruzione ci dice che tutte le classi mappate nel file composer.json (e relative dipendenze) potranno essere usate nell'applicazione.

Successivamente viene fatto un check per un file chiamato bootstrap/compiled.php. Se il nome ha un che di familiare è perché l'avrai letto nel file .gitignore dell'applicazione.

bootstrap/compiled.php è una collezione di classi che Laravel identifica come importanti. Vengono concatenate una dopo l'altra in modo tale da limitare il numero di richieste. Se vuoi, comunque, puoi aggiungere quante classi vuoi al file app/config/compile.php, in modo tale da includerle nel processo.

Sempre nel file bootstrap/autoload.php, inoltre, troviamo:

Illuminate\Support\ClassLoader::register();

La classe in questione aiuta a caricare i model (presumibilmente anche altre classi) che non sono state incluse tramite la famosa chiamata al "composer dump-autoload".

Infine, tutto quello che riguarda il workbench viene incluso nel ciclo con:

if (is_dir($workbench = __DIR__.'/../workbench'))
{
  Illuminate\Workbench\Starter::start($workbench);
}

Sbirciando nella classe possiamo notare che cerca i file che corrispondono ad autoload.php, che è poi una reference dell'autoloader di Composer, nelle singole cartelle in workbench.

Tali mie "supposizioni" sono poi state confermate dando un'occhiata alla pagina http://laravel-italia.it/documentazione/sviluppo-di-package#p7.

I cosidetti "workbench" non sono altro che i package durante la fase di sviluppo. Vengono isolati dal resto dei file dell' applicazione. Creare un nuovo workbench è semplice: basta usare il comando php artisan workbench. Se vuoi saperne di più dai uno sguardo alla pagina http://laravel-italia.it/documentazione/sviluppo-di-package#p2.

UTF-Cosa?

Ho saltato volutamente la parte di bootstrap/autoload.php che carica la libreria Patchwork UTF-8. Riguarda il supporto di PHP per UTF-8 (in arrivo), ma per ora non ce ne occuperemo.