Manejo de recursos RESTful
La transferencia de estado representacional (REST) es un estilo arquitectónico para aplicaciones distribuidas, descritas por primera vez por Roy Fielding en su 2000 Tesis doctoral, «Estilos arquitectónicos y el diseño de arquitecturas de software basadas en red <https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm>`_. Puede que sea una lectura un poco seca, y es posible que encuentres el libro de Martin Fowler Modelo de madurez de Richardson<https://martinfowler.com/articles/richardsonMaturityModel.html> _ una introducción más suave.
REST ha sido interpretado, y malinterpretado, en más formas que la mayoría arquitecturas de software, y podría ser más fácil decir que cuanto más de los principios de Roy Fielding que se adoptan en una arquitectura, el La aplicación más «RESTful» sería considerada.
Higgs facilita la creación de API RESTful para sus recursos, con sus rutas de recursos y ResourceController.
Rutas de recursos
Puede crear rápidamente un puñado de rutas RESTful para un único recurso con el método resource()
. Este
crea las cinco rutas más comunes necesarias para el CRUD completo de un recurso: crear un nuevo recurso, actualizar uno existente,
enumere todo ese recurso, muestre un solo recurso y elimine un solo recurso. El primer parámetro es el recurso.
nombre:
<?php
$routes->resource('photos');
// Equivalent to the following:
$routes->get('photos/new', 'Photos::new');
$routes->post('photos', 'Photos::create');
$routes->get('photos', 'Photos::index');
$routes->get('photos/(:segment)', 'Photos::show/$1');
$routes->get('photos/(:segment)/edit', 'Photos::edit/$1');
$routes->put('photos/(:segment)', 'Photos::update/$1');
$routes->patch('photos/(:segment)', 'Photos::update/$1');
$routes->delete('photos/(:segment)', 'Photos::delete/$1');
Nota
The ordering above is for clarity, whereas the actual order the routes are created in, in RouteCollection, ensures proper route resolution
Importante
The routes are matched in the order they are specified, so if you have a resource photos above a get “photos/poll” the show action’s route for the resource line will be matched before the get line. To fix this, move the get line above the resource line so that it is matched first.
El segundo parámetro acepta una serie de opciones que se pueden utilizar para modificar las rutas que se generan. Mientras estos
las rutas están orientadas al uso de API, donde se permiten más métodos, puede pasar la opción websafe
para tenerla
generar métodos de actualización y eliminación que funcionen con formularios HTML:
<?php
$routes->resource('photos', ['websafe' => 1]);
// The following equivalent routes are created:
$routes->post('photos/(:segment)/delete', 'Photos::delete/$1');
$routes->post('photos/(:segment)', 'Photos::update/$1');
Cambiar el controlador utilizado
Puede especificar el controlador que debe usarse pasando la opción controller
con el nombre de
El controlador que se debe utilizar:
<?php
$routes->resource('photos', ['controller' => 'Gallery']);
// Would create routes like:
$routes->get('photos', '\App\Controllers\Gallery::index');
<?php
$routes->resource('photos', ['controller' => '\App\Gallery']);
// Would create routes like:
$routes->get('photos', '\App\Gallery::index');
<?php
use App\Controllers\Gallery;
$routes->resource('photos', ['namespace' => '', 'controller' => Gallery::class]);
// Would create routes like:
$routes->get('photos', '\App\Controllers\Gallery::index');
Véase también controladores-espacio de nombres.
Cambiar el marcador de posición utilizado
De forma predeterminada, el marcador de posición (:segmento)
se utiliza cuando se necesita un ID de recurso. Puedes cambiar esto pasando
en la opción placeholder
con la nueva cadena a usar:
<?php
$routes->resource('photos', ['placeholder' => '(:num)']);
// Generates routes like:
$routes->get('photos/(:num)', 'Photos::show/$1');
Limitar las rutas realizadas
Puedes restringir las rutas generadas con la opción solo
. Esto debería ser una matriz o una lista separada por comas de nombres de métodos que deberían
ser creado. Sólo se crearán rutas que coincidan con uno de estos métodos. El resto será ignorado:
<?php
$routes->resource('photos', ['only' => ['index', 'show']]);
De lo contrario, puede eliminar rutas no utilizadas con la opción excepto
. Esto también debería ser una matriz o una lista separada por comas de nombres de métodos. Esta opción se ejecuta después de solo
:
<?php
$routes->resource('photos', ['except' => 'new,edit']);
Los métodos válidos son: index
, show
, create
, update
, new
, edit
y delete
.
Controlador de recursos
El ResourceController
proporciona un punto de partida conveniente para su API RESTful,
con métodos que corresponden a las rutas de recursos anteriores.
Extiéndalo, anulando las propiedades modelName
y format
, y luego
implemente los métodos que desea manejar:
<?php
namespace App\Controllers;
use Higgs\RESTful\ResourceController;
class Photos extends ResourceController
{
protected $modelName = 'App\Models\Photos';
protected $format = 'json';
public function index()
{
return $this->respond($this->model->findAll());
}
// ...
}
La ruta para esto sería:
<?php
$routes->resource('photos');
Rutas del presentador
Puede crear rápidamente un controlador de presentación que alinee
con un controlador de recursos, usando el método presenter()
. Este
crea rutas para los métodos del controlador que devolverían vistas
para su recurso o procesar formularios enviados desde esas vistas.
No es necesario, ya que la presentación se puede manejar con un controlador convencional: es una comodidad. Su uso es similar al enrutamiento de recursos:
<?php
$routes->presenter('photos');
// Equivalent to the following:
$routes->get('photos/new', 'Photos::new');
$routes->post('photos/create', 'Photos::create');
$routes->post('photos', 'Photos::create'); // alias
$routes->get('photos', 'Photos::index');
$routes->get('photos/show/(:segment)', 'Photos::show/$1');
$routes->get('photos/(:segment)', 'Photos::show/$1'); // alias
$routes->get('photos/edit/(:segment)', 'Photos::edit/$1');
$routes->post('photos/update/(:segment)', 'Photos::update/$1');
$routes->get('photos/remove/(:segment)', 'Photos::remove/$1');
$routes->post('photos/delete/(:segment)', 'Photos::delete/$1');
Nota
The ordering above is for clarity, whereas the actual order the routes are created in, in RouteCollection, ensures proper route resolution
No tendría rutas para «fotos» tanto para un recurso como para un presentador controlador. Es necesario distinguirlos, por ejemplo:
<?php
$routes->resource('api/photo');
$routes->presenter('admin/photos');
El segundo parámetro acepta una serie de opciones que se pueden utilizar para modificar las rutas que se generan.
Cambiar el controlador utilizado
Puede especificar el controlador que debe usarse pasando la opción controller
con el nombre de
El controlador que se debe utilizar:
<?php
$routes->presenter('photos', ['controller' => 'Gallery']);
// Would create routes like:
$routes->get('photos', '\App\Controllers\Gallery::index');
<?php
$routes->presenter('photos', ['controller' => '\App\Gallery']);
// Would create routes like:
$routes->get('photos', '\App\Gallery::index');
<?php
use App\Controllers\Gallery;
$routes->presenter('photos', ['namespace' => '', 'controller' => Gallery::class]);
// Would create routes like:
$routes->get('photos', '\App\Controllers\Gallery::index');
Véase también controladores-espacio de nombres.
Cambiar el marcador de posición utilizado
De forma predeterminada, el marcador de posición (:segmento)
se utiliza cuando se necesita un ID de recurso. Puedes cambiar esto pasando
en la opción placeholder
con la nueva cadena a usar:
<?php
$routes->presenter('photos', ['placeholder' => '(:num)']);
// Generates routes like:
$routes->get('photos/(:num)', 'Photos::show/$1');
Limitar las rutas realizadas
Puedes restringir las rutas generadas con la opción solo
. Esto debería ser una matriz o una lista separada por comas de nombres de métodos que deberían
ser creado. Sólo se crearán rutas que coincidan con uno de estos métodos. El resto será ignorado:
<?php
$routes->presenter('photos', ['only' => ['index', 'show']]);
De lo contrario, puede eliminar rutas no utilizadas con la opción excepto
. Esto también debería ser una matriz o una lista separada por comas de nombres de métodos. Esta opción se ejecuta después de solo
:
<?php
$routes->presenter('photos', ['except' => 'new,edit']);
Los métodos válidos son: index
, show
, new
, create
, edit
, update
, remove
y ``delete`. `.
Presentador de recursos
ResourcePresenter
proporciona un punto de partida conveniente para presentar vistas
de su recurso y procesar datos de formularios en esas vistas,
con métodos que se alinean con las rutas de recursos anteriores.
Extiéndalo, anulando la propiedad modelName
y luego
implemente los métodos que desea manejar:
<?php
namespace App\Controllers;
use Higgs\RESTful\ResourcePresenter;
class Photos extends ResourcePresenter
{
protected $modelName = 'App\Models\Photos';
public function index()
{
return view('templates/list', $this->model->findAll());
}
// ...
}
La ruta para esto sería:
<?php
$routes->presenter('photos');
Comparación presentador/controlador
Esta tabla presenta una comparación de las rutas predeterminadas creadas por resource() y presentador() con sus correspondientes funciones de Controlador.