我正在尝试学习苗条的框架,但我遇到了一个奇怪的问题。在Slim框架3中,它可以正常工作。 在发布此问题之前,我已经做了大量研究,但老实说,我发现的所有答案使其变得更加复杂。
我设法获取所有客户,获取单个客户并删除一个客户。 但是POST(新客户)或PUT(更新新客户)不起作用。
我会尽力提供更多信息。
Public index.php
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
require './src/config/db.php';
$app = AppFactory::create();
require './src/routes/customers.php';
$app->run();
Config/db.php
<?php
/**
* Connect MySQL with PDO class
*/
class db {
private $dbhost = 'localhost';
private $dbuser = 'root';
private $dbpass = 'root';
private $dbname = 'api';
public function connect() {
// https://www.php.net/manual/en/pdo.connections.php
$prepare_conn_str = "mysql:host=$this->dbhost;dbname=$this->dbname";
$dbConn = new PDO( $prepare_conn_str, $this->dbuser, $this->dbpass );
// https://www.php.net/manual/en/pdo.setattribute.php
$dbConn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// return the database connection back
return $dbConn;
}
}
最后是customers.php ...我只提供了POST和PUT,因为这两个都不起作用。
$app->post('/api/customer/add', function( Request $request, Response $response){
$name = $request->getParam('name');
$telephone = $request->getParam('telephone');
$email = $request->getParam('email');
$website = $request->getParam('website');
$location = $request->getParam('location');
$sql = "INSERT INTO CUSTOMERS (NAME, TELEPHONE, EMAIL, WEBSITE, LOCATION)
VALUES(:name,:telephone,:email,:website, :location)";
try {
$db = new db();
$db = $db->connect();
$stmt = $db->prepare($sql);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':telephone', $telephone);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':website', $website);
$stmt->bindParam(':location', $location);
$stmt->execute();
echo '{"notice" : {"msg" : "New customers Added."}';
} catch( PDOException $e ) {
echo '{"error": {"msg": ' . $e->getMessage() . '}';
}
});
$app->put('/api/update/{id}', function( Request $request, Response $response){
$id = $request->getAttribute('id');
$name = $request->getParam('name');
$telephone = $request->getParam('telephone');
$email = $request->getParam('email');
$website = $request->getParam('website');
$location = $request->getParam('location');
$sql = "UPDATE CUSTOMERS SET
name = :name,
telephone = :telephone,
email = :email,
website = :website,
location = :location,
WHERE id = $id";
try {
$db = new db();
$db = $db->connect();
$stmt = $db->prepare( $sql );
$stmt->bindParam(':name', $name);
$stmt->bindParam(':telephone', $telephone);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':website', $website);
$stmt->bindParam(':location', $location);
$stmt->execute();
echo '{"notice" : {"msg" : "Customer is Updated."}';
} catch( PDOException $e ) {
echo '{"error": {"msg": ' . $e->getMessage() . '}';
}
});
错误消息
[16-May-2020 14:28:50 UTC] PHP Fatal error: Uncaught Error: Call to undefined method Slim\Psr7\Request::getParam() in /Applications/MAMP/htdocs/MyApi/public/src/routes/customers.php:114
Stack trace:
#0 /Applications/MAMP/htdocs/MyApi/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php(43): {closure}(Object(Slim\Psr7\Request), Object(Slim\Psr7\Response), Array)
#1 /Applications/MAMP/htdocs/MyApi/vendor/slim/slim/Slim/Routing/Route.php(381): Slim\Handlers\Strategies\RequestResponse->__invoke(Object(Closure), Object(Slim\Psr7\Request), Object(Slim\Psr7\Response), Array)
#2 /Applications/MAMP/htdocs/MyApi/vendor/slim/slim/Slim/MiddlewareDispatcher.php(81): Slim\Routing\Route->handle(Object(Slim\Psr7\Request))
#3 /Applications/MAMP/htdocs/MyApi/vendor/slim/slim/Slim/MiddlewareDispatcher.php(81): Slim\MiddlewareDispatcher->handle(Object(Slim\Psr7\Request))
#4 /Applications/MAMP/htdocs/MyApi/vendor/slim/slim/Slim/Routing/Route.php(341): Slim\MiddlewareDispatcher->handle(Object(Slim\Psr7\Request))
#5 /Applications/MAMP/htdocs/MyApi/vendor/slim/slim/S in /Applications/MAMP/htdocs/MyApi/public/src/routes/customers.php on line 114