2012-01-18 5 views
10

私はウェブサイトを作成しようとしており、後でモバイルアプリを作成しています。Zend Framework - 外部と内部の両方からアクセス可能なAPIを作成するには?

ウェブサイトとアプリの両方に同じレベルのデータ(書籍のリスト)を提供したいと考えています。私はこのためのAPIを使用したいと思いますが、サンプルやまともな記事をオンラインで見つけるのに苦労しています。

私は、HTTP経由でモバイルアプリからアクセスできるJSONの「エンドポイント」を作成する場合(例:http://www.mysite.com/api/v1.0/json)、Zend Applicationから内部的に同じ機能にアクセスするにはどうすればよいですか?

(明らかに私は、データベースとの対話「モデル」の手順を複製する必要はありません)

+0

あなたがここに使って何をして終了しましたか?今は似たような状況にいる。 –

答えて

4

Zendのは本当にRESTfulなではないので、残念ながら、あなたの最善の策は、JSON-RPCです。

あなたがコントローラでそれを行うことができ、またはこの男はhere

を行ったようにあなただけのオーバーヘッドを減らすために、あなたのindex.phpに加えてajax.phpを作ることができる基本的に、あなたがする必要があるのはこれです:その後、どこかにあなたのレイアウトで

$server = new Zend_Json_Server(); 
$server->setClass('My_Class_With_Public_Methods'); 
// I've found that a lot of clients only support 2.0 
$server->getRequest()->setVersion("2.0"); 
if ('GET' == $_SERVER['REQUEST_METHOD']) { 
    // Indicate the URL endpoint, and the JSON-RPC version used: 
    $server->setTarget('/ajax.php') 
      ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2); 

    // Grab the SMD 
    $smd = $server->getServiceMap(); 

    // Return the SMD to the client 
    header('Content-Type: application/json'); 
    echo $smd; 
    return; 
} 

$server->handle(); 

:例のために

$server = new Zend_Json_Server(); 
$server->setClass('My_Class_With_Public_Methods'); 
$smd = $server->getServiceMap(); 
?> 
<script> 
$(document).ready(function() { 
    rpc = jQuery.Zend.jsonrpc({ 
     url : <?=json_encode($this->baseUrl('/ajax'))?> 
     , smd : <?=$smd?> 
     , async : true 
    }); 
}); 
</script> 

、ここではそのクラスです:

class My_Class_With_Public_Methods { 
    /** 
     * Be sure to properly phpdoc your methods, 
     * the rpc clients like it when you do 
     * 
     * @param float $param1 
     * @param float $param2 
     * @return float 
     */ 
    public function someMethodInThatClass ($param1, $param2) { 
     return $param1 + $param2; 
    } 
} 

その後、あなたは、単にJavaScriptでそのようなメソッドを呼び出すことができます。

rpc.someMethodInThatClass(first_param, second_param, { 
    // if async = true when you setup rpc, 
    // then the last param is an object w/ callbacks 
    'success' : function(data) { 

    } 
    'error' : function(data) { 

    } 
}); 

ありのAndroid/iPhoneのためのよく知られているJSON-RPCライブラリの多くはありません - しかし、私は、これはで動作することを発見しましたAndroid用Zend_Json_Serverは:

http://software.dzhuvinov.com/json-rpc-2.0-base.html

、これはiPhoneのために動作します:

http://www.dizzey.com/development/ios/calling-json-rpc-webservice-in-ios/

ここから、明らかに、javascript /モバイルアプリケーションと同じ方法でMy_Class_With_Public_Methodsを使用できます。

+0

someMethodInThatClassメソッドを 'books'コントローラの 'index'アクション内から呼び出すにはどうすればよいですか? – Sjwdavies

+1

heh、それを呼んで? '$ myobj = new My_Class_With_Public_Methods(); $ myobj-> someMethodInThatClass(); ' –

+0

ありがとうスティーブン - これは、 '脂肪コントローラ'で終わらないでしょうか? 'My_Class_With_Public_Methods'は大量になる可能性がありますか?私は、このコントローラを介してデータのためにデータベースへのすべての内部リクエストを指示する必要があると思っていましたか?あるいは、私は「My_Class_With_Public_Methods」ファイルを書いてデータ検索プロセスを「開く」ことができますし、「パブリックに」提供したいデータベースのやり取りを選んでチェリーしますか? – Sjwdavies

1

これは、Zend Frameworkの質問よりもアーキテクチャに関連する質問です。

あなたが探しているのはサービス指向アーキテクチャ(SOA)です。

SOAの前提はシンプルで、単一のAPIを構築し、内部的にも外部的にもすべてを通過させることができます。 SOAの一般的な支持者はAmazonです。

実際には、APIを内部で使用するのと同じように公開することを意味します。これは、OOPでは、外部ソース(REST APIなど)からAPIを呼び出すたびに、クラス名、メソッド名、および引数のリストを指定し、そのオブジェクトを受け取ることを意味します。あなたが内部的にそれを呼び出すなら、あなたが望むのと同じように。

例パー

、あなたはこれらを持っている:

class HelloInstance { 
    public $hello; 
    public function __construct($hello) { $this->hello = $hello; } 
} 

class Hello { 
    public function getHello() { return new HelloInstance('world'); } 
} 

class FooInstance { 
    public $foo; 
    public function __construct($foo) { $this->foo = $foo; } 
} 

class Foo { 
    public function getFoo($value) { return new FooInstance($value); } 
} 

あなたが内部的にそれらを使用したい場合は、あなたがしたい:

$hello = new Hello; 
$helloInst = $hello->getHello(); 

$foo = new Foo; 
$fooInst = $foo->getFoo('bar'); 

今、あなたは単に外部からこのAPIを公開するためのゲートウェイを必要としています。ここでは非常に基本的な例です:

include_once 'my_classes.php'; 

$class = $_GET['class']; 
$method = $_GET['method']; 

$obj = new $class; 
$return = $obj->$method(isset($_GET['value']) ? $_GET['value'] : null); 

header('Content-Type: application/json'); 
echo json_encode($return); 

あなたは私が前に示された同じ2つの呼び出しを行うには、REST呼び出しを使用して、同じ結果を得ることができます。

http://my_server/my_gateway.php?class=Hello&method=getHello 
http://my_server/my_gateway.php?class=Foo&method=getFoo&value=bar 
+1

これは建築的な立場ですが、1.あなたがRESTとして記述しているのは本当にRESTfulではありませんが、SOAPに似ています。 SOAPはすべてうまく機能しますが、明らかに* RESTfulではありません。2. ZendにはSOAが組み込まれています.RESTサーバーは駄目でRESTfulではありませんが、JSON/XML RPC機能は正しく機能します。あなたのアプローチは当然ですが、Zendの内部SOAを利用することはありません。それは必ずしも悪いことではありませんが、私はそれを指摘したいと考えていました。 –

+0

ちょうど不思議なことに、どうやってRESTfulではないのですか? – drew010

+0

@ StephenJ.Fuhry:リモートプロシージャコールを行うだけであっても、RESTfulにすることはできません。ああ、私は上記のことがRESTfulであるとは決して言いませんでした。それはSOAPのようなものではありません。 – netcoder

関連する問題