Laravel - Controller

Nel framework MVC, la lettera "C" sta per Controller. Funge da guida del traffico tra le viste e i modelli. In questo capitolo imparerai a conoscere i controller in Laravel.

Creazione di un controller

Aprire il prompt dei comandi o il terminale in base al sistema operativo in uso e digitare il comando seguente per creare il controller utilizzando Artisan CLI (Command Line Interface).

php artisan make:controller <controller-name> --plain

Sostituisci <controller-name> con il nome del tuo controller. Questo creerà un semplice costruttore mentre passiamo l'argomento -plain. Se non vuoi creare un semplice costruttore, puoi semplicemente ignorare l'argomento. Il costruttore creato può essere visto suapp/Http/Controllers.

Vedrai che è già stata eseguita una codifica di base per te e potrai aggiungere la tua codifica personalizzata. Il controller creato può essere chiamato da route.php con la seguente sintassi.

Sintassi

Route::get(‘base URI’,’[email protected]’);

Esempio

Step 1 - Esegui il seguente comando per creare UserController.

php artisan make:controller UserController --plain

Step 2 - Dopo aver eseguito con successo, riceverai il seguente output.

Step 3 - Puoi vedere il controller creato su app/Http/Controller/UserController.php con una codifica di base già scritta per te e puoi aggiungere la tua codifica in base alle tue necessità.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   //
}

Middleware del controller

Abbiamo già visto il middleware e può essere utilizzato anche con il controller. Il middleware può anche essere assegnato alla route del controller o all'interno del costruttore del controller. È possibile utilizzare il metodo middleware per assegnare middleware al controller. Il middleware registrato può anche essere limitato a determinati metodi del controller.

Assegnazione del middleware alla route

Route::get('profile', [
   'middleware' => 'auth',
   'uses' => '[email protected]'
]);

Qui stiamo assegnando il middleware di autenticazione a UserController nella route del profilo.

Assegnazione del middleware all'interno del costruttore del controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   public function __construct() {
      $this->middleware('auth');
   }
}

Qui stiamo assegnando auth middleware utilizzando il metodo middleware in UserController costruttore.

Esempio

Step 1 - Aggiungi le seguenti righe di codice al file app/Http/routes.php file e salvarlo.

routes.php

<?php
Route::get('/usercontroller/path',[
   'middleware' => 'First',
   'uses' => '[email protected]'
]);

Step 2 - Crea un middleware chiamato FirstMiddleware eseguendo la seguente riga di codice.

php artisan make:middleware FirstMiddleware

Step 3 - Aggiungi il seguente codice nel file handle metodo del FirstMiddleware appena creato in app/Http/Middleware.

FirstMiddleware.php

<?php

namespace App\Http\Middleware;
use Closure;

class FirstMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>First Middleware';
      return $next($request);
   }
}

Step 4 - Crea un middleware chiamato SecondMiddleware eseguendo il seguente comando.

php artisan make:middleware SecondMiddleware

Step 5 - Aggiungi il seguente codice nel metodo handle del SecondMiddleware appena creato in app/Http/Middleware.

SecondMiddleware.php

<?php

namespace App\Http\Middleware;
use Closure;

class SecondMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>Second Middleware';
      return $next($request);
   }
}

Step 6 - Crea un controller chiamato UserController eseguendo la riga seguente.

php artisan make:controller UserController --plain

Step 7 - Dopo aver eseguito con successo l'URL, riceverai il seguente output -

Step 8 - Copia il seguente codice in app/Http/UserController.php file.

app/Http/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   public function __construct() {
      $this->middleware('Second');
   }
   public function showPath(Request $request) {
      $uri = $request->path();
      echo '<br>URI: '.$uri;
      
      $url = $request->url();
      echo '<br>';
      
      echo 'URL: '.$url;
      $method = $request->method();
      echo '<br>';
      
      echo 'Method: '.$method;
   }
}

Step 9 - Ora avvia il server web interno di php eseguendo il seguente comando, se non lo hai ancora eseguito.

php artisan serve

Step 10 - Visita il seguente URL.

http://localhost:8000/usercontroller/path

Step 11 - L'output apparirà come mostrato nell'immagine seguente.

Restful Resource Controllers

Spesso durante la creazione di un'applicazione dobbiamo eseguire CRUD (Create, Read, Update, Delete)operazioni. Laravel ci rende questo lavoro facile. Basta creare un controller e Laravel fornirà automaticamente tutti i metodi per le operazioni CRUD. Puoi anche registrare una singola rotta per tutti i metodi nel file routes.php.

Esempio

Step 1 - Crea un controller chiamato MyController eseguendo il seguente comando.

php artisan make:controller MyController

Step 2 - Aggiungi il seguente codice in

app/Http/Controllers/MyController.php file.

app/Http/Controllers/MyController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class MyController extends Controller {
   public function index() {
      echo 'index';
   }
   public function create() {
      echo 'create';
   }
   public function store(Request $request) {
      echo 'store';
   }
   public function show($id) {
      echo 'show';
   }
   public function edit($id) {
      echo 'edit';
   }
   public function update(Request $request, $id) {
      echo 'update';
   }
   public function destroy($id) {
      echo 'destroy';
   }
}

Step 3 - Aggiungi la seguente riga di codice in app/Http/routes.php file.

app/Http/routes.php

Route::resource('my','MyController');

Step 4- Stiamo ora registrando tutti i metodi di MyController registrando un controller con risorsa. Di seguito è riportata la tabella delle azioni gestite dal controller delle risorse.

Verbo Sentiero Azione Nome percorso
OTTENERE /mio indice my.index
OTTENERE / mio / create creare my.create
INVIARE /mio negozio il mio negozio
OTTENERE /mio mio} spettacolo my.show
OTTENERE / mio / {mio} / modifica modificare my.edit
PUT / PATCH /mio mio} aggiornare my.update
ELIMINA /mio mio} distruggere my.destroy

Step 5 - Prova a eseguire gli URL mostrati nella tabella seguente.

URL Descrizione Immagine di output
http: // localhost: 8000 / my Esegue il metodo dell'indice di MyController.php indice
http: // localhost: 8000 / my / create Esegue il metodo create di MyController.php creare
http: // localhost: 8000 / my / 1 Esegue il metodo show di MyController.php spettacolo
http: // localhost: 8000 / my / 1 / edit Esegue il metodo di modifica di MyController.php modificare

Controller impliciti

I controller impliciti consentono di definire una singola route per gestire ogni azione nel controller. Puoi definirlo nel file route.php conRoute:controller metodo come mostrato di seguito.

Route::controller(‘base URI’,’<class-name-of-the-controller>’);

Sostituisci <class-name-of-the-controller> con il nome della classe che hai dato al tuo controller.

Il nome del metodo del controller dovrebbe iniziare con il verbo HTTP come get o post. Se lo avvii con get, gestirà solo la richiesta get e se inizia con post, gestirà la richiesta di post. Dopo il verbo HTTP puoi, puoi dare qualsiasi nome al metodo, ma dovrebbe seguire la versione del caso del titolo dell'URI.

Esempio

Step 1- Esegui il comando seguente per creare un controller. Abbiamo mantenuto il nome della classeImplicitController. Puoi dare qualsiasi nome di tua scelta alla classe.

php artisan make:controller ImplicitController --plain

Step 2 - Dopo aver eseguito con successo il passaggio 1, riceverai il seguente output:

Step 3 - Copia il seguente codice in

app/Http/Controllers/ImplicitController.php file.

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   /**
      * Responds to requests to GET /test
   */
   public function getIndex() {
      echo 'index method';
   }
   
   /**
      * Responds to requests to GET /test/show/1
   */
   public function getShow($id) {
      echo 'show method';
   }
   
   /**
      * Responds to requests to GET /test/admin-profile
   */
   public function getAdminProfile() {
      echo 'admin profile method';
   }
   
   /**
      * Responds to requests to POST /test/profile
   */
   public function postProfile() {
      echo 'profile method';
   }
}

Step 4 - Aggiungi la seguente riga a app/Http/routes.php file per instradare le richieste al controller specificato.

app/Http/routes.php

Route::controller('test','ImplicitController');

Iniezione del costruttore

Il contenitore di servizi Laravel viene utilizzato per risolvere tutti i controller Laravel. Di conseguenza, sei in grado di suggerire il tipo di qualsiasi dipendenza che il tuo controller potrebbe aver bisogno nel suo costruttore. Le dipendenze verranno automaticamente risolte e inserite nell'istanza del controller.

Esempio

Step 1 - Aggiungi il seguente codice a app/Http/routes.php file.

app/Http/routes.php

class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','[email protected]');

Step 2 - Aggiungi il seguente codice a

app/Http/Controllers/ImplicitController.php file.

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   private $myclass;
   
   public function __construct(\MyClass $myclass) {
      $this->myclass = $myclass;
   }
   public function index() {
      dd($this->myclass);
   }
}

Step 3 - Visita il seguente URL per testare l'iniezione del costruttore.

http://localhost:8000/myclass

Step 4 - L'output apparirà come mostrato nell'immagine seguente.

Metodo di iniezione

Oltre all'iniezione nel costruttore, puoi anche digitare - hint dependencies sui metodi di azione del controller.

Esempio

Step 1 - Aggiungi il seguente codice a app/Http/routes.php file.

app/Http/routes.php

class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','[email protected]');

Step 2 - Aggiungi il seguente codice a

app/Http/Controllers/ImplicitController.php file.

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   public function index(\MyClass $myclass) {
      dd($myclass);
   }
}

Step 3 - Visita il seguente URL per testare l'iniezione del costruttore.

http://localhost:8000/myclass

Produrrà il seguente output: