前一部分如何使用PHP,Slim和MySQL创建REST API,我们已经学习了有关REST API的基本概念,并通过安装所需的工具来准备好您的开发环境。我希望每个人都对REST和其他技术领域有很好的了解。另外我假设你已经安装了所有必需的工具。
今天我们将学习如何设置PHP项目并编写REST API的实际代码。我们还将学习编写必要的SQL查询来执行数据库CRUD操作。
8.启动PHP项目
众所周知,IDE使开发过程更容易。因此,我建议您使用IDE来开发PHP项目,而不是使用普通的记事本。你可以去Eclipse,Aptana Studio,PhpStorm或Netbeans。PHP项目目录结构
下图将让您了解我们现在要开发的项目的目录结构。
libs - 所有第三方库都在这里。在我们的例子中,我们将Slim库放在这里
include - 我们构建的所有助手类都放在这里
index.php - 负责所有API请求
.htaccess - url结构规则和其他apache规则
现在让我们开始PHP项目
1)转到安装WAMP的目录。通常,wamp将安装在C: wamp中。(如果您安装了任何其他软件而不是WAMP,则应该转到该软件推荐的目录)。
2)作为第一步,我们开始创建所需的目录。在wamp文件夹中,转到www文件夹(c: wamp www )并创建一个名为task_manager的文件夹。该文件夹将是我们项目的父目录。在task_manager内部再创建两个名为libs,include和v1的文件夹。
3)现在,粘贴Slim库里面的库文件夹。Slim的下载链接在前一部分中提供。
4)通常,当index.php包含在url中时,Slim框架会起作用,这会使url格式不正确。因此,使用.htacess规则,我们可以从url中删除index.php并制作一些友好的URL。在v1文件夹中创建一个名为.htaccess的文件并粘贴以下代码。(请注意,此文件名不应包含名称中的任何其他扩展名,例如.txt)
9准备助手类
首先,我们开始编写此项目中所需的一组辅助类。这些辅助类提供了与数据库交互所需的必要功能。
1)内部包含文件夹创建名为Config.php的文件,其中包含以下内容。此文件包含整个项目配置,如数据库连接参数和其他变量。
config.php文件
/**
* Database configuration
*/
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('DB_NAME', 'task_manager');
define('USER_CREATED_SUCCESSFULLY', 0);
define('USER_CREATE_FAILED', 1);
define('USER_ALREADY_EXISTED', 2);
?>
2)创建另一个名为DbConnect.php的类此类文件主要负责数据库连接。
DbConnect.php
/**
* Handling database connection
*
* @author Ravi Tamada
*/
class DbConnect {
private $conn;
function __construct() {
}
/**
* Establishing database connection
* @return database connection handler
*/
function connect() {
include_once dirname(__FILE__) . './Config.php';
// Connecting to mysql database
$this->conn = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
// Check for database connection error
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// returing connection resource
return $this->conn;
}
}
?>
3)加密密码
保护用户密码的最佳方法是不将它们存储为纯文本,而是在存储到db之前对所有密码进行加密。以下类负责加密用户密码。创建另一个名为PassHash.php的文件并粘贴以下代码。
PassHash.php
class PassHash {
// blowfish
private static $algo = '$2a';
// cost parameter
private static $cost = '$10';
// mainly for internal use
public static function unique_salt() {
return substr(sha1(mt_rand()), 0, 22);
}
// this will be used to generate a hash
public static function hash($password) {
return crypt($password, self::$algo .
self::$cost .
'$' . self::unique_salt());
}
// this will be used to compare a password against a hash
public static function check_password($hash, $password) {
$full_salt = substr($hash, 0, 29);
$new_hash = crypt($password, $full_salt);
return ($hash == $new_hash);
}
}
?>
4)现在创建另一个名为DbHandler.php的类。该类是我们项目中的重要文件之一,它提供了对数据库执行CRUD操作所必需的功能。每个函数都由它的名称和注释自我解释,我不必解释它们。
DbHandler.php
/**
* Class to handle all db operations
* This class will have CRUD methods for database tables
*
* @author Ravi Tamada
*/
class DbHandler {
private $conn;
function __construct() {
require_once dirname(__FILE__) . './DbConnect.php';
// opening db connection
$db = new DbConnect();
$this->conn = $db->connect();
}
/* ------------- `users` table method ------------------ */
/**
* Creating new user
* @param String $name User full name
* @param String $email User login email id
* @param String $password User login password
*/
public function createUser($name, $email, $password) {
require_once 'PassHash.php';
$response = array();
// First check if user already existed in db
if (!$this->isUserExists($email)) {
// Generating password hash
$password_hash = PassHash::hash($password);
// Generating API key
$api_key = $this->generateApiKey();
// insert query
$stmt = $this->conn->prepare("INSERT INTO users(name, email, password_hash, api_key, status) values(?, ?, ?, ?, 1)");
$stmt->bind_param("ssss