2011-10-29 2 views
1

어제, 나는 question에 따라 Zend_AMF를 사용하여 PHP 응용 프로그램에서 플렉스 프런트 엔드로 형식이 지정된 객체를 보내는 데 성공했습니다.플렉스에서 PHP 로의 형식화 된 객체

지금 직면하고있는 문제는 플렉스에서 PHP로 입력 된 객체를 보내고 PHP 측에서 stdClass 대신 입력 된 객체로 보낼 수 있다는 것입니다. 여기

플렉스의 클래스입니다 :

package com.mysite 
{ 
    [Bindable] 
    [RemoteClass(alias="CTest")] 
    public class CTest 
    { 

     public var stuff1:String; 

     public var stuff2:String; 

     public function CTest() 
     { 
     } 
    } 
} 

을 그리고 이것은 PHP에서 해당 클래스입니다 :

var remoteObject:RemoteObject = new RemoteObject(); 
remoteObject.endpoint = "http://localhost/to/my/amf/endpoint"; 
remoteObject.showBusyCursor = true; 
remoteObject.source = 'testing'; 
var op:AbstractOperation = remoteObject.getOperation(null); 
op.addEventListener(ResultEvent.RESULT, result); 
op.send(new CTest()); 
: 내가 지금과 같은 개체를 보내고 플렉스에서

<?php 
namespace modules\testing; 

class CTest{ 

    var $_explicitType = 'CTest'; 

    var $stuff1; 

    var $stuff2; 
} 

PHP 측에서는 객체가 $parameters이라는 변수로 검색됩니다. 그때 파일에 결과를 기록하는 데에 print_r의 사용

$z = print_r($parameters, true); 
$s = fopen('D:\test.txt', 'w+'); 
fwrite($s, $z); 
fclose($s); 

하고

볼 수있다, 그 결과는 다시 지정되지 않은 제공하고 stdClass 객체입니다 일부 테스트 후

Array 
(
    [0] => stdClass Object 
     (
      [stuff1] => 
      [stuff2] => 
     ) 

) 

, PHP 개체에서 네임 스페이스를 제거하고이를 전역 네임 스페이스로 옮겼습니다. 이것은 문제를 해결 한 것으로 보인다. 나는 RemoteClass\modules\testing\CTest 그리고 또한 modules.testing.CTest으로 설정하려고 시도했다. $_eplicitType은 두 테스트에 대해 동일한 값으로 설정되었습니다.

modules.testing.CTest을 사용하면 Zend_AMF가 보는 클래스 이름이됩니다. 네임 스페이스 표기법을 사용하면 모든 슬래시가 제거되므로 Zend_AMF는 modulestestingCTest을 봅니다.

하지만 어떻게 PHP 네임 스페이스로이 작업을 할 수 있습니까?

답변

2

마지막으로 문제가 해결되었습니다. 앞으로도 같은 문제에 직면 할 수있는 사람들을위한 해결책이 있습니다. 당신의 PHP 클래스의 경우

:

<?php 
namespace app\testing; 
class CTest{ 

    var $_explicitType = 'app\testing\CTest'; 

    var $stuff1; 

    var $stuff2; 
} 

당신의 ActionScript 클래스의 경우 :

package com.mysite 
{ 
    [Bindable] 
    [RemoteClass(alias="app\\\\testing\\\\CTest")] 
    public class CTest 
    { 

     public var stuff1:String; 

     public var stuff2:String; 

     public function CTest() 
     { 
     } 
    } 
} 

나는 문제가 AMF 본체의 직렬화 및 역 직렬화 때문이라고 생각합니다. 효과적으로, 원격 클래스는 2 개의 슬래시가 이스케이프 처리되어 결과적으로 app\\testing\\CTest이됩니다. Zend_AMF에 의해 deserialize되면, 슬래쉬가 2 개이므로 백 슬래시가 app\testing\CTest으로 이스케이프됩니다. 이것은 물론 직감이지만, Charles와의 몇몇 테스트는 이것이 사실이라는 것을 증명했습니다.

또 다른 가능한 해결책은 Zend_Amf_Parse_TypeLoader.php을 수정하는 것입니다.라인 99에, 우리는 대체 할 수있다 :

[RemoteClass(alias="app.testing.CTest")] 

var $_explicitType = 'app.testing.CTest'; 
:

if(!$class) { 
      $class = str_replace('.', '_', $className); 
    } 

효과적으로

if(!$class) { 
    $class = str_replace('.', '\\', $className); 
} 

, 우리는 단지 멋지게 배치됩니다 액션 스크립트 클래스 매핑을 위해 도트 구문을 사용할 수 있습니다

분명히이 방법은 꽤 좋은 해결책이지만 Zend_AMF 라이브러리가 앞으로 새로운 버전으로 업데이트 될 것이므로 벤더 코드로 수정하지 않는 편이 더 좋습니다. 당분간, 나의 해결책은 단지 4 개의 슬래시를 사용하는 것이다.

+0

만약 내가 당신을 두 번 투표 할 수 있습니다 :) PHP에서 플렉스로 개체를 보내는 것에 관한 내 관련된 질문 : http://stackoverflow.com/questions/9555397/flex-is-deserializing-generic-objects-from- zend-amf-of-strictly-typed-ob – pixel