informatica:programacion:php:frameworks:laravel:formularios
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
| informatica:programacion:php:frameworks:laravel:formularios [2023/06/10 14:26] – creado tempwin | informatica:programacion:php:frameworks:laravel:formularios [2023/06/10 15:30] (actual) – tempwin | ||
|---|---|---|---|
| Línea 61: | Línea 61: | ||
| </ | </ | ||
| + | Por tanto, cuando se envíe el formulario, se llamará al método '' | ||
| + | <code php> | ||
| + | public function store() | ||
| + | { | ||
| + | dd(" | ||
| + | } | ||
| + | </ | ||
| + | Esto no nos funcionará porque, por defecto, Laravel tiene protección contra CSRF (// | ||
| + | Para solucionarlo, | ||
| + | <code html5> | ||
| + | @extends(" | ||
| - | ===== Enviando y mostrando información en vistas ===== | + | @section(" |
| + | < | ||
| + | |||
| + | <form method=" | ||
| + | @csrf | ||
| + | |||
| + | </ | ||
| - | Sabemos cómo crear una vista, cómo mostrar información en esa vista, pero ahora queremos añadir en la vista información que recuperamos de la base de datos a través | + | Esa instrucción |
| - | Partimos de un método de nuestro '' | + | < |
| - | + | <form method="post" | |
| - | < | + | |
| - | // code | + | |
| - | public function show($product) | + | |
| - | { | + | |
| - | $product | + | |
| - | + | ||
| - | return view("products.show"); | + | |
| - | | + | |
| - | | + | |
| </ | </ | ||
| - | Para enviar información | + | ===== Datos provenientes de formularios ===== |
| + | |||
| + | Vamos a crear (almacenar) un producto | ||
| <code php> | <code php> | ||
| - | // code | + | public function |
| - | | + | { |
| - | { | + | $product = Product::create([ |
| - | $product = Product::findOrFail($product); | + | |
| - | + | | |
| - | | + | ' |
| - | " | + | ' |
| - | ]); | + | |
| - | + | | |
| - | } | + | |
| + | | ||
| + | } | ||
| </ | </ | ||
| - | A la vista estaremos enviando la variable '' | + | Veremos un string JSON con el producto creado a través del formulario. |
| - | Si vamos a la vista ('' | + | Versión abreviada cogiendo todo lo que llegue de un formulario: |
| - | + | ||
| - | <code html5> | + | |
| - | < | + | |
| - | <html lang=" | + | |
| - | < | + | |
| - | <meta charset=" | + | |
| - | < | + | |
| - | </ | + | |
| - | | + | <code php> |
| - | < | + | public function store() |
| - | < | + | { |
| - | | + | $product |
| - | | + | |
| - | | + | |
| - | </ | + | } |
| - | </ | + | |
| </ | </ | ||
| - | Usando [[https:// | + | <WRAP center round important 60%> |
| + | Los atributos que se asignarán a nuestro modelo a partir del formulario serán los que hayamos indicado en el array de '' | ||
| + | </ | ||
| - | ===== Blade: motor de plantillas | + | ===== Editando desde un formulario |
| - | [[https:// | + | Los métodos que modificaremos en nuestro ProductController serán '' |
| - | ==== Variables ==== | + | <code php> |
| - | + | public function edit($product) | |
| - | Para mostrar el contenido de una variable en Blade: | + | { |
| + | return view(" | ||
| + | " | ||
| + | ]); | ||
| + | } | ||
| - | < | + | public function update($product) |
| - | {{ $variable }} | + | { |
| + | } | ||
| </ | </ | ||
| - | Comentar para que no las procese ni las muestre: | + | Recordemos |
| - | < | + | < |
| - | {{-- $variable --}} | + | Route:: |
| - | </code> | + | |
| - | Si queremos que aparezca el texto tal cual (llaves incluidas), es decir, que Blade no evalúe nada: | + | Route:: |
| - | + | ||
| - | < | + | |
| - | @{{ $variable }} | + | |
| </ | </ | ||
| - | Esto es útil si estamos trabajando con un framework para el frontend como Vuejs, React o Angular ya que también utilizan la sintaxis de las dobles llaves para las variables. | + | Para el formulario |
| - | + | ||
| - | ==== Estructuras | + | |
| - | + | ||
| - | Por ejemplo, si tenemos en nuestro controlador: | + | |
| - | + | ||
| - | <code php> | + | |
| - | public function index() | + | |
| - | { | + | |
| - | $products = Product:: | + | |
| - | + | ||
| - | return view(" | + | |
| - | " | + | |
| - | ]); | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | En la vista ('' | + | |
| <code html5> | <code html5> | ||
| - | < | + | @extends("layout.master") |
| - | <html lang="en"> | + | |
| - | < | + | |
| - | <meta charset=" | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | @section(" |
| - | <h1>List of Products</h1> | + | <h1>Edit a product</h1> |
| | | ||
| - | | + | |
| - | <div class=" | + | @csrf |
| - | | + | @method(" |
| + | <div class=" | ||
| + | | ||
| + | <input class=" | ||
| </ | </ | ||
| - | @else | + | |
| - | | + | <label> |
| - | <table class=" | + | <input class=" |
| - | <thead class=" | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | < | + | |
| - | @foreach ($products as $product) | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | <td>{{ $product-> | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | @endforeach | + | |
| - | </ | + | |
| - | </table> | + | |
| </ | </ | ||
| - | @endif | + | <div class=" |
| - | </body> | + | < |
| - | </html> | + | <input class=" |
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <input class=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <select class=" | ||
| + | <option {{ $product-> | ||
| + | <option {{ $product-> | ||
| + | </ | ||
| + | </ | ||
| + | <div class=" | ||
| + | <button type=" | ||
| + | </div> | ||
| + | </form> | ||
| </ | </ | ||
| - | Para el caso de comprobar vacíos, existe otra estructura dedicada:: | + | Los navegadores solo procesan GET y POST, así que para forzar un tipo de petición, usamos '' |
| - | < | + | Para realizar la actualización del producto, en el controlador: |
| - | | + | |
| + | < | ||
| + | public function update($product) | ||
| + | { | ||
| + | | ||
| | | ||
| - | | + | $product-> |
| - | <div class=" | + | |
| - | This list of products is empty | + | |
| - | </div> | + | } |
| - | | + | |
| - | | + | |
| - | | + | |
| </ | </ | ||
| - | ===== Crear plantillas para las vistas | + | ===== Eliminar de la base de datos ===== |
| - | Para cuando tengamos componentes | + | En Laravel tenemos |
| - | Creamos, por ejemplo, '' | + | < |
| + | public function destroy($product) | ||
| + | { | ||
| + | $product = Product:: | ||
| + | |||
| + | $product-> | ||
| + | } | ||
| + | </ | ||
| - | <code html5> | + | Recordemos que debe existir una ruta: |
| - | < | + | |
| - | <html lang=" | + | |
| - | < | + | |
| - | <meta charset=" | + | |
| - | < | + | |
| - | </ | + | |
| - | | + | <code php> |
| - | @yield(' | + | Route:: |
| - | </ | + | |
| - | </ | + | |
| </ | </ | ||
| - | Con '' | + | Finalmente, para dar la opción de eliminar un producto, basta con crear un enlace, pero debe ser usando el método DELETE: |
| - | + | ||
| - | Las vistas que quieran utilizar esta plantilla tendrían que... | + | |
| <code html5> | <code html5> | ||
| - | @extends("layouts.master") | + | <form method=" |
| - | + | | |
| - | @section("content") | + | @method("DELETE") |
| - | + | <button type="submit" class=" | |
| - | < | + | </form> |
| - | + | ||
| - | @if (empty($products)) | + | |
| - | <div class="alert alert-warning"> | + | |
| - | This list of products is empty | + | |
| - | </ | + | |
| - | | + | |
| - | | + | |
| - | < | + | |
| - | <thead class=" | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | < | + | |
| - | @foreach ($products as $product) | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | @endforeach | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | @endif | + | |
| - | + | ||
| - | @endsection | + | |
| </ | </ | ||
informatica/programacion/php/frameworks/laravel/formularios.1686399980.txt.gz · Última modificación: por tempwin
