Diferència entre revisions de la pàgina «NF2 - Framework Laravel»
Línia 334: | Línia 334: | ||
<button type="submit">Crear</button> | <button type="submit">Crear</button> | ||
</form> | </form> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | <source lang="php"> | ||
+ | public function editar($id){ | ||
+ | |||
+ | $dato = Dato::findOrFail($id); | ||
+ | |||
+ | return view('editar', compact('dato')); | ||
+ | } | ||
+ | |||
+ | |||
+ | //en la vista de Editar | ||
+ | |||
+ | @if ($errors->any()) | ||
+ | <div class="alert alert-danger"> | ||
+ | <strong>Whoops!</strong> There were some problems with your input.<br><br> | ||
+ | <ul> | ||
+ | @foreach ($errors->all() as $error) | ||
+ | <li>{{ $error }}</li> | ||
+ | @endforeach | ||
+ | </ul> | ||
+ | </div> | ||
+ | @endif | ||
+ | |||
+ | <form method="post" action="{{ route('actualizar', $dato) }}"> //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto | ||
+ | <div > | ||
+ | @method('PATCH') | ||
+ | @csrf | ||
+ | |||
+ | <label for="name">nombre:</label> | ||
+ | <input type="text" name="nombre" value="{{ $dato->nombre }}"/> | ||
+ | </div> | ||
+ | <div > | ||
+ | <label for="descripcion">descripcion</label> | ||
+ | <input type="text" name="descripcion" value="{{ $dato->descripcion }}"/> | ||
+ | </div> | ||
+ | |||
+ | <button type="submit" >Actualizar</button> | ||
+ | </form> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | //hacer el actualizar | ||
+ | |||
+ | public function actualizar(Request $request, $id){ | ||
+ | |||
+ | $validacion=$request->validate([ | ||
+ | 'nombre' => 'required', | ||
+ | 'descripcion' => 'required', | ||
+ | ]); | ||
+ | |||
+ | $datos = Dato::find($id); | ||
+ | $datos->nombre = $request->get('nombre'); | ||
+ | $datos->descripcion = $request->get('descripcion'); | ||
+ | $datos->update(); | ||
+ | |||
+ | |||
+ | // Dato::whereId($id)->update($validacion); //otra opción | ||
+ | |||
+ | //return redirect()->route('index'); | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | <source lang="php"> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | <source lang="php"> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | <source lang="php"> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | <source lang="php"> | ||
</source> | </source> |
Revisió del 15:08, 1 nov 2019
ESTRUCTURA DIRECTORIOS
=RUTAS BÁSICAS
Dentro de Routers->Web
Route::get('mundo', function () {
return 'Hello World';
});
Creamos un controlador vacio, App->http->Controller->
php artisan make:controller MoviesController --plain
en route
Route::get('/ejemplo', 'PeliculasController@index');
en controlador
public function index(){
echo "hola Julio";
}
//verbos HTTP múltiples
Route::match(['get', 'post'], '/', function () {
//
});
//verbos HTTP cualquiera
Route::any('/', function () {
//
});
//dentro de la misma vista
Route::get('/show/{id?}',function($id="122"){
return $id;
})->name('show');
Route::get('/par-o-impar-{numero}',function($numero){ // no hace falta usar '/'
return $numero;
//return redirect()->to('/show/3'); -> te redirije a la ruta que le indicas
//return redirect()->route('show') -> te redirije a la ruta que tiene el nombre asignado en el name.
//return redirect()->route('show',['id' => '222']) -> en caso de pasarle algun parámetro
} )->where(['number' => '[\d]+']); // de esta forma añadimos una expresion regular para que solo puedan introducir numeros
Route::get('user/{name?}', function ($name = 'John') { //$name=null
return $name;
});
Restricciones con Expresiones Regulares
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+'); //nomes poden passar lletres miníscules o Majúscules como mínim una volta
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']); //le pasamos un array en caso de más de un elemento.
Route::group(['prefix'=>'admin'],function(){ // en el navegador puedes poner /admin/modificar-usuario o /admin/insertar-usuario
Route::get('modificar-usuario',function(){
return "modifica usuario";
});
Route::get('insertar-usuario',function(){
return "insertar usuario";
});
});
RELACIONES
Se deben de hacer las relaciones de la base de datos en las migraciones y también en los modelos para facilitar a Eloquent las consultas.
Relaciones Uno a Muchos Migraciones
un usuario tiene muchos post y un post lo tiene un usuario
//tabla Categories
Schema::create('categories', function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->text('nombre');
$table->mediumText('masInfo');
$table->timestamps();
});
//tabla Posts
Schema::create('posts', function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->integer('category_id')->unsigned();
$table->text('titulo');
$table->mediumText('descripcion');
$table->timestamps();
//relaciones
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade')->onUpdate('cascade');
//category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.
});
Para las relaciones NxM Muchos a Muchos.
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.
//Tabla Post
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
// $table->integer('user_id')->unsigned();
// $table->integer('category_id')->unsigned();
$table->string('name',128)->unique();
$table->string('slug',128)->unique();
$table->mediumText('excerpt')->nullable();
$table->text('body');
$table->enum('status',['PUBLISHED','DRAFT'])->default('DRAFT');
$table->string('file', 128)->nullable();
$table->timestamps();
//relaciones
//$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
//$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade')->onUpdate('cascade');
});
//tabla Tags
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name',128);
$table->string('slug',128)->unique();
$table->timestamps();
});
//tabla auxiliar
Schema::create('post_tag', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned();
$table->integer('tag_id')->unsigned();
$table->timestamps();
//relaciones
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade')->onUpdate('cascade');
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade')->onUpdate('cascade');
});
CRUD
Creas la tabla
php artisan make:migration create_blogs_table --create=blogs
Luego en la migración creas los campos para la base de datos
Schema::create('blogs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('blog_title');
$table->text('blog_content');
$table->timestamps();
});
Generas las rutas insertando el fichero Web
Route::resource('blogs','blogController');
//Para listar las rutas, en terminal
php artisan route:list -v
Creamos el modelo
php artisan make:model Blog
//dentro del modelo
class Blog extends Model
{
protected $fillable = ['blog_title', 'blog_content'];
//¿Qué atributos deberías incluir en dicho array?
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.
}
Creamos Controlador
php artisan make:controller blogController --resource
1.index()
2.create()
3.store()
4.show()
5.edit()
6.update()
7.destroy()
creamos la migracion
creamos el modelo
añadimos las rutas
public function index(){
$datos=Dato::all();
return view('index',['datos'=>$datos]);
}
//en la vista
@forelse ($datos as $item)
<li> {{$item->nombre}} {{$item->descripcion}} </li>
@empty
<li>NO HAY NADA </li>
@endforelse
public function almacenar(Request $request){
$datos=request()->validate([
'nombre'=>'required|max:25',
'descripcion'=>'required']
);
Dato::create($datos);
return redirect()->route('index');
//return back(); //te redirecciona a la misma página
}
//en la vista
@if ($errors->any())
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
<br/>
@endif
<form method="post" action="{{ route('almacenar') }}">
<div>
@csrf
<label for="name">Nombre:</label>
<input type="text" name="nombre" />
</div>
<div>
<label for="price">Descripcion:</label>
<input type="text" name="descripcion" />
</div>
<button type="submit">Crear</button>
</form>
public function editar($id){
$dato = Dato::findOrFail($id);
return view('editar', compact('dato'));
}
//en la vista de Editar
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post" action="{{ route('actualizar', $dato) }}"> //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto
<div >
@method('PATCH')
@csrf
<label for="name">nombre:</label>
<input type="text" name="nombre" value="{{ $dato->nombre }}"/>
</div>
<div >
<label for="descripcion">descripcion</label>
<input type="text" name="descripcion" value="{{ $dato->descripcion }}"/>
</div>
<button type="submit" >Actualizar</button>
</form>
</div>
</div>
//hacer el actualizar
public function actualizar(Request $request, $id){
$validacion=$request->validate([
'nombre' => 'required',
'descripcion' => 'required',
]);
$datos = Dato::find($id);
$datos->nombre = $request->get('nombre');
$datos->descripcion = $request->get('descripcion');
$datos->update();
// Dato::whereId($id)->update($validacion); //otra opción
//return redirect()->route('index');
}