Proyectos
Programación en Ambiente Web (11086) - 2020
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"
Tecnologías y Métodos vinculados a la etapa de desarrollo
Todo lo que pasa despues que el desarrollador termina su trabajo
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"
}
}
# 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
Directorio vendor/
Repositorios:
Propios (Github - Gitlab - Otro)
Packagist (default)
autoload.php
npm - node
pip - python
gems - ruby
maven - java
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
Estructura lógica para construir la app
Ocultamiento de la información
Bajo Acoplamiento
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
Abstraen la lógica de negocios o modelo de datos.
Controlador
Modelos
SGDB
Renderiza los modelos. Es como se "ve" la app
Controlador
Modelos
Usuario
Vistas
Respuesta
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.
Identifica 2 grandes propuestas
Separación de la Vista del Modelo
Separación de la Vista del Controlador
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
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
Separación de la Vista del Controlador
Menos importante
Ofrece la posibilidad de que
2 controladores pueden hacer uso
de la misma vista
Proyecto Derivado del Tutorial introductorio de Laracast
https://github.com/tomasdelvechio/The-PHP-Practitioner-Full-Source-Code
proyecto/
├── app/
│ ├── controllers/
│ ├── routes.php
│ └── views/
├── composer.json
├── composer.lock
├── config.php.example
├── core/
│ └── database/
├── index.php
├── logs/
├── public/
│ └── css/
├── README.md
├── sql/
└── vendor/
<?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');
}
<?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'])
));
<?php
return [
'database' => [
'name' => 'mytodo',
'username' => 'paw',
'password' => 'paw',
'connection' => 'mysql:host=127.0.0.1'
],
];
<?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');
<?php
namespace App\Controllers;
class PagesController
{
public function home()
{
return view('index');
}
public function about()
{
$company = 'Laracasts';
return view('about', ['company' => $company]);
}
}
<?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');
}
}
<?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'); ?>
<?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'];
}
}
[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.