ホームページ >バックエンド開発 >PHPチュートリアル >NEO4Jを使用してPHPアプリにソーシャルネットワーク機能を追加する
最後の部分では、NEO4JとPHPで使用する方法について学びました。この投稿では、その知識を使用して、グラフデータベースを使用して実際のSilexを搭載したソーシャルネットワークアプリケーションを構築します。
キーテイクアウト
Twigは、テンプレートファイルをSRC/Viewsフォルダーに配置するように構成されています。
/を指すホームルートが登録され、後で作成するWebControllerを使用するように構成されます。アプリケーション構造は次のようになります
<span>{ </span> <span>"require": { </span> <span>"silex/silex": "~1.1", </span> <span>"twig/twig": ">=1.8,<2.0-dev", </span> <span>"symfony/twig-bridge": "~2.3", </span> <span>"neoxygen/neoclient": "~2.1" </span> <span>}, </span> <span>"autoload": { </span> <span>"psr-4": { </span> <span>"Ikwattro\SocialNetwork\": "src" </span> <span>} </span> <span>} </span><span>}</span>
ここでは、Bowerを使用してBootstrapをインストールしましたが、使用したいものはあなた次第です。
次のステップは、子供の小枝テンプレートが独自のコンテンツでオーバーライドするコンテンツブロックを使用してベースレイアウトを作成することです。
デフォルトのブートストラップのテーマを上にnavbarを使用します:ホームページ(すべてのユーザーの取得)
<span><span><?php </span></span><span> </span><span><span>require_once __DIR__.'/../vendor/autoload.php'; </span></span><span> </span><span><span>use Neoxygen<span>\NeoClient\ClientBuilder</span>; </span></span><span> </span><span><span>$app = new Silex<span>\Application</span>(); </span></span><span> </span><span><span>$app['neo'] = $app->share(function(){ </span></span><span> <span>$client = ClientBuilder<span>::</span>create() </span></span><span> <span>->addDefaultLocalConnection() </span></span><span> <span>->setAutoFormatResponse(true) </span></span><span> <span>->build(); </span></span><span> </span><span> <span>return $client; </span></span><span><span>}); </span></span><span> </span><span><span>$app->register(new Silex<span>\Provider\TwigServiceProvider</span>(), array( </span></span><span> <span>'twig.path' => __DIR__.'/../src/views', </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\MonologServiceProvider</span>(), array( </span></span><span> <span>'monolog.logfile' => __DIR__.'/../logs/social.log' </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\UrlGeneratorServiceProvider</span>()); </span></span><span> </span><span><span>$app->get('/', 'Ikwattro\SocialNetwork\Controller\WebController::home') </span></span><span> <span>->bind('home'); </span></span><span> </span><span><span>$app->run();</span></span>これまでのところ、NEO4Jがアプリケーションで利用可能で、ベーステンプレートが作成されており、ホームページにすべてのユーザーをリストしたいと考えています。
これを2つのステップで達成できます:
<span>{ </span> <span>"require": { </span> <span>"silex/silex": "~1.1", </span> <span>"twig/twig": ">=1.8,<2.0-dev", </span> <span>"symfony/twig-bridge": "~2.3", </span> <span>"neoxygen/neoclient": "~2.1" </span> <span>}, </span> <span>"autoload": { </span> <span>"psr-4": { </span> <span>"Ikwattro\SocialNetwork\": "src" </span> <span>} </span> <span>} </span><span>}</span>
コントローラーにプロセスが表示され、NEOサービスを取得し、すべてのユーザーを取得するためにCypherクエリを発行します。
ユーザーコレクションはindex.html.twigテンプレートに渡されます。
<span><span><?php </span></span><span> </span><span><span>require_once __DIR__.'/../vendor/autoload.php'; </span></span><span> </span><span><span>use Neoxygen<span>\NeoClient\ClientBuilder</span>; </span></span><span> </span><span><span>$app = new Silex<span>\Application</span>(); </span></span><span> </span><span><span>$app['neo'] = $app->share(function(){ </span></span><span> <span>$client = ClientBuilder<span>::</span>create() </span></span><span> <span>->addDefaultLocalConnection() </span></span><span> <span>->setAutoFormatResponse(true) </span></span><span> <span>->build(); </span></span><span> </span><span> <span>return $client; </span></span><span><span>}); </span></span><span> </span><span><span>$app->register(new Silex<span>\Provider\TwigServiceProvider</span>(), array( </span></span><span> <span>'twig.path' => __DIR__.'/../src/views', </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\MonologServiceProvider</span>(), array( </span></span><span> <span>'monolog.logfile' => __DIR__.'/../logs/social.log' </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\UrlGeneratorServiceProvider</span>()); </span></span><span> </span><span><span>$app->get('/', 'Ikwattro\SocialNetwork\Controller\WebController::home') </span></span><span> <span>->bind('home'); </span></span><span> </span><span><span>$app->run();</span></span>テンプレートは非常に軽いため、ベースレイアウトを拡張し、コンテンツ継承ブロックのユーザーの最初の名前とラストネームを使用してアンソートリストを追加します。
ビルトインPHPサーバーを起動して、あなたの仕事を賞賛してください:
<span><!DOCTYPE html> </span><span><html lang="en"> </span><span><head> </span> <span><meta charset="utf-8"> </span> <span><meta http-equiv="X-UA-Compatible" content="IE=edge"> </span> <span><meta name="viewport" content="width=device-width, initial-scale=1"> </span> <span><meta name="description" content=""> </span> <span><meta name="author" content=""> </span> <span><title>My first Neo4j application</title> </span> <span><!-- Bootstrap core CSS --> </span> <span><link href="{{ app.request.basepath }}/assets/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> </span> <span><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> </span> <span><!--[if lt IE 9]> </span> <span><script></script> </span> <span><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> </span> <span><![endif]--> </span> <span><style> </span> body <span>{ padding-top: 70px; } </span> <span></style> </span><span></head> </span><span><body> </span> <span><div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> </span> <span><div class="container"> </span> <span><div class="navbar-header"> </span> <span><button type="button" id="collbut" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> </span> <span><span class="sr-only">Toggle navigation</span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span></button> </span> <span><a class="navbar-brand" href="#">My first Neo4j application</a> </span> <span></div> </span> <span></div> </span><span></div> </span> <span><div class="container-fluid"> </span> <span>{% block content %} </span> <span>{% endblock content %} </span> <span></div> </span><span></body> </span><span></html></span>
ソーシャルネットワーク機能:ユーザーがフォローする人を表示します
でルートを作成します
ステップ2:Showuser Controllerアクションを作成します
<span><span><?php </span></span><span> </span><span><span>namespace Ikwattro<span>\SocialNetwork\Controller</span>; </span></span><span> </span><span><span>use Silex<span>\Application</span>; </span></span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>; </span></span><span> </span><span><span>class WebController </span></span><span><span>{ </span></span><span> </span><span> <span>public function home(Application $application, Request $request) </span></span><span> <span>{ </span></span><span> <span>$neo = $application['neo']; </span></span><span> <span>$q = 'MATCH (user:User) RETURN user'; </span></span><span> <span>$result = $neo->sendCypherQuery($q)->getResult(); </span></span><span> </span><span> <span>$users = $result->get('user'); </span></span><span> </span><span> <span>return $application['twig']->render('index.html.twig', array( </span></span><span> <span>'users' => $users </span></span><span> <span>)); </span></span><span> <span>} </span></span><span><span>}</span></span>
ワークフローは他のアプリケーションに似ており、ログインに基づいてユーザーを見つけようとします。
存在しない場合は、404エラーページを表示します。それ以外の場合は、ユーザーデータをテンプレートに渡します。{% extends "layout.html.twig" %} {% block content %} <span><span><span><ul</span> class<span>="list-unstyled"</span>></span> </span> {% for user in users %} <span><span><span><li</span>></span>{{ user.property('firstname') }} {{ user.property('lastname') }}<span><span></li</span>></span> </span> {% endfor %} <span><span><span></ul</span>></span> </span>{% endblock %}ステップ3:show_userテンプレートファイルを作成します
<span>cd spsocial/web </span>php <span>-S localhost:8000 </span><span>open localhost:8000</span>ホームページを更新し、ユーザーのプロフィールとフォローユーザーのリストを表示するためにユーザーをクリックしてください
<span>$app->get('/user/{login}', 'Ikwattro\SocialNetwork\Controller\WebController::showUser') </span> <span>->bind('show_user');</span>
提案の追加
次のステップは、プロファイルに提案を提供することです。 2度目のネットワークに基づいて提案を見つけるためにオプションの一致を追加することにより、コントローラーのCypherクエリをわずかに拡張する必要があります。
更新されたテンプレート:
アプリケーションで提案をすぐに探索できます:
<span>public function showUser(Application $application, Request $request, $login) </span> <span>{ </span> <span>$neo = $application['neo']; </span> <span>$q = 'MATCH (user:User) WHERE user.login = {login} </span><span> OPTIONAL MATCH (user)-[:FOLLOWS]->(f) </span><span> RETURN user, collect(f) as followed'; </span> <span>$p = ['login' => $login]; </span> <span>$result = $neo->sendCypherQuery($q, $p)->getResult(); </span> <span>$user = $result->get('user'); </span> <span>$followed = $result->get('followed'); </span> <span>if (null === $user) { </span> <span>$application->abort(404, 'The user $login was not found'); </span> <span>} </span> <span>return $application['twig']->render('show_user.html.twig', array( </span> <span>'user' => $user, </span> <span>'followed' => $followed </span> <span>)); </span> <span>}</span>
{% extends "layout.html.twig" %} {% block content %} <span><span><span><h1</span>></span>User informations<span><span></h1</span>></span> </span> <span><span><span><h2</span>></span>{{ user.property('firstname') }} {{ user.property('lastname') }}<span><span></h2</span>></span> </span> <span><span><span><h3</span>></span>{{ user.property('login') }}<span><span></h3</span>></span> </span> <span><span><span><hr</span>/></span> </span> <span><span><span><div</span> class<span>="row"</span>></span> </span> <span><span><span><div</span> class<span>="col-sm-6"</span>></span> </span> <span><span><span><h4</span>></span>User <span><span><span</span> class<span>="label label-info"</span>></span>{{ user.property('login') }}<span><span></span</span>></span> follows :<span><span></h4</span>></span> </span> <span><span><span><ul</span> class<span>="list-unstyled"</span>></span> </span> {% for follow in followed %} <span><span><span><li</span>></span>{{ follow.property('login') }} ( {{ follow.property('firstname') }} {{ follow.property('lastname') }} )<span><span></li</span>></span> </span> {% endfor %} <span><span><span></ul</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> {% endblock %}
ユーザーへの接続(関係の追加)
提案されたユーザーに接続するために、両方のユーザーを非表示のフィールドとして含める各提案されたユーザーに投稿フォームリンクを追加します。また、対応するルートとコントローラーのアクションも作成します
ルートの作成:
<span>{ </span> <span>"require": { </span> <span>"silex/silex": "~1.1", </span> <span>"twig/twig": ">=1.8,<2.0-dev", </span> <span>"symfony/twig-bridge": "~2.3", </span> <span>"neoxygen/neoclient": "~2.1" </span> <span>}, </span> <span>"autoload": { </span> <span>"psr-4": { </span> <span>"Ikwattro\SocialNetwork\": "src" </span> <span>} </span> <span>} </span><span>}</span>
ここでは珍しいことはありません。開始ユーザーノードとターゲットユーザーノードに一致し、対応するフォロー関係をマージします。重複するエントリを避けるために、関係にマージを使用します。
テンプレート:
<span><span><?php </span></span><span> </span><span><span>require_once __DIR__.'/../vendor/autoload.php'; </span></span><span> </span><span><span>use Neoxygen<span>\NeoClient\ClientBuilder</span>; </span></span><span> </span><span><span>$app = new Silex<span>\Application</span>(); </span></span><span> </span><span><span>$app['neo'] = $app->share(function(){ </span></span><span> <span>$client = ClientBuilder<span>::</span>create() </span></span><span> <span>->addDefaultLocalConnection() </span></span><span> <span>->setAutoFormatResponse(true) </span></span><span> <span>->build(); </span></span><span> </span><span> <span>return $client; </span></span><span><span>}); </span></span><span> </span><span><span>$app->register(new Silex<span>\Provider\TwigServiceProvider</span>(), array( </span></span><span> <span>'twig.path' => __DIR__.'/../src/views', </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\MonologServiceProvider</span>(), array( </span></span><span> <span>'monolog.logfile' => __DIR__.'/../logs/social.log' </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\UrlGeneratorServiceProvider</span>()); </span></span><span> </span><span><span>$app->get('/', 'Ikwattro\SocialNetwork\Controller\WebController::home') </span></span><span> <span>->bind('home'); </span></span><span> </span><span><span>$app->run();</span></span>次に、次のように提案されているユーザーのフォローボタンをクリックできます:
関係を削除するためのワークフローは、新しい関係を追加し、ルート、コントローラーアクションを作成し、レイアウトを調整するのとほぼ同じです。
ルート:
コントローラーアクション:
<span><!DOCTYPE html> </span><span><html lang="en"> </span><span><head> </span> <span><meta charset="utf-8"> </span> <span><meta http-equiv="X-UA-Compatible" content="IE=edge"> </span> <span><meta name="viewport" content="width=device-width, initial-scale=1"> </span> <span><meta name="description" content=""> </span> <span><meta name="author" content=""> </span> <span><title>My first Neo4j application</title> </span> <span><!-- Bootstrap core CSS --> </span> <span><link href="{{ app.request.basepath }}/assets/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> </span> <span><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> </span> <span><!--[if lt IE 9]> </span> <span><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> </span> <span><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> </span> <span><![endif]--> </span> <span><style> </span> body <span>{ padding-top: 70px; } </span> <span></style> </span><span></head> </span><span><body> </span> <span><div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> </span> <span><div class="container"> </span> <span><div class="navbar-header"> </span> <span><button type="button" id="collbut" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> </span> <span><span class="sr-only">Toggle navigation</span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span></button> </span> <span><a class="navbar-brand" href="#">My first Neo4j application</a> </span> <span></div> </span> <span></div> </span><span></div> </span> <span><div class="container-fluid"> </span> <span>{% block content %} </span> <span>{% endblock content %} </span> <span></div> </span><span></body> </span><span></html></span>
ここでは、2人のユーザー間の関係を見つけるためにMatchを使用したことがわかります
<span><span><?php </span></span><span> </span><span><span>namespace Ikwattro<span>\SocialNetwork\Controller</span>; </span></span><span> </span><span><span>use Silex<span>\Application</span>; </span></span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>; </span></span><span> </span><span><span>class WebController </span></span><span><span>{ </span></span><span> </span><span> <span>public function home(Application $application, Request $request) </span></span><span> <span>{ </span></span><span> <span>$neo = $application['neo']; </span></span><span> <span>$q = 'MATCH (user:User) RETURN user'; </span></span><span> <span>$result = $neo->sendCypherQuery($q)->getResult(); </span></span><span> </span><span> <span>$users = $result->get('user'); </span></span><span> </span><span> <span>return $application['twig']->render('index.html.twig', array( </span></span><span> <span>'users' => $users </span></span><span> <span>)); </span></span><span> <span>} </span></span><span><span>}</span></span>そして、私はそれを削除できるように関係にフォローする識別子を追加しました。
テンプレート:
これで、各ユーザーの下の関係ボタンをクリックできます:
{% extends "layout.html.twig" %} {% block content %} <span><span><span><ul</span> class<span>="list-unstyled"</span>></span> </span> {% for user in users %} <span><span><span><li</span>></span>{{ user.property('firstname') }} {{ user.property('lastname') }}<span><span></li</span>></span> </span> {% endfor %} <span><span><span></ul</span>></span> </span>{% endblock %}
結論
マニュアルhttp://neo4j.com/docs/stable/、
を読んで、もっと発見することをお勧めします
Neo4Jユーザーが提供するユースケースと例を見て、Twitterで @neo4jをフォローしてください。
NEO4Jとは何ですか、なぜPHPアプリケーションで重要なのか? PHPアプリケーションでは、開発者がグラフデータモデルでデータを保存、管理、および照会できるため、重要です。 NEO4Jを使用すると、大量のデータをリアルタイムで処理および分析できるため、PHPアプリケーションでソーシャルネットワーク機能を構築するのに最適です。
NEO4Jをインストールするには、公式Webサイトから最新バージョンをダウンロードし、インストール手順に従ってください。インストールしたら、通常はNEO4Jインストールの「conf」ディレクトリにある構成ファイルを編集して構成できます。その後、NEO4J PHPクライアントを使用してPHPアプリケーションに接続できます。
PHPアプリケーションを新しいバージョンに移行するにはどうすればよいですか?非推奨機能を削除し、新しい機能を使用し、アプリケーションをテストして正しく機能することを確認するためのコード。生産環境に変更を適用する前に、最初に開発環境でこれを行うことをお勧めします。 🎜>いくつかの一般的な課題には、大量のデータの処理、複雑な関係の管理、リアルタイムのパフォーマンスの確保が含まれます。これらは、NEO4Jなどの適切なデータベースを使用し、クエリを最適化し、効率的なデータ構造とアルゴリズムを使用することで克服できます。効率的なクエリを使用し、データのインデックスを作成し、NEO4Jの組み込みパフォーマンスチューニング機能を使用することにより、NEO4Jを使用したPHPアプリケーションのパフォーマンスを最適化できます。また、JITコンピレーションやプリロードなどのPHPのパフォーマンス向上機能を使用することもできます。接続、認証と承認の実装、およびNEO4Jの組み込みセキュリティ機能の使用。また、入力の検証、準備されたステートメントの使用、PHPのインストールを最新の状態に保つなど、PHPセキュリティのベストプラクティスに従う必要があります。
ドキュメント、チュートリアル、コミュニティフォーラムなど、公式のNEO4JおよびPHP Webサイトでリソースを見つけることができます。また、このトピックを詳細にカバーする多くのオンラインコース、本、ブログもあります。
以上がNEO4Jを使用してPHPアプリにソーシャルネットワーク機能を追加するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。