2017-11-03 8 views
0

現在、いくつかのデータベースを管理するためのRESTful APIを開発中です。理想的に私は私のアプリケーション内の別のルートから自分のAPIルートを呼び出すことができる必要がありますか?Slim APIの既存の内部ルートを呼び出すことができません

私はsubRequestを使用して、既存のルートを無駄に呼び出そうとしました。 郵便配達で、私のルートを実行しながら、私が得るすべては以下の通りです:以下

<html> 
    <head> 
     <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
     <title>Slim Application Error</title> 
     <style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{display:inline-block;width:65px;}</style> 
    </head> 
    <body> 
     <h1>Slim Application Error</h1> 
     <p>A website error has occurred. Sorry for the temporary inconvenience.</p> 
    </body> 
</html> 

は、テーブル内のすべての企業を取得すると companiesテーブルに新しい会社を置くために私の companies.php APIのルートです。別の経路、​​内

<?php 
use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

// Get all companies 
$app->get('/companies', function(Request $request, Response $response) { 
    $sql = "SELECT * FROM companies"; 

    try { 
    // Get DB Object 
    $db = new db(); 
    // Connect 
    $db = $db->connect(); 

    $stmt = $db->query($sql); 
    $companies = $stmt->fetchAll(PDO::FETCH_OBJ); 
    $db = null; 

    echo '{"data":' . json_encode($companies) . '}'; 
    } catch(PDOException $e) { 
    echo '{"error": { "text":' . $e->getMessage() . '}}'; 
    } 
}); 

// Add new company to companies table 
$app->put('/new/company/{companyName}', function(Request $request, Response $response) { 
    $newCompany = $request->getAttribute('companyName'); 

    $insert_sql = "INSERT INTO companies (company_name) VALUE (:newCompany)"; 

    try { 
    $db = new db(); 
    $db = $db->connect(); 

    $insert_stmt = $db->prepare($insert_sql); 
    $newCompany = str_replace("'", "", $newCompany); 
    $insert_stmt->bindParam(':newCompany', $newCompany); 
    $insert_stmt->execute(); 

    $newID = $db->lastInsertId(); 
    $db = null; 

    echo '{"notice": {"text": "New Company Added (cid: '.$newID.')"}'; 
    } catch(PDOException $e) { 
    echo '{"error": { "text":' . $e->getMessage() . '}}'; 
    } 
}); 

、私はPUT->'/new/company'ルートを実行したいと思います。だから、私は以下を置くどこか​​内:

$destinationComp = "myNewCompany"; 
    $res = $this->subRequest('PUT', '/new/company/' . $destinationComp); 
    echo $res; 

私はポストマンから手動でPUT要求を行ったかのように私の出力ではなく、最初のコードセクションに表示されているエラーの、同じであると期待されます。

さらに、私はむしろ$thisより変数$appを通じて定期的な要求を行うことを希望してuse ($app)が含まれるように、私のルートの呼び出しを変更しようとしました、働いていなかった場合$thisです。どのように見える:

$app->put('/new/site/{sourceCompany}/{sourceProperty}/{destinationCompany}/{destinationProperty}', function(Request $request, Response $response) use ($app) { 
    $destinationComp = "myNewCompany"; 
    $res = $app->put("/new/company/$destinationComp"); 
    echo $res; 

    //More code to follow... 
} 

実行時に郵便番号で同じエラーメッセージを受信するのみ。

提案がありますか?

答えて

1

ContainerクラスのsubRequestメソッドを呼び出すときに、Appクラスにする必要があります。 $これは、スリム\コンテナのインスタンス にバインドされたルート閉鎖内部

、代わりに - Slim docs

リファレンス$アプリのVARを、使用キーワードでそれを注入。さらに、エコーする代わりに応答オブジェクトを返します。

return $app->subRequest('PUT', '/new/company/' . $destinationComp); 
+0

ありがとうございました。明らかに私のセットアップの唯一の順列は、私は試していない、良い目! –

+0

私はそれ以来、私の会社のAPIを変更して、新しい会社の作成が '/ company?name = companyName'へのPUTリクエストであるというような、パラメータを使用するようにしました。 どこでもパラメータを使用してsubRequestsの例を見つけることはできません。 –

+0

スタックオーバーフローに関する別の質問をし、問題の概要を説明する必要があります。 – Scriptonomy

関連する問題