-
Folosire Rute cu Controller
-
Controller Resursa
-
Constructor Injection
-
Injection in Metode
Controller e o clasa care organizeaa logica unuia sau mai multor Rute intr-un loc.
Treaba principala a unui controller este sa preia cererea HTTP si sa prelucreze datele pentru restul aplicatiei. Astfel, se poate crea logica pentru route-urile tuturor paginilor intr-o singura clasa.
Crearea unui Controller
Pentru a crea un controller poti folosi comanda '
artisan' in CLI. In interfata Command Line navigheaza catre directorul cu proiectul Laravel si executa aceasta comanda:
php artisan make:controller MyController
Aceasta va crea un nou fisier numit "
MyController.php" in directorul
app/Http/Controllers/ cu un cod de baza (care extinde clasa Controller de baza inclusa cu Laravel):
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class MyController extends Controller {
//
}
- De asemenea, poti crea manual fisierul "
MyController.php" (in directorul
app/Http/Controllers/) cu codul de mai sus.
Pentru a vedea o lista de comenzi "artisan" valabile, scrieti in interfata Command Line:
php artisan –list
Folosire Rute cu Controller
In clasa
MyController putem crea metode care pot fi folosite in rute (in "web.php").
1. Creaza o metoda publica numita
index() care primeste obiectul Request si returneaza o pagina 'view' cu date pentru template.
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class MyController extends Controller {
//receives the request objet; returns a simple page using view
public function index(Request $req){
//set array with keys to be passed to view() for template
$data =[
'uri'=>$req->path(),
'url'=>$req->url(),
'method'=>$req->method()
];
return view('index', $data);
}
}
2. In directorul "
resources/views/" creaza un fisier "
index.blade.php" cu ceva continut, de exemplu:
<!doctype html>
<html lang="{{app()->getLocale()}}">
<head>
<meta charset="utf-8">
<title>Home Page</title>
</head>
<body>
<h1>Home page</h1>
URI: {{$uri}}<br>
URL: {{$url}}<br>
METHOD: {{$method}}
</body>
</html>
3. Foloseste metoda
MyController index() in route-ul pentru pagina principala "/" (in "routes/web.php" sterge route-ul get() existent pentru '/'), adauga:
Route::name('home')->get('/', 'MyController@index');
4. Deschide serverul inclus php (In CLI navigheaza catre directorul cu proiectul Laravel si initiaza "
php artisan serve") si acceseaza in browser: "
//localhost:8000/".
- Va afisa continutul creat in "index.blade.php", o pagina precum in aceasta imagine:
Controller Resursa
Controller-ul Resursa (
Resource Controller) este o clasa Controller care contine toate metodele pentru a efectua operatiuni CRUD (
Create, Read, Update, Delete).
Pentru a crea un "resource controller" foloseste aceasta comanda in CLI:
php artisan make:controller ControllerName --resource
De exemplu, sa cream un controller care se ocupa de toate cererile HTTP pentru "photos" stocate de o aplicatie Laravel.
1. Scrie aceasta comanda in CLI:
php artisan make:controller PhotoController --resource
Va crea un fisier "
PhotoController.php" in directorul
app/Http/Controllers/, cu o clasa care extinde Controller de baza, si cate o metoda pentru fiecare din operatiunile CRUD valabile.
Poti crea manual fisierul PhotoController cu codul clasei presentat mai jos.
2. Sa adaugam un sir simplu la 'return' in fiecare metoda a clasei PhotoController pentru a face teste.
Copiaza acest cod in fisierul "
PhotoController.php":
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PhotoController extends Controller {
//Display a listing of the resource.
//@return \Illuminate\Http\Response
public function index(){
return 'index';
}
//Show the form for creating a new resource.
//@return \Illuminate\Http\Response
public function create(){
return 'create';
}
//Store a newly created resource in storage.
//@param \Illuminate\Http\Request $request
//@return \Illuminate\Http\Response
public function store(Request $request){
return 'store, uri: '. $request->path();
}
//Display the specified resource.
//@param int $id
//@return \Illuminate\Http\Response
public function show($id){
return 'show, id: '. $id;
}
//Show the form for editing the specified resource.
//@param int $id
//@return \Illuminate\Http\Response
public function edit($id){
return 'edit, id: '. $id;
}
//Update the specified resource in storage.
//@param \Illuminate\Http\Request $request
//@param int $id
//@return \Illuminate\Http\Response
public function update(Request $request, $id){
return 'update, uri: '. $request->path() .' - id: '. $id;
}
//Remove the specified resource from storage.
//@param int $id
//@return \Illuminate\Http\Response
public function destroy($id){
return 'destroy, id: '. $id;
}
}
3. Acum, adauga urmatoare linie de cod in fisierul
routes/web.php.
Route::resource('photo', 'PhotoController');
- Aceasta singura instructiune creaza multiple "Route" pentru a se ocupa de mai multe tipuri apelari.
Tip-Apel |
URI |
Actiune |
Nume Route |
GET |
/photo |
index |
photo.index |
GET |
/photo/create |
create |
photo.create |
POST |
/photo |
store |
photo.store |
GET |
/photo/{photo} |
show |
photo.show |
GET |
/photo/{photo}/edit |
edit |
photo.edit |
PUT/PATCH |
/photo/{photo} |
update |
photo.update |
DELETE |
/photo/{photo} |
destroy |
photo.destroy |
4. Incearca sa executi URL-urile aratate in urmatorul tabel.
URL |
Descriere |
Output |
http://localhost:8000/photo |
Executa metoda index() din PhotoController.php |
index |
http://localhost:8000/photo/create |
Executa metoda create() din PhotoController.php |
create |
http://localhost:8000/photo/1 |
Executa metoda show() din PhotoController.php |
show |
http://localhost:8000/photo/1/edit |
Executa metoda edit() din PhotoController.php |
edit |
Deoarece formularele HTML nu pot face cereri PUT, PATCH (pentru update) sau DELETE (pentru stergere), va trebui sa adaugi un camp ascuns, cu
name='method_' pentru a indica aceste tipuri de cereri HTTP. Functia
method_field() poate crea automat acest camp:
{{method_field('PUT')}}
Daca vrei sa stii ce route-uri sunt valabile in aplicatia curenta, ruleaza in command line:
php artisan route:list
- vei primi o lista cu toate route-urile valabile.
In mod implicit, toate actiunile unui resource controller au un nume de route.
Pentru a prelua numele route-ului curent, foloseste:
$request->route()->getName()
Sau cu Route facade:
use Illuminate\Support\Facades\Route;
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();
Constructor Injection
Constructor Injection se refera la trimiterea de dependente (instante de clase) la metoda
__construct() din controller. Aceste dependente vor putea fi folosite in controller.
- Sa testam un exemplu.
1. Creaza un fisier "
TestController.php" in "
app/Http/Controllers/", si adauga acest cod:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller {
private $myclass;
//automatically inject instance of MyClass
public function __construct(\MyClass $myclass){
$this->myclass = $myclass;
}
//Responds to requests to /test
public function index(){
echo $this->myclass->prop1;
dd($this->myclass); //to see properties of myclass instance
}
}
2. Adauga urmatorul cod in fisierul
routes/web.php, pentru a directiona cererea '/test' catre un controller specific:
class MyClass{
public $prop1 ='value 1';
public $prop_2 ='value 2';
}
Route::get('test', 'TestController@index');
3. Acum daca accesezi in browser:
//localhost:8000/test/, va afisa o pagina ca in imaginea urmatoare:
Injection in Metode
De asemenea, se pot trimite dependente (instante de clase) si in metodele controller-ului.
- Exemplu.
1. Creaza un fisier "
TestController.php" in "
app/Http/Controllers/" si adauga acest cod:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller {
//Responds to requests to /test
//automatically inject instance of MyClass
public function index(\MyClass $myclass){
echo $myclass->prop1;
dd($myclass); //to see properties of myclass instance
}
}
2. In fisierul
routes/web.php lasa codul folosit in exemplu anterior pentru constructor-injection.
3. Acum, daca accesezi acest URL in browser:
//localhost:8000/test/, va afisa o pagina ca in urmatoarea imagine:
- Documentatie:
Laravel - Controllers