14

データ リポジトリと通信するための PHP バックエンドを備えたゲームに取り組むことを計画しています。私はそれについて考えていて、私たちのゲームが従うべき最良の設計パラダイムはイベント ドリブンであるという結論に達しました。私は達成システム (この Web サイトのバッジ システムに似ています) を探しています。基本的には、これらの「達成チェック」をゲームで発生するさまざまなイベントにフックできるようにしたいと考えています。すなわち:

ユーザーがアクション X フック Y を実行すると、アチーブメント要件をチェックするためにすべての添付関数が呼び出されます。

このようなアーキテクチャを構築することで、チェック機能を適切なフックに追加するだけで、他のすべてが適切に機能するため、新しい実績を簡単に追加できるようになります。

これが私がやろうとしていることの素晴らしい説明であるかどうかはわかりませんが、いずれにせよ、私は次のことを探しています:

  1. イベント駆動型アプリケーションのコーディング方法に関する参考資料
  2. PHP の関数に「フック」を配置する方法を示すコード スニペット
  3. ポイント 2 で述べた「フック」に関数をアタッチする方法を示すコード スニペット

2)と3)を達成する方法についていくつかのアイデアがありますが、この問題に精通した誰かがベストプラクティスに光を当ててくれることを望んでいました.

前もって感謝します!

4

3 に答える 3

15

イベントドリブンアプリケーションのコーディング方法に関する優れた参考資料

これは、 「ダム」コールバックデモ)を使用して行うことができます。

class Hooks
{
    private $hooks;
    public function __construct()
    {
        $this->hooks = array();
    }
    public function add($name, $callback) {
        // callback parameters must be at least syntactically
        // correct when added.
        if (!is_callable($callback, true))
        {
            throw new InvalidArgumentException(sprintf('Invalid callback: %s.', print_r($callback, true)));
        }
        $this->hooks[$name][] = $callback;
    }
    public function getCallbacks($name)
    {
        return isset($this->hooks[$name]) ? $this->hooks[$name] : array();
    }
    public function fire($name)
    {
        foreach($this->getCallbacks($name) as $callback)
        {
            // prevent fatal errors, do your own warning or
            // exception here as you need it.
            if (!is_callable($callback))
                continue;

            call_user_func($callback);
        }
    }
}

$hooks = new Hooks;
$hooks->add('event', function() {echo 'morally disputed.';});
$hooks->add('event', function() {echo 'explicitly called.';});
$hooks->fire('event');

または、イベント駆動型アプリケーションでよく使用されるパターンの実装:ObserverPattern

PHPの関数に「フック」を配置する方法を示すコードスニペット

上記の手動リンク(コールバックは変数に格納できます)とオブザーバーパターンのいくつかのPHPコード例

于 2011-07-27T14:39:45.007 に答える
5

PHP の場合、Symfony イベント コンポーネントを定期的に統合しました: http://components.symfony-project.org/event-dispatcher/

以下に短い例を示します。これは、Symfony のレシピ セクションで展開されています。

<?php

class Foo
{
  protected $dispatcher = null;

    // Inject the dispatcher via the constructor
  public function __construct(sfEventDispatcher $dispatcher)
  {
    $this->dispatcher = $dispatcher;
  }

  public function sendEvent($foo, $bar)
  {
    // Send an event
    $event = new sfEvent($this, 'foo.eventName', array('foo' => $foo, 'bar' => $bar));
    $this->dispatcher->notify($event);
  }
}


class Bar
{
  public function addBarMethodToFoo(sfEvent $event)
  {
    // respond to event here.
  }
}


// Somewhere, wire up the Foo event to the Bar listener
$dispatcher->connect('foo.eventName', array($bar, 'addBarMethodToFoo'));

?>

これは、ゲームのようなショッピング体験を作成するためにショッピング カートに統合したシステムであり、ユーザー アクションをゲーム イベントに結び付けます。ユーザーが特定のアクションを実行すると、php によってイベントが発生し、報酬がトリガーされました。

例 1: ユーザーが特定のボタンを 10 回クリックした場合、星を受け取りました。

例 2: ユーザーが友人を紹介し、その友人がサインアップすると、元の紹介者にポイントを与えるイベントが発生します。

于 2011-07-27T14:47:14.103 に答える
1

フックが組み込まれているので、CodeIgniterをチェックしてください。

フックを有効にするだけです:

$config['enable_hooks'] = TRUE;

次に、フックを定義します。

 $hook['post_controller_constructor'] = array(
                                'class'    => 'Hooks',
                                'function' => 'session_check',
                                'filename' => 'hooks.php',
                                'filepath' => 'hooks',
                                'params'   => array()
                                ); 

次に、クラスで使用します。

<?php

    class Hooks {
        var $CI;

        function Hooks() {
            $this->CI =& get_instance();
        }

        function session_check() {
            if(!$this->CI->session->userdata("logged_in") && $this->CI->uri->uri_string != "/user/login")
                redirect('user/login', 'location');
        }
    }

?> 
于 2011-07-27T14:34:52.773 に答える