開發人員推薦的安裝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/檢索