0

ajaxでクライアント側で使用されるjson出力をエコーするコントローラーファイルを作成している状況があります。 echo json_encode($response);

別のファイルのメイン クラスは、とりわけ、CMS からすべての設定変数を取得します。

現在、コントローラ ファイルには API からのリクエストを生成するクラスがありますが、クラスの設定変数は(username, id, count, etc.)、他のファイルのメイン クラスから正確に取得する方法がわからないため、ハード コードされています。ハードコードされた設定により、コントローラ ファイルは期待どおりに json 出力を作成してエコーします。メインクラスからの動的変数が必要なだけです。

OOPの知識と使用法が不足していることをお許しください。このような構造で試してみましたが、ここでも、ユーザー名と他の変数をメインクラスから別のファイル内の別のクラスに取得しようとしています。

**編集** @Daveのコメントに基づいて、これを少し再考します。したがって、api_request 関数を mainClass とreturn応答に移動すると、必要な変数を取得でき、要求は引き続き機能します。それで、私は質問するようになります-どうすれば$responseapi_request関数から別のファイルにエコーできますか? json を含むその別のファイルは、私が ajax スクリプトに使用しているものです。

class mainClass {
    public $username;

    function __construct() {
        ...
    }

    public function api_settings( $username ) {
        ...
    }
}

$main_class = new mainClass;
$main_class->api_settings();
// OR
$main_class->username;

api-call.php

class apiCall extends mainClass {

    public $username;

    function __construct() {
        parent::__construct;
        ...
    }

    public function api_request() {
        ...

        $return = $api_auth->request(
            'GET',
            $api_auth->url( '/cms-plug' ),
            array(
                //where I need to be able to grab the $username from the main class
                'username' => 'joebob' 
            )
        );

        echo json_encode($response);
    }

}

$api_class = new apiCall;
4

2 に答える 2

3

ご指摘をいただきましたので、

あなたのアーキテクチャには非常に多くの欠陥があります

まず

みたいにすると、

class apiCall extends mainClass {

単一責任原則リスコフ代替原則を同時に破る

第二に、

コントローラーは何もエコーしないでください

MVC自体は次のようになります

$modelLayer = new ModelLayer();

$view = new View($modelLayer);

$controller = new Controller($modelLayer);
$controller->indexAction($request);

echo $view->render();

MVCではなく、Model-View-Presenterに近いものを実際に実装しています

三番

あなたのクラスはapi..それから始まるので、その名前をメソッドに含める必要はありません。

第四に、

json_encode()生成ロジックと密結合する必要はありません。そのメソッドは配列のみを返す必要があり、json_encode()その配列を作成しました。利点?1) 関心の分離 2) その配列をYAMLorXMLにイベント変換できます。JSON

また、あなたのケースでは継承を避けるべきです。ApiCalls を扱う特異なクラスを作成します。したがって、次のようになります。

final class ApiCall
{

    /**
     * I'd use a name that makes sense
     * 
     * @param string $username
     * @return array on success, FALSE on failure
     */
    public function fetchByUsername($username)
    {

        $return = $api_auth->request(
            'GET',
            $api_auth->url( '/cms-plug' ),
            array('username' => $username)
        );

        if ($response !== false){

          return $response;

        } else {

          return false;
        }
    }
}

そして、あなたはそれを次のように使うでしょう、

if (isset($_GET['username'])){

  $api = new ApiCall();

  $result = $api->fetchByUsername($_GET['username']);

  if ($result !== false){

     // Respond as JSON
     die(json_encode($result));

  } else {

    die('Wrong username');

  }
}
于 2013-06-29T21:55:03.567 に答える