2014-09-22 5 views
6

Looked ein paar Tutorials auf Fassaden und Laravel 4 ... versuchte einige ... nicht so, wie sie arbeiten.So erstellen Sie benutzerdefinierte Fassade in Laravel 4

Zum Beispiel, sie bieten nicht alle eine Möglichkeit zu definieren, wo die Fassade Dateien und Service Provider zu speichern ... und ich habe versucht, davon weg und stieß meinen Kopf in ein paar Wände, bis ich mich entschieden Mach diesen Thread.

Also: Sagen wir, ich habe eine App namens Laracms (Laravel cms).

Ich möchte alles, was ich erstelle - Fassaden, Dienstleister usw. in einem Ordner unter der App namens Laracms speichern.

Also ich hätte/app/laracms/Fassaden,/app/laracms/serviceproviders und so weiter. Ich möchte die Fassaden nicht mit den Datenbankmodellen mischen, ich möchte die Dinge so getrennt wie möglich halten.

Nehmen wir jetzt, in meinem Fall, den Namen der Einstellungen für die Fassade (ich möchte eine Einstellungsklasse für die Verwendung in Ansichten und Admin, um Misc. Zeug einrichten).

Einstellungen :: get(), Settings :: set() als Methoden.

Kann mir jemand erklären, wie man Fassaden richtig einrichtet? Ich weiß nicht, was ich falsch mache, und ich brauche einen Neuanfang.

Danke, Chris

die Suche nach einem Schritt für Schritt mit einfachen Erklärungen, wie und warum.

Antwort

13

Zuerst müssen Sie app/config/app.php und in providers Abschnitt gehen hinzufügen:

'Laracms\Providers\SettingsServiceProvider', 

In der gleichen Datei in aliases Abschnitt sollten Sie hinzufügen:

'Settings' => 'Laracms\Facades\Settings', 

In Ihrem app/Laracms/Providers sollten Sie Datei erstellen SettingsServiceProvider.php

<?php 

namespace Laracms\Providers; 

use Illuminate\Support\ServiceProvider; 

class SettingsServiceProvider extends ServiceProvider { 

    public function register() 
    { 
     $this->app->bind('settings', function() 
      { 
       return new \Laracms\Settings(); 
      }); 
    } 

} 

In Ihrem app/Laracms/Facades/ Sie sollten Settings.php-Datei erstellen:

<?php 

namespace Laracms\Facades; 

use Illuminate\Support\Facades\Facade; 

class Settings extends Facade { 

    protected static function getFacadeAccessor() { return 'settings'; } 

} 

Jetzt in Ihrem app/Laracms Verzeichnis Datei Settings.php erstellen sollten: Sie müssen

<?php 

namespace Laracms; 

class Settings { 
    public function get() {echo "get"; } 

    public function set() {echo "set"; } 
} 

Wie Sie Ihre Dateien in benutzerdefinierten Ordner Laracms haben wollte Fügen Sie diesen Ordner zu Ihrem composer.json hinzu (Wenn Sie den Standardordner app/models verwendet hätten, müssten Sie nichts zu dieser Datei hinzufügen). So jetzt öffnen composer.json Datei und in Abschnitt autoload ->classmap sollten Sie app/Laracms so diesen Abschnitt des Komponisten hinzufügen.json könnte wie folgt aussehen:

"autoload": { 
    "classmap": [ 
     "app/commands", 
     "app/controllers", 
     "app/models", 
     "app/database/migrations", 
     "app/database/seeds", 
     "app/tests/TestCase.php", 
     "app/Laracms" 
    ] 
}, 

Jetzt müssen Sie in Ihrem Projekt foler in der Konsole ausführen:

composer dump-autoload 

Klassenmap

erstellen Wenn alles in Ordnung ist, sollten Sie jetzt sein kann in Ihren Anwendungen Settings::get() und Settings:set()

verwenden Sie müssen beachten, dass ich Ordner mit Großbuchstaben verwendet, weil Namespaces von co Erfindung beginnt mit Großbuchstaben.

+0

Sollte ich nicht hinzufügen, um die Ordner das composer.json, um auch automatisch zu laden? Ich bekomme einen SettingsServiceProvider Klasse nicht gefunden Fehler – ied3vil

+0

@ ied3vil Sie hatten Recht, ich habe meinen Beitrag aktualisiert - Sie müssen Ihren Ordner zu 'classmap' in' composer.json' hinzufügen –

+0

Ich habe herausgefunden, dass zunächst, ich habe jetzt eine andere Frage: Der obige Code funktioniert jetzt gut, aber zum Beispiel habe ich, in der Methode get() versuche ich auf DB :: Fassade zuzugreifen ... das funktioniert nicht - irgendeine Idee, wie ich es zum Funktionieren bringen kann, das Richtige Weg? – ied3vil

2

Es gibt drei Komponenten zur Erstellung einer Fassade:

  • Die wanna be Fassade Klasse, die Klasse, die eine Fassade zu werden braucht.
  • Die Fassade erforderlich Klasse, die Laravel sagt die Klasse registriert es
  • Ein Service Provider
  • betrifft, die die Fassade Klasse in den Behälter App registriert

1. die wollen Fassade Klasse sein:

<?php namespace Moubarmij\Services\ModelsServices; 

class AuthenticationService extends MoubarmijService implements AuthenticationServiceInterface{ 


    /** 
    * @param $email 
    * @param $password 
    * 
    * @return mixed 
    */ 
    public function login($email, $password) 
    { 
     return Sentry::authenticate([ 
      'email' => $email, 
      'password' => $password, 
     ]); 
    } 

    /** 
    * @return mixed 
    */ 
    public function logout() 
    { 
     return Sentry::logout(); 
    } 

} 

2. die erforderliche Klasse für die Fassade zu arbeiten:

<?php namespace Moubarmij\Facades; 


use Illuminate\Support\Facades\Facade; 

/** 
* Class AuthenticationServiceFacade 
* @package Moubarmij\Services\ModelsServices 
*/ 
class AuthenticationServiceFacade extends Facade{ 

    /** 
    * Get the registered name of the component. 
    * 
    * @return string 
    */ 
    protected static function getFacadeAccessor() { return 'authentication_service'; } 


} 

Anmerkung: authentication_service kann frei gewählt werden (sein der Name der Komponente im IOC registriert) wollen

3. der Dienstleister

<?php namespace Moubarmij\Providers; 


use Illuminate\Support\ServiceProvider; 

/** 
* A service provider for the Authentication Service 
* 
* Class AuthenticationServiceSP 
* @package Moubarmij\Providers 
*/ 
class AuthenticationServiceSP extends ServiceProvider { 

    /** 
    * bind interfaces 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     // Register 'authentication_service' instance container to our AuthenticationService object 
     $this->app['authentication_service'] = $this->app->share(function($app) 
     { 
      return $app->make('Moubarmij\Services\ModelsServices\AuthenticationService'); 
     }); 

     // Shortcut to auto add the Alias in app/config/app.php 
     $this->app->booting(function() 
     { 
      $loader = \Illuminate\Foundation\AliasLoader::getInstance(); 
      $loader->alias('AuthenticationService', 'Moubarmij\Facades\AuthenticationServiceFacade'); 
     }); 

    } 
}