Tecnologías del lado del servidor

Proyectos

Programación en Ambiente Web (11086) - 2020

Proyectos

La documentación es parte del proyecto

Un proyecto es mas que código

Es un conjunto de servicios interactuando entre si de forma coordinada para cumplir objetivos

Para ser escalables se utilizan patrones y librerías. También se usan estrategias para build y deploy.

Ademas que los lenguajes tienen "buenas practicas"

DevOps

DevOps: Desarrollo

Tecnologías y Métodos vinculados a la etapa de desarrollo

DevOps: Operaciones

Todo lo que pasa despues que el desarrollador termina su trabajo

DevOps: Workflow

Librerías y Dependencias

Composer

Gestión de dependencias

Scope: Por proyecto

También puede ejecutar tareas de install

composer.json

{
    "require": {
        "monolog/monolog": "1.0.*"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/username/hello-world"
        }
    ],
    "require": {
        "acme/hello-world": "dev-master"
    }
}

Composer - Uso

# Agrega paquete a composer.json y lo instala

$ composer require

# Instala las librerías necesarias respetando
# las versiones indicadas en el repositorio

$ composer install

# Instala las librerías necesarias
# usando las ultimas disponibles indicadas

$ composer update

Composer - Funcionamiento

Directorio vendor/

 

 

Repositorios:

Propios (Github - Gitlab - Otro)

Packagist (default)

 

 

autoload.php

Otros lenguajes

npm - node

pip - python

gems - ruby

maven - java

MVC

MVC

Modelo - Vista - Controlador

 

 

Patrón de Diseño de la OOP - No es de los basicos, es una combinación de otros [Gamma, 1995]

 

 

Smalltalk - XEROX - PARC - 1978

MVC - Objetivos

  • Estructura lógica para construir la app

     

  • Ocultamiento de la información

     

  • Bajo Acoplamiento

MVC - Controller

Mapea acciones del

usuario a acciones
sobre los modelos.


 

Define comportamiento
de la App.


 

Define que modelos se utilizan y que vistas se utilizan para crear la respuesta.

Usuario

Controlador

Petición

MVC - Models

Abstraen la lógica de negocios o modelo de datos.

Controlador

Modelos

SGDB

MVC - View

Renderiza los modelos. Es como se "ve" la app

Controlador

Modelos

Usuario

Vistas

Respuesta

MVC -[Fowler, 2002]

Model: Objeto que representa informacion sobre el dominio. El modelo es parte no visual.

 

Vista: Como se muestra el modelo al usuario. La vista es solamente sobre como los datos son mostrados.

 

Controlador: Maneja los cambios en la informacion que se producen desde la vista y deban ser comunicados al modelo.

MVC -[Fowler, 2002]

Identifica 2 grandes propuestas

 

 

Separación de la Vista del Modelo

Separación de la Vista del Controlador

MVC -[Fowler, 2002]

Separación de la Vista del Modelo
 

  • Conceptos diferentes

    • Problemáticas diferentes

    • Librerías diferentes

    • Permite especialización profesional
       

  • Interfaces

    • Diferentes diseño

    • Diferentes Apps
       

  • Testing de Conceptos

MVC -[Fowler, 2002]

Separación de la Vista del Modelo
 

 

Dependencia de componentes afecta
como repercuten los cambios

 

 

Diseño del modelo no depende de Vista

 

 

Cambios en la Vista no afectan Modelo

MVC -[Fowler, 2002]

Separación de la Vista del Controlador

 

 

Menos importante

 

 

Ofrece la posibilidad de que

2 controladores pueden hacer uso

de la misma vista

Proyecto

Proyecto:

MVC mini-framework

Proyecto Derivado del Tutorial introductorio de Laracast

 

https://github.com/tomasdelvechio/The-PHP-Practitioner-Full-Source-Code

 

https://paw.page.link/mvc-n2

Estructura del proyecto

proyecto/
├── app/
│   ├── controllers/
│   ├── routes.php
│   └── views/
├── composer.json
├── composer.lock
├── config.php.example
├── core/
│   └── database/
├── index.php
├── logs/
├── public/
│   └── css/
├── README.md
├── sql/
└── vendor/

index.php

<?php

require 'vendor/autoload.php';
require 'core/bootstrap.php';

use App\Core\{App, Router, Request};

try {
	Router::load('app/routes.php')
	    ->direct(Request::uri(), Request::method());
} catch (Exception $e) {
	http_response_code(500);
	Router::load('app/routes.php')
            ->direct('internal_error', 'GET');
}

core/bootstrap.php

<?php

use App\Core\App;
use App\Core\Database\{QueryBuilder, Connection};

App::bind('config', require 'config.php');

App::bind('database', new QueryBuilder(
    Connection::make(App::get('config')['database'])
));

config.php

<?php

return [
    'database' => [
        'name' => 'mytodo',
        'username' => 'paw',
        'password' => 'paw',
        'connection' => 'mysql:host=127.0.0.1'
    ],
];

app/routes.php

 <?php

$router->get('', 'PagesController@home');
$router->get('about', 'PagesController@about');
$router->get('contact', 'PagesController@contact');

$router->get('users', 'UsersController@index');
$router->post('users', 'UsersController@store');

app/controllers/PagesController.php

<?php

namespace App\Controllers;

class PagesController
{
    public function home()
    {
        return view('index');
    }

    public function about()
    {
        $company = 'Laracasts';

        return view('about', ['company' => $company]);
    }
}

app/controllers/UsersController.php

<?php

namespace App\Controllers;

use App\Core\App;

class UsersController
{
    public function index()
    {
        $users = App::get('database')->selectAll('users');

        return view('users', compact('users'));
    }

    public function store()
    {
        App::get('database')->insert('users', [
            'name' => $_POST['name']
        ]);

        return redirect('users');
    }
}

app/views/users.view.php

<?php require('partials/head.php'); ?>

    <h1>All Users</h1>

<?php foreach ($users as $user) : ?>
    <li><?= $user->name; ?></li>
<?php endforeach; ?>

<h1>Submit Your Name</h1>

<form method="POST" action="/users">
    <input name="name"></input>
    <button type="submit">Submit</button>
</form>

<?php require('partials/footer.php'); ?>

core/Request.php

<?php

namespace App\Core;

class Request
{
    /**
     * Fetch the request URI.
     *
     * @return string
     */
    public static function uri()
    {
        return trim(
            parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'
        );
    }

    /**
     * Fetch the request method.
     *
     * @return string
     */
    public static function method()
    {
        return $_SERVER['REQUEST_METHOD'];
    }
}

Ejercicios

Ejercicios - Enunciados

  • Agregar una nueva ruta valida "/social"
     
  • La vista de dicha ruta debe mostrar un listado de redes sociales: Twitter, Facebook, Ig, Github.

Ejercicios - Forma de trabajo

  • Generar un fork del proyecto
    • Poner un nombre descriptivo

 

  • Clonar el proyecto forkeado y resolver el TP

Bibliografia

  • [POSA, 1996] Buschmann, F., Meunier, R., Rohnert, H., Sommerlad, P., & Stal, M. (1996). A system of patterns: Pattern-oriented software architecture.

  • [Fowler, 2002] Fowler, M. (2002). Patterns of enterprise application architecture. Addison-Wesley Longman Publishing Co., Inc.

  • [Gamma, 1995] Helm, R., Johnson, R. E., Gamma, E., & Vlissides, J. (2000). Design patterns: elements of reusable object-oriented software. Braille Jymico Incorporated.

Backend Programming 3

By Tomas Delvechio

Backend Programming 3

PHP - MVC y Proyectos

  • 982