Heim >Backend-Entwicklung >PHP-Tutorial >Hinzufügen von Funktionen für soziale Netzwerke zu einer PHP -App mit NEO4J
Im letzten Teil haben wir über Neo4j und wie man es mit PHP verwendet. In diesem Beitrag werden wir dieses Wissen verwenden, um eine echte Silex-Anwendung für soziale Netzwerke mit einer Diagrammdatenbank zu erstellen.
Erstellen Sie ein Verzeichnis für die App. Ich nannte meine spsoziale.
Fügen Sie diese Zeilen Ihrem Composer.json hinzu und führen Sie den Komponisten aus, um die Abhängigkeiten zu installieren:
<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>Sie können Bootstrap im Web/Assets -Ordner Ihres Projekts herunterladen und installieren.
finden Sie hier auch die Bootstrap-Demo-App: https://github.com/sitepoint-editors/social-network
Einrichten Sie die Silex -Anwendung
<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>twig ist so konfiguriert, dass er seine Vorlagendateien im Ordner SRC/Views befindet.
Eine Home -Route, die auf / ist registriert und konfiguriert, um den WebController zu verwenden, den wir später erstellen werden.
Die Anwendungsstruktur sollte so aussehen:
Der nächste Schritt besteht darin, unser Basislayout mit einem Inhaltsblock zu erstellen, den unsere Kinder -Zweigvorlagen mit ihren eigenen Inhalten überschreiben.
Ich nehme das Standard -Bootstrap -Thema mit einer Navigationsleiste oben:
<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>Die Startseite (Abrufen aller Benutzer)
wir können dies in zwei Schritten erreichen:
<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>
Der Controller zeigt den Prozess, wir rufen den NEO -Dienst ab und geben eine Cypher -Abfrage aus, um alle Benutzer abzurufen.
Die Benutzersammlung wird dann an die Index.html.twig -Vorlage übergeben.
<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>
Die Vorlage ist sehr leicht. Sie erweitert unser Basislayout und fügt eine unsortierte Liste mit den FirstNames und LastNames des Benutzers im Inhalt geerbten Block hinzu.
Starten Sie den integrierten PHP-Server und bewundern Sie Ihre Arbeit:
<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>
Nehmen wir jetzt an, wir möchten auf einen Benutzer klicken und seine Detailinformationen und die Benutzer, die er folgt, präsentiert werden.
Schritt 1: Erstellen Sie eine Route in Index.php
<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>
Schritt 2: Erstellen Sie die Aktion von ShowUser Controller
{% 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 %}
Der Workflow ähnelt allen anderen Anwendungen. Sie versuchen, den Benutzer basierend auf der Anmeldung zu finden.
Wenn es nicht vorhanden ist, zeigen Sie eine 404 -Fehlerseite an, andernfalls übergeben Sie die Benutzerdaten an die Vorlage.
Schritt 3: Erstellen Sie die Vorlagendatei show_user
<span>cd spsocial/web </span>php <span>-S localhost:8000 </span><span>open localhost:8000</span>
Schritt 4: Wiederblenden Sie die Liste der Benutzer auf der Homepage um, um Links zu ihrem Profil
anzuzeigen<span>$app->get('/user/{login}', 'Ikwattro\SocialNetwork\Controller\WebController::showUser') </span> <span>->bind('show_user');</span>
Aktualisieren Sie die Homepage und klicken Sie auf jeden Benutzer, um sein Profil und die Liste der folgenden Benutzer
anzuzeigen
Der nächste Schritt besteht darin, dem Profil Vorschläge zu geben. Wir müssen unsere Cypher -Abfrage im Controller leicht erweitern, indem wir eine optionale Übereinstimmung hinzufügen, um Vorschläge basierend auf dem Netzwerk zweiten Grades zu finden.
Das optionale Präfix bewirkt, dass ein Match eine Zeile zurückgibt, auch wenn es keine Übereinstimmungen gab, aber mit den nicht aufgelösten Teilen auf Null eingestellt ist (ähnlich wie ein äußerer Join). Da wir möglicherweise mehrere Wege für jeden Freund von A-Friend (FOF) erhalten, müssen wir die Ergebnisse unterscheiden, um Duplikate in unserer Liste zu vermeiden (sammeln Sie eine Aggregationsoperation, die Werte in ein Array sammelt):
Der aktualisierte Controller:
<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>
Die aktualisierte Vorlage:
{% 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 %}
Sie können sofort die Vorschläge in Ihrer Bewerbung untersuchen:
Um eine Verbindung zu einem vorgeschlagenen Benutzer herzustellen, fügen wir jedem vorgeschlagenen Benutzer, der beide Benutzer als versteckte Felder enthalten, einen Postformular -Link hinzu. Wir erstellen auch die entsprechende Route und die Controller -Aktion.
Erstellen der Route:
{% for user in users %} <span><span><span><li</span>></span> </span> <span><span><span><a</span> href<span>="{{ path('show_user', { login: user.property('login') }) }}"</span>></span> </span> {{ user.property('firstname') }} {{ user.property('lastname') }} <span><span><span></a</span>></span> </span> <span><span><span></li</span>></span> </span>{% endfor %}
Die Controller -Aktion:
<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>
Nichts Ungewöhnliches hier, wir stimmen mit dem Startbenutzerknoten und dem Zielbenutzerknoten überein und fusionieren dann die entsprechende folgende Beziehung. Wir verwenden die Beziehung, um doppelte Einträge zu vermeiden.
Die Vorlage:
<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>
Sie können jetzt auf die Schaltfläche "Folge" des vorgeschlagenen Benutzers klicken, dem Sie folgen möchten:
Beziehungen entfernen:
Der Workflow zum Entfernen von Beziehungen ist ziemlich gleich wie beim Hinzufügen neuer Beziehungen, erstellen Sie eine Route, eine Controller -Aktion und passen Sie das Layout an:
Die Route:
<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>
Die Controller -Aktion:
<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>
Sie können hier sehen, dass ich übereinstimmte, um die Beziehung zwischen den beiden Benutzern zu finden,
und ich habe hinzugefügt, dass eine Kennung der Beziehung folgt, um sie löschen zu können.
Die Vorlage:
{% 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 %}
Sie können jetzt unter den folgenden Benutzer auf die Schaltfläche zur Beziehung entfernen klicken:
Graph -Datenbanken passen perfekt für relationale Daten, und es ist einfach, sie mit PHP und Neoclient zu verwenden.
Cypher ist eine bequeme Abfragesprache, die Sie schnell lieben werden, da es Sie ermöglicht, Ihr Diagramm auf natürliche Weise abzufragen.
Es gibt so viel davon von der Verwendung von Graph -Datenbanken für reale Daten,
,
Ich lade Sie ein, mehr zu entdecken, indem Sie das Handbuch http://neo4j.com/docs/stable/,
Um NEO4J zu installieren, müssen Sie die neueste Version von der offiziellen Website herunterladen und den Installationsanweisungen befolgen. Nach der Installation können Sie es konfigurieren, indem Sie die Konfigurationsdatei bearbeiten, die sich normalerweise im Verzeichnis "Conf" Ihrer NEO4J -Installation befindet. Sie können es dann mit einem NEO4J -PHP -Client mit Ihrer PHP -Anwendung verbinden.
Wie kann ich meine PHP -Anwendung in eine neuere Version migrieren? Ihr Code zum Entfernen von veralteten Funktionen und zur Verwendung neuer und testen Sie Ihre Anwendung, um sicherzustellen, dass sie korrekt funktioniert. Es wird empfohlen, dies in einer Entwicklungsumgebung zuerst zu tun, bevor die Änderungen in der Produktionsumgebung angewendet werden. Zu einigen häufigen Herausforderungen gehören die Behandlung großer Datenmengen, die Verwaltung komplexer Beziehungen und die Gewährleistung der Echtzeitleistung. Diese können durch die Verwendung einer geeigneten Datenbank wie Neo4J, die Optimierung Ihrer Abfragen und die Verwendung effizienter Datenstrukturen und Algorithmen überwunden werden. Kann die Leistung Ihrer PHP-Anwendung mit NEO4J optimieren, indem Sie effiziente Abfragen verwenden, Ihre Daten indizieren und die eingebauten Leistungseinstellungen von NEO4J verwenden. Sie können auch die leistungssteigernden Funktionen von PHP wie JIT-Kompilierung und Vorspannungsfunktionen verwenden.
Das obige ist der detaillierte Inhalt vonHinzufügen von Funktionen für soziale Netzwerke zu einer PHP -App mit NEO4J. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!