Scopo dello stile di chiusura in Laravel / PHP?

0

Molte delle librerie di framework incorporate di Laravel usano le chiusure come argomenti. Qual è lo scopo principale di questo stile di codifica? È solo per ottenere un maggiore controllo sulla configurazione della funzione, per usare "stile funzionale", o fornisce inversione di dipendenza di qualche tipo?

Sono curioso perché mi chiedo se dovrei adottare questo stile per lo sviluppo non-framework.

Ad esempio, non sarebbe più semplice passare un secondo argomento di stringa, "site.help" alla funzione Route :: get ()?

Route::get('help', function () {
   return View::make('site.help');
});

Nota: non sto chiedendo come funzionano le chiusure o cosa fanno, ma piuttosto come stile.

    
posta Charlie Dalsass 23.02.2018 - 22:37
fonte

2 risposte

2

Le direttive della rotta di Laravel accettano effettivamente una stringa come secondo parametro:

Route::get('/user', 'UserController@index');

Questo viene analizzato dal router Laravel per chiamare l'azione desiderata nel controller desiderato e quindi iniettare qualsiasi cosa il controller di azione ritorni nella risposta effettiva all'utente.

Tuttavia, i controller di azione possono restituire diverse cose: viste, reindirizzamenti, stringhe, json e così via.

Se dovessi semplicemente inserire una semplice stringa intesa come nome di vista, il router dovrà sapere che la stringa è un nome di vista (e non un controller@action , o un reindirizzamento, o una semplice stringa .. .).

Il callback in stile di chiusura offre flessibilità e un processo decisionale più semplice nel parser.

La chiusura fornita nella tua domanda è piuttosto semplice: restituisci la vista con nome. È possibile scrivere alcune risposte piuttosto complesse:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) 
{
     // of course, you'd have to write something to get data from your models and inject into a view
});

O anche, meglio (grazie al binding implicito):

Route::get('posts/{post}/comments/{comment}', function (App\Post $post, App\Comment $comment) 
{
     return View::make('blog.comment', [
         'comment' => $comment
     ]);
});

Per ottenere lo stesso risultato utilizzando le stringhe, è necessario un footprint del metodo più complesso per la direttiva route.

    
risposta data 24.02.2018 - 22:54
fonte
0

Il motivo principale è che Route non deve dipendere da View. Passando nella funzione, sono in grado di ridurre le dipendenze tra gli oggetti, osservare la separazione delle preoccupazioni e rendere ogni classe più controllabile.

    
risposta data 24.02.2018 - 16:59
fonte

Leggi altre domande sui tag