# ⛓️ Controlador

### **Controladores**

Los controladores son el intermediario entre la vista (Lo que ve el usuario) y el modelo (Interacción con la base de datos).

Los controladores proporcionan una serie de métodos que manejan las solicitudes. Estas son llamadas de acciones. cada método público en un controlador es una acción, y es accesible desde una URL.

Una acción es responsable de interpretar la solicitud y crear la respuesta. Por lo general, las respuestas tienen la forma de una vista rende-rizada, pero también hay otras formas de crear respuestas.

Cada controlador creado debe heredar de la clase **Controller**, el **Controller** es la clase principal para todos los controladores de la aplicación. Esta clase está incluida en la biblioteca principal de Ligne.

```php
<?php 

class tasksController extends Controller
{
    //Code…
}
```

### **Acciones del controlador**

Las acciones del controlador son responsables de convertir los parámetros de solicitud en una respuesta para el usuario que realiza la solicitud.

Por convención, Ligne presenta una vista con una versión modulada del nombre de la acción. Crearemos un controlador de tareas como ejemplo, en el crearemos las acciones `allTack()`, `create()` y `edit()`

```php
<?php

class TasksController extends Controller //Herencia
{
    public function allTask()
    {
        //Código
    }
    
    public function create()
    {
        //Código
    }
    
    public function edit($id)
    {
        //Código
    }
}
```

Los archivos de vista de estas acciones serían `/View/Tasks/alltask.php`, `/View/Tasks/create.php` y `/View/Tasks/edit.php` El nombre del archivo de vista convencional es la versión en minúscula de la acción.

### **Interactuando con Vistas**

Los controladores interactúan con las vistas de varias maneras. Primero, pueden pasar datos a las vistas, usando `setData()`. También puede decidir qué archivo de vista usar desde el controlador.

El método `setData()` es la forma principal de enviar datos desde su controlador a su vista. Una vez que haya usado `setData()`, se puede acceder a la variable en su vista:

```php

//Algun controlador
$data['date'] = "Oct 2018";
//envía datos a la vista desde el controlador
$this->setData($data);

```

```php

//Accediendo a los datos en la vista
La fecha es: <strong><!--?= $date ?--></strong>

```

El método `setData()` también toma una matriz asociativa como su primer parámetro. A menudo, esto puede ser una forma rápida de asignar un conjunto de información a la vista.

El método `render()` se llama al final de cada acción del controlador. Este método realiza toda la lógica de la vista (utilizando los datos que ha enviado utilizando el método `setData()`), coloca la vista dentro del mismo layout.

```php
<?php

public function edit()
{
    $data['tasks'] = $tasks->showAllTasks();
    
    //envia datos a la vista
    $this->setData($data);
    
    //Renderiza la vista
    $this->render("index");
}
    
```

El método render() admite un segundo parámetro el cual es utilizado para establecer el título de la página;

```php

$this->render("index",'Index Page'); //Renderiza la vista con un titulo
    
```

Este habitualmente se coloca en la etiqueta `<title>` de `<html>` en el layout

```php

<title><?= $page_title ?></title>
    
```

Otras acciones que puede ejecutar este método es renderizar archivos de vistas de otros controladores o si tiene su proyecto por separado puedes cargar el `<head>`, `<body>` y `<footer>` por separado.

```php

$this->render('layout/head',null,true);
$this->render('layout/body',null,true);
$this->render('layout/footer',null,true);
    
```

Note que se ha especificado una ruta dentro del directorio `views` y el archivo que queremos cargar, pasamos el título de la página como `null` y un tercer parámetro como `true`, este último le indica a render que debe cargar un archivo de vista externo.

### **Interactuar con los modelos**

Por convicción los modelos se añaden a los controladores en la cabecera de las clases controladoras utilizando la palabra reservada `use`;

```php
<?php

use App\models\Tasks\Task;

class TasksController extends Controller
{
         //code...
}
```

Inmediatamente se utiliza la instrucción `use` en este caso del modelo `Task` podrá realizar instancias de la clase. Note que el use es el `namespace` de su clase. Los modelos se utilizarán siempre que sea necesaria la extracción de datos de la base de datos.

Puede aprender más sobre el [auto-cargador PSR-4](https://www.php-fig.org/psr/psr-4/)

### Recibiendo datos por medio de GET y POST

Las acciones pueden recibir parámetros tanto por GET como por POST

**GET**

Tomaremos la acción (metodo) `edit` como ejemplo, supongamos que el usuario ingreso a la vista de edición de una tarea con el ID `3`, una URL válida para esto sería la siguiente&#x20;

<http://localhost/app/tasks/edit/3>

```php
<?php

public function edit($id)
{
    $task = new TaskModel();
    // Alguna logica
    $data = $task->getTask($id); //$id = 3
    //envia datos a la vista
    $this->setData($data);
    
    //Renderiza la vista
    $this->render("edit");
}

```

**POST**

Ahora suponemos que el usuario realizo las ediciones de la tarea y envió estos datos por medio de POST. Supondremos que los datos fueron enviados a una acción (método) nombrado `updateTask` el cual procesara la solicitud del usuario.

```php
<?php

use App\models\Tasks\Task;

class TasksController extends Controller
{
    public function updateTask()
    {
        //Nos aseguramos que la petición realmente provenga por POST
        if ($_SERVER('REQUEST_METHOD') == 'POST') {
            $task = new TaskModel();
            //Obteniendo los datos que provienen del metodo POST
            $data = [
                'task_id' => $_POST['task_id'],
                'description' => $_POST['description']
            ];
            $task->update($data);
        }
    }
}

```

### **Control de flujo**

El método de control de flujo que usarás más a menudo es `redirect()`. Este método toma su primer parámetro en forma de una URL relativa a Ligne. Cuando un usuario ha realizado un pedido con éxito, es posible que desee redirigir los a una pantalla de éxito.

```php
<?php

public function create()
{
    $task= new Task();
    
    $title = $_POST['title'];
    $description = $_POST['description'];
    
    $task -> create( $title, $description);
    
    //Llevaremos el usuario hacia el index luego de creada la tarea
    $this -> redirect(array( 'controller'=>'tasks','action'=>'index' ) );
}

```

También se puede rediccionar pasando parámetros por la URL, por ejemplo:

```php

$this->redirect( array('controller'=>'tasks','action'=>'view'),$id );
    
```

Esto nos lleva a la siguiente `URL http://localhost/tasks/view/3`

El Segundo parámetro que `redirect()` admite es un parámetro para la `URL` enviada.

También puede usar una URL relativa o absoluta

```php

 $this->redirect ( '/ tasks / index' );
 $this->redirect ( 'http://www.github.com' );
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ligne-framework.gitbook.io/ligne-framework-php/documentacion/controlador.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
