Способ установить Slim, рекомендованные его разработчиками, - это PHP Composer.
Если вы используете распределение, например Arch Linux или на основе этого, Composer находится в официальных репозиториях, поэтому вы можете установить его с Pacman.
# pacman -S composer
В случае, если нет, чтобы установить композитор записывает в консоли следующую команду:
$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
Или, если вы предпочитаете, вы можете использовать следующий скрипт 2 :
#! /bin/sh
EXPECTED_SIGNATURE= $( wget https://composer.github.io/installer.sig -O - -q )
php -r " copy('https://getcomposer.org/installer', 'composer-setup.php'); "
ACTUAL_SIGNATURE= $( php -r " echo hash_file('SHA384', 'composer-setup.php'); " )
if [ " $EXPECTED_SIGNATURE " = " $ACTUAL_SIGNATURE " ]
then
php composer-setup.php --quiet
RESULT= $?
rm composer-setup.php
exit $RESULT
else
>&2 echo ' ERROR: Invalid installer signature '
rm composer-setup.php
exit 1
fi
Сохраняется как install-composer.sh для выполнения его в терминале с командой
$ sh install-composer.sh
Примечание . С помощью этого метода мы можем обновлять композитор, но вы должны переместить файл composer.phar в папку /usr/local/bin/ с командой
# mv composer.phar /usr/local/bin/composer
Таким образом, вы можете выполнить композитор, написанный только composer в консоли вместо php <Directorio>composer.phar .
Если вы пользователь Windows, вы должны загрузить Composer-Setup.*.exe официального репозитория композитора в Github, который находится на https://github.com/composer/windows-setup/releases/ и следуйте инструкциям, которые вы даете вам установщика.
Мы можем создать проект с нуля или использовать скелет, предоставленный Slim, который дает нам простую конфигурацию для запуска приложения, вам просто нужно написать следующее в консоли:
$ composer create-proyect slim/slim-skeleton crud-slim
Это создаст новый каталог crud-slim с необходимыми файлами для начала написания приложения.
Структура каталога
crud-slim
├── composer.json
├── composer.lock
├── CONTRIBUTING.md
├── dirstruct.txt
├── logs
│ ├── app.log
│ └── README.md
├── phpunit.xml
├── public
│ └── index.php
├── README.md
├── src
│ ├── dependencies.php
│ ├── middleware.php
│ ├── routes.php
│ └── settings.php
├── templates
│ └── index.phtml
├── tests
│ └── Functional
│ ├── BaseTestCase.php
│ └── HomepageTest.php
└── vendor/...
Примечание. Совет vendor/ содержит много заместителя директора, но не рекомендуется редактировать любой из файлов, содержащихся здесь, так как это, где все подразделения, которые мы будем использовать в приложении и изменять их, повлияют на его работу.
Если мы выполним php -S localhost:8080 -t public public/index.php в каталоге нашего приложения и откроем наш браузер в localhost:8080 Следующее представление появится
Мы создаем базу данных с именем slim
$ mysql -u[nombre-de-usuario] -p
> CREATE DATABASE slim COLLATE = 'utf8_unicode_ci';
> u slim
Мы добавляем таблицу usuarios .
> CREATE TABLE usuarios ( ` id ` BIGINT NOT NULL AUTO_INCREMENT,
` nombre ` VARCHAR ( 250 ) NOT NULL ,
` correo ` VARCHAR ( 250 ) NOT NULL ,
` clave_acceso ` VARCHAR ( 250 ) NOT NULL ,
PRIMARY KEY ( ` id ` ));Мы создаем базу данных, которую мы будем использовать для CRUD:
Мы создаем таблицу пользователя:
Теперь, когда у нас есть база данных, мы должны добавить ее в тонкую конфигурацию. Для этого мы открываем файл settings.php , расположенный в каталоге src и который содержит следующее:
<?php
return [
' settings ' => [
' displayErrorDetails ' => true , // set to false in production
' addContentLengthHeader ' => false , // Allow the web server to send the content-length header
// Renderer settings
' renderer ' => [
' template_path ' => __DIR__ . ' /../templates/ ' ,
],
// Monolog settings
' logger ' => [
' name ' => ' slim-app ' ,
' path ' => __DIR__ . ' /../logs/app.log ' ,
' level ' => Monolog Logger:: DEBUG ,
],
],
];
Мы добавляем после поля logger конфигурацию нашей базы данных
//Configuración de base de datos para Slim
' db ' => [
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' database ' => ' slim '
'username' => '<tu nombre de usuario en mysql> ' ,
'password' => ' <tu contraseña> ' ,
'charset' => ' utf8',
' collation ' => ' utf8_unicode_ci ' ,
' prefix ' => '' ,
],
Кроме того, для автоматической загрузки классов, которые мы создадим позже, мы должны добавить в файл composer.json . Джон А автозагрузки с соглашением PHP PSR-4 .
"autoload" : {
"psr-4" : {
"App\" : "src/"
}
} Теперь вы должны создать модель приложения. Хотя SLIM не следит за шаблоном проектирования MVC (модель-виста-контроллер) обычным способом, у нас должен быть исключительный каталог для каждого компонента, поэтому мы создадим каталог для модели в src/ с нашим исследователем файлов или с командой mkdir modelos из каталога src .
Как мы знаем, Slim не имеет инструмента для картирования объекта по умолчанию. Тем не менее, это позволяет нам добавить одну из другой структуры, написанной в PHP; В этом случае мы будем использовать красноречивую 3 Ларавела.
Чтобы добавить красноречиво в нашу CRUD, мы должны сначала попросить композитора добавить его в зависимости нашего приложения.
$ composer require illuminate/database " ~5.1 " Затем мы добавляем красноречиво к контейнеру для инъекций зависимостей (далее CID ) приложения. Мы открываем файл dependencies.php , который находится в каталоге src , и добавляем его
$ container [ ' db ' ] = function ( $ container ) {
$ capsule = new Illuminate Database Capsule Manager ;
$ capsule -> addConnection ( $ container [ ' settings ' ][ ' db ' ]);
return $ capsule ;
}; Чтобы инициализация красноречивого в приложении, он также должен быть добавлен в public/index.php перед app->run();
$ capsule = $ app -> getContainer ()-> get ( ' capsule ' ); // toma el elemento capsule dentro del contenedor de la app
$ capsule -> bootEloquent (); // inicializa EloquentМы создаем класс Modelless в совете директоров.
<?php
namespace App Modelos ;
//importa Eloquent para usarlo en el modelo
use Illuminate Database Eloquent Model as Eloquent ;
n
class ModeloUsuario extends Eloquent
{
// Define la llave primaria de la tabla usuarios
protected $ primaryKey = ' id ' ;
// Define el nombre de la tabla
protected $ table = ' usuarios ' ;
// Define los campos que pueden llenarse en la tabla
protected $ fillable = [
' nombre ' ,
' correo ' ,
' clave_acceso ' ,
];
} Мы также создадим controladores в src для драйверов приложений. Как только каталог будет создан, мы создадим внутри него полезный класс контроллера , который будет обрабатывать работу приложения. Кроме того, как будет проверять наши контроллеры, мы устанавливаем инструмент проверки 4 валидации через композитор .
$ composer require respect/validation
<?php
namespace App Controladores ;
use App Modelos ModeloUsuario as Usuario ; // para usar el modelo de usuario
use Slim Views Twig ; // Las vistas de la aplicación
use Slim Router ; // Las rutas de la aplicación
use Respect Validation Validator as v ; // para usar el validador de Respect
/**
* Clase de controlador para el usuario de la aplicación
*/
class ControladorUsuario
{
// objeto de la clase Twig
protected $ view ;
// objeto de la clase Router
protected $ router ;
/**
* Constructor de la clase Controller
* @param type SlimViewsTwig $view - Vista
* @param type SlimRouter $router - Ruta
*/
public function __construct ( Twig $ view , Router $ router )
{
$ this -> view = $ view ;
$ this -> router = $ router ;
}
/**
* Verifica que los parametros que recibe el controlador sean correctos
* @param type array $args - los argumentos a evaluar
*/
public function validaArgs ( $ args )
{
$ valid = [
// verifica que la id sea un entero
v:: intVal ()-> validate ( $ args [ ' id ' ]),
// verifica que se reciba una cadena de al menos longitud 2
v:: stringType ()-> length ( 2 )-> validate ( $ args [ ' nombre ' ]),
// verifica que se reciba un correo
v:: email ()-> validate ( $ args [ ' correo ' ]),
// verifica que no esté en blanco la contraseña
v:: notBlank ()-> validate ( $ args [ ' clave_acceso ' ])
];
}
/**
* Verifica la correctud de un conjunto de validaciones
* @param type array $validaciones - el conjunto de validaciones a evaluar
* @throws Exception cuando las validaciones no están en un arreglo
*/
public static function verifica ( $ validaciones )
{
if (! is_array ( $ validaciones ){
throw new Exception ( ' Las validaciones deben estar en un arreglo ' );
} else {
foreach ( $ validaciones as $ v ){
if ( $ v == false ) {
return false ; // todas las validaciones deben cumplirse para que sea correcto
}
}
return true ;
}
}
/*-- Funciones del CRUD --*/
}Вы также должны добавить пользователя в приложение приложения, чтобы оно мог его использовать.
$ container [ ' ControladorUsuario ' ] = function ( $ container ){
return new App Controladores ControladorUsuario ( $ container );
}; Напомним, что в ModelUsuario мы определяем заполненную часть для таблицы, это связано с тем, id определяется в базе данных как повышенный атрибут автоматического, тогда нам нужно только ввести другие 3 поля в базу данных, и мы сделаем это с этой функцией:
/**
* Función para crear un usuario
* @param type SlimHttpRequest $request - solicitud http
* @param type SlimHttpResponse $response - respuesta http
*/
public function crea ( $ request , $ response , $ args )
{
/*
getParsedBody() toma los parametros del cuerpo de $request que estén
como json o xml y lo parsea de un modo que PHP lo entienda
*/
$ param = $ request -> getParsedBody ();
$ validaciones = $ this -> validaArgs ( $ param ); // hace las validaciones
if ( verifica ( $ validaciones )){
// evalua si el correo ya existe en la base de datos
$ correo_existente = Usuario:: where ( ' correo ' , $ atr [ ' correo ' ])-> get ()-> first ();
// si el correo ya existe manda un error 403
if ( $ correo_existente ){
echo -> $ this -> error ( ' YA_ESTÁ_REGISTRADO_EL_CORREO ' ,
$ request -> getUri ()-> getPath (),
404 );
return $ this -> response -> withStatus ( 403 );
} else {
//crea un nuevo usuario a partir del modelo
$ usuario = new Usuario ;
// asigna cada elemento del arreglo $atr con su columna en la tabla usuarios
$ usuario -> nombre = $ atr [ ' nombre ' ];
$ usuario -> correo = $ atr [ ' correo ' ];
$ usuario -> clave_acceso = $ atr [ ' clave_acceso ' ];
$ usuario -> save (); //guarda el usuario
// crea una ruta para el usuario con su id
$ path = $ request -> getUri ()-> getPath () . ' / ' . $ usuario -> id ;
return $ response -> withStatus ( 201 ); // el usuario fue creado con éxito
}
}
} Здесь иллюстрируются две функции, одна, чтобы показать всех зарегистрированных пользователей, а другая, где показывает конкретный пользователь. Структура lista.twig и usuario.twig упомянуты более подробно в разделе просмотра.
/**
* Obtiene todos los usuarios de la tabla usuarios y los manda a la vista
* @param type SlimHttpRequest $request - solicitud http
* @param type SlimHttpResponse $response - respuesta http
*/
public function listaUsuarios ( $ request , $ response , $ args )
{
/*
la vista manda un arreglo de usuarios con la respuesta http,
para que lo renderice en en el template lista.twig
*/
return $ this -> view -> render ( $ response , ' lista.twig ' , [ ' usuarios ' => Usuario:: all ()]);
}
/**
* Busca un usuario por su id
* @param type SlimHttpRequest $request - la solicitud http
* @param type SlimHttpResponse $response - la respuesta http
* @param type array $args - argumentos para la función
*/
public function buscaUsuarioID( $ request , $ response , $ args )
{
$ id = $ args [ ' id ' ];
$ valid = [v:: intVal ()-> validate ( $ id )]; // verifica que la id sea un entero
n
// si la validación es correcta
if ( $ valid == true ){
$ usuario = Usuario:: find ( $ id ); // busca la id en la tabla usuarios
if ( $ usuario ){
/*
si el usuario es encontrado, manda una respuesta con éste
y lo renderiza en el template usuario.twig
*/
return $ this -> view -> render ( $ response , ' usuario.twig ' , $ usuario );
} else {
/*
Si no hay un usuario con la id de los parametros, entonces obtiene la uri de la solicitud,
redirecciona a la lista de usuarios y regresa una respuesta con la uri y un status 404 (not found)
*/
$ status = 404 ;
$ uri = $ request -> getUri ()-> withQuery ( '' )-> withPath ( $ this -> router -> pathFor ( ' listaUsuarios ' ));
return $ response -> withRedirect (( string ) $ uri , $ status );
} else {
// si la validación es falsa, regresa un error de bad request
return $ response -> withStatus ( 400 );
}
} Пример функции для обновления пользователя.
/**
* Actualiza un usuario
* @param type SlimHttpRequest $request - la solicitud http
* @param type SlimHttpResponse $response - la respuesta http
* @param type array $args - argumentos para la función
*/
public function actualiza ( $ request , $ response , $ args )
{
// busca un usuario la id del arreglo de parametros en la tabla usuarios
$ usuario = Usuario:: find (( int ) $ args [ ' id ' ]);
if (! $ usuario ){
/*
Si no hay un usuario con la id de los parametros, entonces obtiene la uri de la solicitud,
redirecciona a la lista de usuarios y regresa una respuesta con la uri y un estado 404 (not found)
*/
$ status = 404 ;
$ uri = $ request -> getUri ()-> withQuery ( '' )-> withPath ( $ this -> router -> pathFor ( ' listaUsuarios ' ));
return $ response -> withRedirect (( string ) $ uri , $ status );
} else {
$ data = $ request -> getParsedBody (); // guarda los argumentos de la solicitud en un arreglo
$ validaciones = $ this -> valida ( $ data ); // valida los datos
if ( verifica ( $ validaciones )){
$ usuario -> update ( $ data ); // Eloquent actualiza la información en la tabla
// regresa una respuesta con la uri y redirecciona a la vista especifica del usuario
$ uri = $ request -> getUri ()-> withQuery ( '' )-> withPath ( $ this -> router -> pathFor ( ' usuario ' , [ ' id ' => $ usuario -> id ]));
return $ response -> withRedirect (( string ) $ uri );
}
}
} У Elofent есть три способа устранить элементы из таблицы: первым является исключение экземпляра модели, из которой его первичный ключ не известен, он использует функцию delete , но ее недостаток заключается в том, что вы должны восстановить весь экземпляр, прежде чем вызовать delete ; Во -вторых, предполагая, что основной ключ модели известен, вызывает функцию destroy , которая устраняет модель без необходимости восстановить полный экземпляр; Третий вариант-по консультациям, например, $eliminados = Usuario::where('nombre','like','C%')->delete(); Я бы исключил всех пользователей, чье имя начинается с "C". Кроме того, Elofent имеет мягкое оборудование , то есть модель не удаляется из базы данных, но добавляется атрибут deleted_at , и, как рекомендовано разработчиками Laravel, в таблицу следует добавить столбец, чтобы содержать указанные атрибуты. Чтобы включить метод мягкого деостинга в приложении, вы должны добавить в модели приложения IlluminateDatabaseEloquentSoftDeletes . В следующем примере используется delete для выполнения проверки и обеспечения большей надежности перед устранением моделей, вы можете использовать любой из доступных вариантов.
/**
* Elimina un usuario
* @param type SlimHttpRequest $request - la solicitud http
* @param type SlimHttpResponse $response - la respuesta http
* @param type array $args - argumentos para la función
*/
public function elimina ( $ request , $ response , $ args )
{
$ usuario = Usuario-> find ( $ args [ ' id ' ]);
$ validaID = [v:: intVal ()-> validate ( $ id )];
if ( $ usuario && $ validaID ){
// si existe el usuario y la validación es correcta, lo elimina
$ usuario -> delete ();
}
/*
regresa una respuesta con la uri y redirecciona a la lista de usuarios,
se haya o no eliminado el usuario
*/
$ uri = $ request -> getUri ()-> withQuery ( '' )-> withPath ( $ this -> router -> pathFor ( ' listaUsuarios ' ));
return $ response -> withRedirect (( string ) $ uri );
}
Реализация тонких маршрутов была построена из Fastroute 5 и предоставляет методы, чтобы иметь возможность работать с наиболее часто используемыми методами HTTP, то есть получить , post , plot , delete , patch , варианты , с которыми можно обрабатывать один за другим или все, чтобы генерировать с помощью any() Slim метода. Кроме того, можно обработать несколько методов по одному маршруту, используя функцию map() . В нашем приложении маршруты находятся в файле src/routes.php , который содержит маршрут, который загружает представление на начальной странице скелета, нам не нужно, чем вы можете удалить или прокомментировать, чтобы направлять вас при создании других маршрутов. Мы будем использовать методы GET для загрузки представлений и просматривать пользователей, публиковать для создания пользователей, исправления , чтобы обновить пользователя и делегировать для удаления.
Маршруты, которые обрабатывают только HTTP GET -запросы, используют метод get() SLIM, который получает в качестве аргументов с шаблоном маршрута (с дополнительными маркерами положения) и функцию обратного вызова, которая может исходить от контроллера или объявлять по тому же маршруту.
$ app -> get ( ' / ' , function ( $ request , $ response , $ args ){
return $ this -> view -> render ( $ response , " index.twig " );
})-> setName ( ' inicio ' ); Этот маршрут делает, так это то, что для шаблона «/» (который был бы начальным шаблоном сервера), чтобы вызвать функцию, которая возвращается в ответ на представление, определенное в index.twig шаблона. Twig Уже этот маршрут назначает имя «Дом», чтобы представления могли их легче интерпретировать их.
// ruta para cargar la vista de todos los usuarios registrados
$ app -> get ( ' /listaUsuarios ' , function ( $ request , $ response , $ args ){
return $ this -> view -> render ( $ response , ' listaUsuarios.twig ' );
})-> setName ( ' listaUsuarios ' );
/*
ruta para cargar la vista de un usuario en especifico definido por su id
empleando la función buscaUsuarioID() de la clase ControladorUsuario,
previamente agregada al CID de la aplicación
*/
$ app -> get ( ' /listaUsuarios/{id} ' , ' ControladorUsuario:buscaUsuarioID ' )-> setName ( ' usuario.ver ' );
// ruta para cargar el formulario para crear usuario
$ app -> get ( ' /nuevo ' , function ( $ request , $ response , $ args ){
return $ this -> view -> render ( $ response , ' formulario_crea.twig ' );
})-> setName ( ' usuario.crear ' );
// ruta para cargar el formulario para actualizar usuario
$ app -> get ( ' /listaUsuarios/{id}/actualiza ' , function ( $ request , $ response , $ args ){
return $ this -> view -> render ( $ response , ' formulario_actualiza.twig ' );
})-> setName ( ' usuario.editar ' );
Как и в случае получения приложений, Slim имеет функцию post() для обработки запросов POST . Эта функция также получает в качестве параметров шаблон маршрута (с дополнительными маркерами положения) и функции обратного вызова.
// ruta para crear un nuevo usuario
$ app -> post ( " /nuevo " , " ControladorUsuario:crea " ); Можно отметить, что этот маршрут не использует функцию setName() потому что уже есть маршрут с одним и тем же шаблоном («/new»), но используя разные методы, оба могут использовать одно и то же имя.
Для патча то, что упоминается выше, также выполняется для Get и Post . Итак, чтобы обновить, у нас будет часть этого стиля:
// ruta para actualizar un usuario
$ app -> patch ( ' listaUsuarios/{id} ' , ' ControladorUsuario:actualiza ' )-> setName ( ' usuario.actualizar ' ); // ruta para eliminar un usuario
$ app -> delete ( ' listaUsuario/{id} ' , ' ControladorUsuario:elimina ' )-> setName ( ' usuario.eliminar ' );Мы уже знаем, что Slim не имеет инструмента для генерации шаблонов их взглядов и, на самом деле, взгляды являются лишь частью тела ответов HTTP PSR-7, которые тонкие реализуют, поэтому они обязательно зависят от маршрутов. Тем не менее, они могут быть предоставлены компонентами компонентов компонентов , и они сами предоставляют реализации двух из этих компонентов, Twig и PHP-вида . Я лично предпочитаю веточку, так как это вызвало у меня меньше проблем, и в целом он имеет более четкую структуру, потому что его синтаксис основан на шаблонах джинджи и django. Конечно, как и все в Slim, использование компонентов является вопросом вкуса, и другие инструменты могут быть обработаны для создания наших взглядов.
Во -первых, и, как и в случае остальных единиц, мы добавим веток с помощью композитора .
$ composer require slim/twig-view
ПРИМЕЧАНИЕ . Если вы хотите использовать php-view вместо ветки , он только заменяет slim/twig-view с помощью slim/php-view
После установки Twig его также необходимо добавить в CID приложения, чтобы Slim регистрировал его в качестве одной из служб и могла его использовать.
$ container [ ' view ' ] = function ( $ c ) {
$ settings = $ c -> get ( ' settings ' )[ ' renderer ' ]; //nos indica el directorio donde están las plantillas
$ view = new Slim Views Twig ( $ settings [ ' template_path ' ], [
' cache ' => false ,]); // puede ser false o el directorio donde se guardará la cache
// instancia y añade la extensión especifica de slim
$ basePath = rtrim ( str_ireplace ( ' index.php ' , '' , $ c [ ' request ' ]-> getUri ()-> getBasePath ()), ' / ' );
$ view -> addExtension ( new Slim Views TwigExtension ( $ c [ ' router ' ], $ basePath ));
return $ view ;
};В базовой структуре ветки мы найдем 3 типа делимиторов:
Поскольку дизайн веточки основан на шаблонах, мы можем создать layout.twig .
<! DOCTYPE html>
<html>
<head>
<title> CRUD SLIM </title>
<meta charset="utf- 8 ">
<meta name="viewport" content="width=device-width, initial-scale= 1 ">
{% block stylesheets %}
{ # Aquí incluimos los archivos CSS o CDN de CSS que usemos #}
<link href="url de cdn" type="text/css" rel="stylesheet" />
{ # la función base_url() le indica a twig que busque desde el directorio raíz de proyecto #}
<link href="{{ base_url() }}/directorio/de/css" type="text/css" rel="stylesheet" />
{% endblock %}
{%block scripts }
{ # Aqui incluimos los .js y otros scripts
<script src="{{ base_url() }}/directorio/de/scripts"></script>
{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</div>
</body>
</html> Мы можем, чтобы шаблоны наследовали от layout.twig в другом каталоге, например, templates/crud чтобы сохранить иерархию, организованную между ними.
Если мы запомним маршруты, представление, которое загружается при запуске приложения, - это index.twig , которая будет иметь такую структуру, как следующее:
{% extends ' layout.twig ' %}
{% block content %}
{ # la función path_for('') llama la ruta con el nombre que recibe como parametro #}
<a href="{{ path_for ( ' listaUsuarios ' ) }} " >Lista los usuarios registrados</a>
<a href= " {{ path_for ( ' usuario.crear ' ) }} " >Agrega un nuevo usuario</a>
{% endblock %}
Форма formulario_crea.twig
{% extends ' layout.twig ' %}
{% block content %}
{ # manda los datos del formulario a la ruta 'usuario.crear' con un método post #}
<form action="{{ path_for ( ' usuario.crear ' ) }} " method= " post" autocomplete="off">
<label for="nombre">Nombre
<input type="text" name="nombre" id="nombre" placeholder="Escribe tu nombre">
</label>
<label for="correo">Correo
<input type="email" name="correo" id="correo" placeholder="Escribe tu correo">
</label>
<label for="clave_acceso">Contraseña
<input type="password" name="clave_acceso" id="clave_acceso" placeholder="Escribe tu contraseña">
<button type="submit">Agregar</button>
{% endblock %} Форма formulario_actualiza.twig
{% extends ' layout.twig ' %}
{% block content %}
{ # manda los datos del formulario a la ruta 'usuario.actualizar' con un método patch #}
<form action="{{ path_for ( ' usuario.actualizar ' ) }} " method= " patch" autocomplete="off">
<label for="nombre">Nombre
<input type="text" name="nombre" id="nombre" placeholder="Escribe tu nombre">
</label>
<label for="correo">Correo
<input type="email" name="correo" id="correo" placeholder="Escribe tu correo">
</label>
<label for="clave_acceso">Contraseña
<input type="password" name="clave_acceso" id="clave_acceso" placeholder="Escribe tu contraseña">
<button type="submit">Actualiza</button>
{% endblock %} listaUsuario.twig
{% extends ' layout.twig ' %}
{% block content %}
<table>
<thead>
<tr>
<th>Nombre</th>
<th>Correo</th>
</tr>
</thead>
<tbody>
{ # itera la tabla usuarios del modelo #}
{% for usuario in usuarios %}
<tr>
<td>{{ usuario.nombre }}</td>
<td>{{ usuario.correo }}</td>
<td><a href="{{ path_for ( ' usuario.ver ' ) }} " >ver</a></td>
<td><a href= " {{ path_for ( ' usuario.eliminar ' ) }} " >eliminar</a><td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %} usuario.twig структура.twig
{% extends ' layout.twig ' %}
{% block content %}
<h1>{{ usuario.nombre }}</h1>
<h2>{{ usuario.correo }}</h2>
<img src="http: //i.imgur.com/Y9IVuHg.jpg"/>
{% endblock %}Помните, что предпосылка этой структуры состоит в том, чтобы использовать только то, что вы считаете необходимым и не более, чем это; Масштаб вашего проекта определяется на вас, а не рамками.
1: Мариадбком. (2016). MARIADBCOM. Получено 25 сентября 2016 г. с https://mariadb.com/blog/why-should-you-migrate-mysql-mariadb.
2: Как установить композитор программно?#. (ND). Получено 25 сентября 2016 г. с https://getcomposer.org/doc/faqs/how-to-install-composer-programmalycaly.md.
3: красноречивая: начало - Ларавель - PHP -структура для веб -ремесленников. (ND). Получено 29 сентября 2016 г. с https://lavel.com/docs/5.1/eloquent
4: Эффективная проверка с уважением. Получено 30 сентября 2016 г., с https://websec.io/2013/04/01/effective-validation-dheth-respect.html
5: Н. (2016). Fasttroute. Получено 12 октября 2016 г. с https://github.com/nikic/fastroute
Кодекс (2016, 13 апреля). Аутентификация с Slim 3 Получено с https://www.youtube.com/playlist?ist=plfdthywgc_yy90xrdq6mrww042aec
Девнот Роба Аллена. (2016, 28 июля). Получено 8 ноября 2016 г. с https://akrabat.com/category/slim-framework/