2014-09-22 12 views
6

Ho cercato alcuni tutorial su facciate e laravel 4 ... provato alcuni ... non mi è piaciuto il loro modo di lavorare.Come creare una facciata personalizzata in Laravel 4

Per esempio, non tutti offrono un modo di definire dove memorizzare i file di facciata e fornitori di servizi ... e ho cercato di allontanarsi da questo e ottenuto la mia testa ha urtato un paio di pareti fino a quando ho deciso di fai questo thread.

Quindi: supponiamo di avere un'app chiamata Laracms (laravel cms).

Mi piacerebbe archiviare tutto ciò che creo - facciate, fornitori di servizi, ecc. In una cartella sotto l'app chiamata laracms.

Quindi avrei/app/laracms/facciate,/app/laracms/serviceproviders e così via. Non voglio mescolare le facciate con i modelli di database, voglio mantenere le cose il più separate possibile.

Prendiamo ora, nel mio caso, il nome Impostazioni per la facciata (voglio implementare una classe di impostazioni da utilizzare nelle viste e nell'amministratore per configurare varie informazioni).

Impostazioni :: get(), Impostazioni :: set() come metodi.

Qualcuno può spiegare come impostare correttamente le facciate? Non so cosa sto sbagliando e ho bisogno di un nuovo inizio.

Grazie, Chris

ricerca di un passo per passo con semplici spiegazioni di come e perché.

risposta

13

Prima di tutto bisogna andare a app/config/app.php e in providers sezione aggiungere:

'Laracms\Providers\SettingsServiceProvider', 

Nello stesso file in aliases sezione si dovrebbe aggiungere:

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

Nel file app/Laracms/Providers è necessario creare 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(); 
      }); 
    } 

} 

Nella tua app/Laracms/Facades/ si dovrebbe creare il file Settings.php:

<?php 

namespace Laracms\Facades; 

use Illuminate\Support\Facades\Facade; 

class Settings extends Facade { 

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

} 

Ora nella directory app/Laracms si dovrebbe creare il file Settings.php:

<?php 

namespace Laracms; 

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

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

Come si voleva avere i file in cartella personalizzata Laracms è necessario aggiungi questa cartella al tuo composer.json (se hai usato la cartella standard app/models non avresti bisogno di aggiungere nulla a questo file). Quindi ora apri il file composer.json e nella sezione autoload ->classmap devi aggiungere app/Laracms quindi questa sezione del compositore.JSON potrebbe assomigliare a questo:

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

Ora è necessario per l'esecuzione in console all'interno del vostro progetto foler:

composer dump-autoload 

per creare mappa Categoria

Se tutto va bene, si dovrebbe ora essere in grado di utilizzare per le applicazioni Settings::get() e Settings:set()

È necessario notare che ho usato le cartelle con uppercases perché gli spazi dei nomi di co l'invenzione inizia con le lettere maiuscole.

+0

non dovrei aggiungere le cartelle per anche il compositore.json per autoload? sto ottenendo un errore di classe SettingsServiceProvider non trovato errore – ied3vil

+0

@ ied3vil Avevi ragione, ho aggiornato il mio post - devi aggiungere la tua cartella a 'classmap' in' composer.json' –

+0

Ho capito che inizialmente, ora ho un domanda diversa: il codice sopra funziona bene ora, ma per esempio ho, nel metodo get() sto cercando di accedere a DB :: facade ... che non funziona - qualsiasi idea su come posso farlo funzionare, il corretto modo? – ied3vil

2

Ci sono tre componenti per fare un Facciata:

  • La voglio essere Facciata classe, quella classe che ha bisogno di diventare una facciata.
  • La Facciata richiesto classe, che racconta laravel che ha registrato classe che concerne
  • un fornitore di servizi, che registra la classe Facciata nel contenitore App

1. la vogliono essere Facciata Classe:

<?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. la classe richiesta per la facciata di lavorare:

<?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'; } 


} 

nota: authentication_service può essere tutto quello che vuoi (il suo il nome del componente registrata nella CIO)

3. il fornitore di servizi

<?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'); 
     }); 

    } 
} 
Problemi correlati