开发人员推荐的安装Slim的方法是通过PHP Composer。
如果您使用诸如Arch Linux之类的发行版或基于此分发,则作曲家位于官方存储库中,因此您可以与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 https://github.com/composer/windows-setup/releases/在Github的官方作曲家存储库的Composer-Setup.*.exe ,并按照您给您的安装程序的说明。
我们可以从头开始创建一个项目,也可以使用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的数据库:
我们创建用户表:
现在我们已经拥有数据库,我们必须将其添加到纤细的配置中。为此,我们打开位于src目录中的settings.php文件,其中包含以下内容:
<?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文件。乔恩(Jon)使用PHP PSR-4约定的自动加载映射。
"autoload" : {
"psr-4" : {
"App\" : "src/"
}
}现在,您必须创建应用程序模型。尽管Slim并未以常规方式遵循MVC设计模式(模型 - vista-controller),但我们应该为每个组件都有一个独家目录,因此我们将使用SRC explorer或使用src Directory的MKDIR模型在src/使用mkdir modelos中为模型创建一个目录。
众所周知,Slim没有用于默认对象冻结映射的工具。但是,它允许我们添加以PHP编写的另一个框架之一。在这种情况下,我们将使用Laravel的雄辩3 。
为了将雄辩的人添加到我们的泥泞中,我们必须首先要求作曲家将其添加到我们应用程序的依赖项中。
$ composer require illuminate/database " ~5.1 "然后,我们将应用程序的依赖性注入容器(以下简称CID )添加雄辩。我们打开src目录中的dependencies.php文件,然后添加
$ container [ ' db ' ] = function ( $ container ) {
$ capsule = new Illuminate Database Capsule Manager ;
$ capsule -> addConnection ( $ container [ ' settings ' ][ ' db ' ]);
return $ capsule ;
};要初始化应用程序中的雄辩,还必须在app->run();之前将其添加到public/index.php中;
$ capsule = $ app -> getContainer ()-> get ( ' capsule ' ); // toma el elemento capsule dentro del contenedor de la app
$ capsule -> bootEloquent (); // inicializa Eloquent我们在董事会内创建典范类。
<?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 ' ,
];
}我们还将在src中为应用程序驱动程序创建一个controladores 。创建目录后,我们将在其中创建一个有用的控制器类,该类将处理应用程序的操作。此外,正如我们的控制器将验证的那样,我们通过作曲家安装了验证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 and 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 );
}
}
}雄辩有三种消除元素从表中消除元素的方法:第一个是消除其主要密钥未知的模型实例,它使用delete函数,但其缺点是您必须在调用delete之前恢复整个实例;第二个是假设已知模型的主要键,它将调用消除模型的destroy函数,而无需恢复完整的实例。第三个选项是通过咨询,例如$eliminados = Usuario::where('nombre','like','C%')->delete();我将消除所有名称以“ C”开头的用户。此外,雄辩的具有软脱水,也就是说,该模型未从数据库中删除,但是添加了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 );
}
Slim路线的实现是由FastRoute 5构建的,并提供了能够使用最常用的HTTP方法的方法,即,获取,发布,发布,放置,删除,补丁程序,可以通过某种方式与any() Slim方法一起生成。另外,可以使用map()函数在单个路由上处理几种方法。在我们的应用程序中,路由在包含加载初始骨架页面视图的路由的src/routes.php文件中找到,我们不需要它,然后您可以在创建其他路由时删除或注释以指导您。我们将使用GET方法加载视图并查看用户,发布以创建用户,修补以更新用户和委托删除。
仅处理HTTP GET请求的路由使用Slim的get()方法,该方法作为参数(带有可选位置标记)和可以来自控制器或在同一路由上声明的回调函数接收。
$ app -> get ( ' / ' , function ( $ request , $ response , $ args ){
return $ this -> view -> render ( $ response , " index.twig " );
})-> setName ( ' inicio ' );该路线的操作是,对于“/”模式(这是服务器的初始模式),该函数返回响应响应模板index.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 ' );
与GET应用程序一样,Slim具有post()函数来处理发布请求。此功能还以参数为单位(带有可选位置标记)和回调功能的参数。
// ruta para crear un nuevo usuario
$ app -> post ( " /nuevo " , " ControladorUsuario:crea " );可以注意的是,此路由不使用setName()函数,因为已经存在具有相同模式(“/new”)的路由,但是使用不同的方法,两者都可以共享相同的名称。
对于Patch,上面提到的获取和发布也可以实现。因此,要更新,我们将有一些这种样式:
// 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没有生成其视图模板的工具,实际上,这些视图只是Slim实施的PSR-7 HTTP响应的主体的一部分,因此它们必然取决于路线。但是,它们可以由组件组件组件提供,并且它们本身提供了其中两个组件的实现,即树木和PHP视图。我个人更喜欢树枝,因为它导致了我的问题更少,而且通常它具有更清晰的结构,因为它的语法基于Jinja和Django模板。当然,就像Slim中的所有内容一样,组件的使用是一种口味问题,可以处理其他工具来产生我们的观点。
首先,与其他单元一样,我们将使用作曲家添加树枝。
$ composer require slim/twig-view
注意:如果要使用php-view而不是树枝,它仅替换slim/twig-view用slim/php-view
安装树枝后,还必须将其添加到应用程序的CID中,以便将其作为服务之一并可以使用它。
$ 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 %}
form 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结构
{% extends ' layout.twig ' %}
{% block content %}
<h1>{{ usuario.nombre }}</h1>
<h2>{{ usuario.correo }}</h2>
<img src="http: //i.imgur.com/Y9IVuHg.jpg"/>
{% endblock %}请记住,此框架的前提是仅使用您认为必要的东西,而不仅仅是使用。项目的规模是由您自己定义的,而不是由框架定义的。
1:Mariadbcom。 (2016)。 Mariadbcom。 2016年9月25日从https://mariadb.com/blog/why-should-should-you-migrate-mysql-mariadb检索。
2:如何以程序为手段安装作曲家?#。 (nd)。 2016年9月25日从https://getcomposer.org/doc/faqs/how-to-now-to-install-composer-programmately.md检索。
3:雄辩:入门 - 拉维尔 - 网络工匠的PHP框架。 (nd)。 2016年9月29日从https://lavel.com/docs/5.1/eloquent检索
4:有效验证。从https://websec.io/2013/04/01/effective-validation-with-with-recept.html检索Septamber 30,2016年30日。
5:N。(2016)。 FastTroute。 2016年10月12日从https://github.com/nikic/fastroute检索
CodeCourse(2016年4月13日)。从https://www.youtube.com/playlist?ist = plfffdthywgc_yy90xrdq6mrwwww042aec中检索的Slim 3的身份验证。
罗伯·艾伦(Rob Allen)的devnotes。 (2016年7月28日)。 2016年11月8日从https://akrabat.com/category/slim-framework/检索