# 4.- Creando nuestro primer Controller and Resource (Article)
Utilizaremos 2 opciones
php artisan make:controller ArticleController -m Article --api
Vamos a àpp/Http/Controllers
- Ahora crearemos un nuevo controlador para Author del articulo
php artisan make:controller AuthorController
# Creando nuestro archivo Resource
Igualmente utilizamos 2 opciones para ver las diferencias
php artisan make:resource ArticleResource
php artisan make:resource AuthorResource
php artisan make:resource ArticleCollection -c OR php artisan make:resource ArticleCollection --collection
- Antes de avanzar vamos al archivo
app/routes/api.php
y creamos la ruta
use App\Http\Controllers\ArticleController;
Route::get('/articles', [ArticleController::class, 'index']);
- Vamos al archivo
app/Http/Resource/ArticleCollection.php
Con esto podemos elegir que datos queremos enviar por nuestra API
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class ArticleCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return[
'data' => $this->collection,
];
}
public function with($request)
{
return [
'status' => 'success'
];
}
public function withResponse($request, $response)
{
$response->header('Accept', 'application/json');
}
}
- Vamos al archivo
app/Http/Resource/ArticleResource.php
Esta opción tiene la función de poder elegir solo algunos datos que queremos enviar y tiene que ir acompañado con el archivo ArticleCollection
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class ArticleResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
//code
public function toArray($request)
{
return [
'id' => $this->resource->id,
'title' => $this->resource->title,
];
}
}
- Utilizamos la configuración que realizamos en
app/Http/Resource/ArticleCollection.php
yapp/Http/Resource/ArticleResource.php
e importamos al controladorapp/Http/Controller/ArticleController.php
//import archivo collection para todos los datos de un articulo
use App\Http\Resources\ArticleCollection;
use App\Models\Article;
public function index(Request $request)
{
$articles = Article::all();
return response()->json([
'success' => true,
'articles' => new ArticleCollection($articles)
]);
}
//import archivo resource para mostrar algunos datos elegidos
{
$article = Article::find($id);
if (!$article) {
return response()->json([
'success' => false,
'message' => 'article does not exist'
]);
}
return response()->json([
'success' => true,
'article' => new ArticleResource($article)
]);
}
WARNING
Hasta acá ya tenemos una Api con Laravel Sanctum
Recursos resource - collection Laravel (opens new window)
Recursos Pagination Laravel (opens new window)
# Configurando la función para el login
- Tenemos que enviar el user y token y para eso realizaremos lo siguiente.
Buscamos el archivo app/Http/Controllers/Auth/AuthenticatedSessionController.php
y en la function store()
//Antes
public function store(LoginRequest $request)
{
$request->authenticate();
$request->session()->regenerate();
return response()->noContent();
}
//Ahora
public function store(LoginRequest $request)
{
$request->authenticate();
$request->session()->regenerate();
$user = auth()->user();
return response()->json([
'success' => true,
'data' => [
'token' => $user->createToken($user->name)->plainTextToken,
'name' => $user->name,
],
'message' => 'User logged in!'
]);
}
Ahora ya podemos capturar el user y el token al realizar login, ahora seguimos con el logout donde tenemos que eliminar el token creado cuando cerremos sesión
- Cerrando sesión
//Antes
public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return response()->noContent();
}
//Ahora
public function destroy(Request $request)
{
auth()->user()->tokens()->delete();
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return response()->noContent();
}
# Otros: Agregando paginación
public function index(Request $request)
{
$pageSize = $request->page_size ?? 3;
$articles = Article::paginate($pageSize);
return response()->json([
'success' => true,
'articles' => new ArticleCollection($articles),
'articles' => $articles, //Se agrega nuevamente para que aparezca la paginación, si no esta esto no enviara los demas datos y con el mismo nombre
//Puede hacer una prueba borrando o comentando la linea
]);
}