Symfony 2.8 ltsでブログを作成する[パート5.1]

こんにちは、Habr! フィード内のコメントのリストをリアルタイムで更新できるように、一連の記事に少し触れて、できるだけシンプルに表示したいと思います。 これは、たとえばgithubでどのように発生しますか



部品ナビゲーション
パート1-Symfony2とテンプレートの構成

パート2-連絡先ページ:バリデーター、フォーム、およびメール

パート3-Doctrine 2とデータフィクスチャ

パート4-Doctrine 2のコメントモデル、リポジトリ、移行

パート5-Twig拡張、サイドバー、および資産

パート6-ユニットおよび機能テスト



このタスクを実装するには、 Post Hawkサービスを使用します。 コードは、対応するブランチで利用可能です。



パート1.依存関係のインストール(必須)



ブランチ5をベースとする場合、composer.jsonに依存関係を追加する必要があります。

composer require post-hawk/hawk-api-bundle ~1.0
      
      





5.1の場合、非常に単純です

 composer update
      
      





パッケージのインストール(更新)を待ちます。



次に、erlangをインストールします。 さまざまなシステムのビルドがここにあります 。または、必要に応じてsourceからコンパイルできます

Windowsにインストールするときは、パスにパスを追加することを忘れないでください。


私たちはあなたが一番好きなファイルシステムの任意の場所に行き(メインプロジェクトの隣にできます)、 サーバークライアントをクローンします

 git clone https://github.com/postHawk/hawk_client.git git clone https://github.com/postHawk/hawk_server
      
      





鉄筋の作成

 $ git clone git://github.com/rebar/rebar.git $ cd rebar $ ./bootstrap
      
      





結果のファイル(鉄筋)は両方のリポジトリにコピーされます。 プロジェクトをビルドするために必要です。

プロジェクトは、鉄筋のバージョン2を使用します。 rebar3では、まだ起動に失敗します


サーバーフォルダーに移動して収集し、実行します。

 cd hawk_server nano src/hawk_server.app.src #   
      
      





 {env, [ {statistic, [{use, false}]}, user, #{ <<"login">> => <<"symblog">>, <<"domain">> => [ %       <<"127.0.0.1:8000">> ], <<"key">> => <<"very secret key">> %api .       }} ]}
      
      





 mv .erlang .erlang_ rebar get-deps compile mv .erlang_ .erlang erl -name 'hawk_server@127.0.0.1' -boot start_sasl -setcookie test -kernel inet_dist_listen_min 9000 inet_dist_listen_max 9005
      
      







同様に、クライアントを収集して実行します。

 cd hawk_client nano src/hawk_client.app.src #  server_node, , 'test_hawk_server@127.0.0.1'  api_key (   ).  
      
      





 {env, [ {api_key, <<"very secret key">>}, {server_node, 'hawk_server@127.0.0.1'} ]}
      
      





 mv .erlang .erlang_ ./rebar get-deps compile mv .erlang_ .erlang erl -name 'hawk_client@127.0.0.1' -boot start_sasl -setcookie test -kernel inet_dist_listen_min 9000 inet_dist_listen_max 9005
      
      





バックグラウンドでプロセスを開始する必要がある場合は、パラメータセットに-detachedオプションを追加するだけです

Windowsユーザーの場合、スタートアップユーティリティをerlからwerlに変更する必要があります


パート2.ブログの変更(ブランチ5に必要)



バンドル構成:

 //app/AppKernel.php $bundles = array( ... new Hawk\ApiBundle\HawkApiBundle(), new FOS\JsRoutingBundle\FOSJsRoutingBundle(), );
      
      





 #app/config/config.yml hawk_api: client: host: '%hawk_api.client.host%' #ip   port: '%hawk_api.client.port%' #,    key: '%hawk_api.client.key%'
      
      





 #app/config/parameters.yml parameters: hawk_api.client.host: 127.0.0.1 hawk_api.client.port: 7777 hawk_api.client.key: 'very secret key'
      
      





 #app/config/routing.yml hawk: resource: '@HawkApiBundle/Controller/' prefix: /hawk fos_js_routing: resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml"
      
      





資産を入れます:

 php app/console assets:install --symlink web
      
      





コントローラーを完成させます:



 ... use Blogger\BlogBundle\Entity\Blog; use Hawk\ApiBundle\Event\GroupMessage;
      
      





コメントを追加する機能に、通知の送信を配置します。

 ... $em->persist($comment); $em->flush(); $this->sendNotification($comment, $blog); return $this->redirect($this->generateUrl('BloggerBlogBundle_blog_show', array( ...
      
      





さて、関数自体を追加します。



コード
 /** *      * @param Comment $comment  * @param Blog $blog  */ private function sendNotification(Comment $comment, Blog $blog) { //   $comment_text = $this->renderView('BloggerBlogBundle:Comment:index.html.twig', [ 'comments' => [$comment] ]); //  $gMessage = new GroupMessage(); $gMessage ->setFrom('comment_demon') ->setGroups(['blog_' . $blog->getId()]) ->setText(['comment' => $comment_text]) ->setEvent('new_comment') //    ; // $api = $this ->container ->get('event_dispatcher') ->dispatch(GroupMessage::NEW_MESSAGE, $gMessage) ->getResult() //HawkApi ; //       if($api->hasErrors()){ $logger = $this->get('logger'); $logger->error('Error sending message: ' . print_r($api->getErrors(), 1)); } }
      
      







ここで何が起こっているのか少し説明します。 サービスを介してメッセージを送信するには、2つの方法があります。 1つ目は、symfonyイベントシステムを介した上記の例のようなものです。 メッセージオブジェクト(単純またはグループ)が作成され、特定の種類のイベントと共に送信されます。 2番目のオプションは、コンテナから取得できるAPIを使用して直接送信することです。

 $api = $this->get('hawk_api.api')->getApi(); $api ->registerUser($id) ->sendMessage($from, $to, $text, $event) ->execute() ->getResult('sendMessage') ;
      
      







テンプレートを完成させます:



src / Blogger / BlogBu​​ndle / Resources / views / Blog / show.html.twigで行を変更します

  <article class="blog">
      
      







  <article class="blog" data-blog-id="{{ blog.id }}">
      
      





、ユーザーをサブスクライブするにはブログIDが必要になるためです。



スクリプトを接続します。

 {#src/Blogger/BlogBundle/Resources/views/layout.html.twig#} {% block javascripts %} {% javascripts '@BloggerBlogBundle/Resources/public/js/*' output='js/plugins,js' filter='?yui_js' %} <script src="{{ asset_url }}"></script> {% endjavascripts %} {% javascripts '../vendor/post-hawk/hawk-api/Resources/public/js/hawk_api.min.js' %} <script src="{{ asset_url }}"></script> {% endjavascripts %} <script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script> <script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script> {% endblock %}
      
      







まあ、私たちは少しjsを書きます



コード
 $(document).ready(function () { connectToHawk(); }); function connectToHawk() { //    $.post(Routing.generate('hawk_token', { useSessionId: 1 }), {}, function (data) { if(data.errors === false){ //  HAWK_API.init({ user_id: data.result.id, token: data.result.token, url: data.result.ws, debug: true }); //    HAWK_API.bind_handler('new_comment', function(e, msg){ //   if(msg.from === 'hawk_client') return; //       //   var $comments = $('.previous-comments'), $last = $comments.find('.comment:last'), cls = 'odd', $comment = $(msg.text.comment) ; //    if($last.size()){ cls = $last.hasClass('odd') ? 'even' : 'odd'; } $comment .removeClass('odd') .addClass(cls) .hide() ; // $comments.append($comment); $comment.show('normal') }); //    HAWK_API.bind_handler('open', function(e, msg){ var id = $('.blog').data('blogId'); //     //  ,        HAWK_API.add_user_to_group(['blog_' + id]); }); } else { if(data.errors !== 'no_user') { console.error(data); } } }); }
      
      







最初に行うことは、メッセージサーバーに接続するためのトークンの要求を送信することです。 ユーザーはアトールされていないので、セッションのユーザーIDをユーザーIDとして使用するようコントローラーに指示します。

すべてが順調であれば、ユーザーID、接続トークン、サーバーアドレスのレスポンスが返されます。

次に、接続を初期化し、イベントをサブスクライブします。 この場合、2つに興味があります。 最初はopenです 。これは、ソケットへの接続が成功した後に発生します。 2番目はnew_comment (メッセージを送信するときに送信します)、直接新しいコメントです。



それだけです。 ご清聴ありがとうございました。 この部分のコードは、対応するブランチのgithubで入手できます。



All Articles