2016-01-16 39 views
0

我正在爲我的角應用程序製作一個API,這將允許我使用Slim訪問我的數據庫。我遵循本教程http://anjanawijesundara.blogspot.ca/2015/04/crud-application-with-angularjs.html我的Slim API給了我一個404錯誤頁面

我有一個'Angularjs'文件夾。其中,我有我的index.html文件,我的'api'文件夾,這個API在哪裏,'app'文件夾,角度應用程序和'assets'文件夾用於css,img和其他js文件。

我用Composer(它創建了一個供應商文件夾)在'API'文件夾中安裝了Slim,並且在供應商文件夾旁邊有一個'index.php'文件。

我 '的index.php' 文件(在API文件夾中)看起來,到目前爲止:

<?php 
require 'vendor/autoload.php'; 

$app = new \Slim\App; 

$app->get('/Types', 'getTypes'); 
$app->get('/Types/:id', 'getTypeById'); 

$app->run(); 

function DB_Connection() { 
    $dbhost = "localhost"; 
    $dbuser = "kevdug_portfolio"; 
    $dbpass = "*****************"; 
    $dbname = "portfolio"; 
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

function getTypes() { 
    $sql = "select * FROM pt_type"; 
    try { 
     $db = DB_Connection(); 
     $stmt = $db->query($sql); 
     $list = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($list); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

function getTypeById($id) { 
    $sql = "select * FROM pt_type WHERE id=".$id; 
    try { 
     $db = DB_Connection(); 
     $stmt = $db->query($sql); 
     $list = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($list); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

?> 

我猜想能夠使用我的API使用此代碼:

angular.module('appDatabaseCtrl', []) 
.controller('databaseCtrl', ['$scope','$routeParams', '$http', '$log', 
    function($scope, $routeParams, $http, $log){ 
     $scope.testDatabaseTypes = function(){ 
      $http.get('/api/Types').success(function(data) { 
       $log.info("succes!"); 
       $log.log(data); 
      }) 
      .error(function (data, status){ 
       $log.error("error!"); 
       $log.log(data); 
      }); 
     }; 
     $scope.testDatabaseTypesById = function(){ 
      console.log($scope.id); 
      $http.get('/api/Types/' + $scope.id).success(function(data) { 
       $log.info("succes!"); 
       $log.log(data); 
      }) 
      .error(function (data, status){ 
       $log.error("error!"); 
       $log.log(data); 
      }); 
     }; 
    } 
]); 

第一個函數有效,但第二個函數返回404錯誤。你可以看到發生什麼事自己與那些樹網址:

http://kevdug.webfactional.com/#/database

http://kevdug.webfactional.com/api/types

http://kevdug.webfactional.com/api/types/1 < ---可以是任何ID爲1至4

+0

如何直接使用函數名而不是引用它,例如'$ app-> get('/ Types',getTypes);'?函數名稱作爲字符串在技術上可以在PHP中調用,但框架似乎使用字符串路由處理程序來引用控制器類的方法 – mzulch

+0

您是否嘗試過在URL上鍵入「index.php」? 類似於http:// localhost:8080/angularjs/api/index.php/Types – PekosoG

+0

對於你的評論,mzulch,我真的不知道該怎麼回答你,因爲我只是不明白你說的話......對於Pekoso,如果我有index.php,它會工作,但如果我嘗試添加一個id來獲取特定類型,它會給我一個404錯誤。我更詳細地更新了我的問題,並通過3鏈接真正瞭解發生了什麼。希望有人能幫助! –

回答

0

看來,您使用的超薄V3 (由$app = new \Slim\App;來判斷),但是看起來你的路由格式是Slim v2的格式。

$app->get('/Types/:id', 'getTypeById');實際上應該更像$app->get('/Types/{id}', getTypeById);。您也可以提供關於它接受的內容的限制$app->get('/Types/{id:\d+}', getTypeById);

編輯:您還在使用Slim v3的無效功能簽名,這就是爲什麼在導航到Your Example Url with the literal :id instead of a number it errors時。您應該使用的函數簽名像

function getTypeById(\Slim\Http\Request $req, \Slim\Http\Response $res, $args) { 
    $id = $args["id"]; // Rest of your code 
} 

最後,我建議找了一些基本的SQL注入防護教程,因爲如果你的電流/類型/:ID的路由工作正常,那麼它將有一個SQL注入漏洞。但由於這不是這個問題的目標,我只是留下一個警告。

+0

謝謝soooooooo多!它的工作原理,但我有很多問題給你: - 當我看到Slim在網站上給出的例子時,他們不得不使用頂部的命令(你可以在網站上查看它)。那些是必要的,他們做了什麼? - 你是指無效函數簽名,我必須使用$ req和$ res,因爲我從來沒有在我的代碼中使用這些變量? –

+0

如果您是指每個示例頂部的'use \ Namespace \ Class;'代碼,那麼您就不需要使用完全限定名稱來進行類型提示。至於函數簽名,在Slim v3中,實現並使用了PSR-7,它通過Request和Response類來檢索和輸出數據,這在評論中有點複雜,所以你需要閱讀它在別處。 – Nikey646

+0

我嘗試刪除$ arg之前在我的函數中出現的所有內容,但它給了我一個錯誤。這是否意味着如果我想使用$ arg,我必須在它之前使用$ req和$ res?還有,是不是?如果我用「請求$請求,響應$響應」替換這兩個,因爲我在文檔的頂部都使用了聲明? –

相關問題