2012-11-20 12 views
13

Nell'uso del framework laravel, come posso chiamare una funzione definita in base_controller, in una vista. Per exacmple:Laravel: chiamata delle funzioni definite in base_controller dalla vista

class Base_Controller extends Controller { 

    public static function format_something() 
    { 
     return something; 
    } 
} 

Come posso chiamare format_something() in vista di un file?

Generalmente l'errore si presenta in modo simile al seguente: Il metodo [link_to_action] non è definito nella classe View.

Probabilmente una domanda stupida, ma grazie in anticipo!

Modifica

Va bene! Innanzitutto, il posto giusto per fare qualcosa di simile è nella cartella delle librerie. In secondo luogo, il problema è che la tua classe non può avere caratteri di sottolineatura.

Quindi, in applicazione/librerie che ho fatto lima AppHelper.php con classe

class AppHelper { 

    public static function format_something() 
    { 
     return something; 
    } 
} 

e può chiamarla come:

$formated = AppHelper::format_something; 

Grazie per l'aiuto e il buon forum trovare Boofus McGoofus.

risposta

10

Questa risposta è stata scritta per Laravel 3. Per Laravel 4 e dopo, la risposta di Lajdák Marek utilizzando l'autoloader di Composer è migliore.

Funzioni come format_something() non appartengono al controller. Il controller dovrebbe semplicemente raccogliere dati da varie fonti e passarle alla vista. Il lavoro è per lo più solo routing.

Ho creato una cartella chiamata "helpers" nella cartella dell'applicazione per tutte le mie piccole funzioni di helpery. Per assicurarsi che tutti i miei controllori, viste e modelli hanno accesso ad essi, ho incluso il seguente nel mio start.php di file:

foreach(glob(path('app').'helpers/*.php') as $filename) { 
    include $filename; 
} 

Ho il sospetto che ci sia un modo migliore per farlo, ma finora ha ha funzionato per me

+0

così ho fatto un file di libreria chiamata App_Helpers.php con App_Helpers classe e da quello che posso dire al mio caricatore automatico in start.php sta caricando la cartella di librerie di default, sì la mia app ancora non sembrano sapere cosa App_Helpers :: format_something() è? – Jim

+1

@Jim - Penso che la risposta sia qui: http://forums.laravel.com/viewtopic.php?pid=18328#p18328 - nessuna sottolineatura nei nomi delle classi delle librerie –

+0

Ah sì! Grazie, ottima scoperta! – Jim

20

Per me funziona:

creare la cartella "aiutanti" o qualsiasi altra cosa e il file:

// app/helpers/AppHelper.php 

class AppHelper { 

    public static function format_something() 
    { 
     return something; 
    } 
} 

Aggiungi percorso composer.json

// composer.json 

    "autoload": { 
     "classmap": [ 
        "app/helpers" // <-------- add this line 
     ] 
    }, 

Run: (ricaricare il caricamento automatico)

composer dump-autoload 

Ora è possibile chiamare:

$formated = AppHelper::format_something(); 
+0

Questo metodo è anche molto utile, specialmente se si sta usando compositore nel tuo progetto. (FYI questa discussione era per L3). – Jim

+0

Mi piace la tua idea e funziona come fascino. – gwinh

+4

Utilizzando questa tecnica, posso chiamare il metodo nel controller, ma non in un modello. Quello che alla fine voglio è poter fare {{Notifier :: alert ('info', 'My info message')}} nel modello di visualizzazione. Come potrei ottenere quello? – jcorry

2

Si può ispirare se stessi da Laravel framework itself.

Prenderò il tuo esempio di un programma di formattazione e fare riferimento all'helper url in Laravel Framework.

Inizia creando il proprio helpers.php del file:

<?php 

if (! function_exists('format_that')) { 
    /** 
    * Generate something 
    * 
    * @param string $text 
    * @return string 
    */ 
    function format_that($text) 
    { 
     return app('formatter')->format_that($text); 
    } 
} 

E add it al composer.json del file:

"autoload": { 
     "files": [ 
      "app/helpers/helpers.php" 
     ] 
} 

Esegui questo comando per ricreare il file autoload php:

$ composer dumpautoload 

Crea il tuo service providerapp/Providers/FormatterServiceProvider.php:

<?php 

namespace Illuminate\Routing; 

use Illuminate\Support\ServiceProvider; 
use App\Helpers\FormatGenerator; 

class FormatterServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app['formatter'] = $this->app->share(function ($app) { 
      return new FormatGenerator($app['request']); 
     }); 
    } 
} 

Register proprio fornitore di servizi. quadro laravel invoca register metodo, ma avete solo bisogno di aggiungerlo per la vostra applicazione file di configurazione config/app.php:

'providers' => [ 


     /* 
     * Application Service Providers... 
     */ 
     App\Providers\AppServiceProvider::class, 
     // other providers... 
     App\Providers\FormatterServiceProvider::class, 

] 

Infine, creare il actual generator classapp/Helpers/FormatGenerator.php

<?php 

namespace App\Helpers; 

use Illuminate\Http\Request; 

class FormatGenerator 
{ 

    protected $request; 

    /** 
    * Create a new URL Generator instance. 
    * 
    * @param \Illuminate\Routing\RouteCollection $routes 
    * @param \Illuminate\Http\Request $request 
    * @return void 
    */ 
    public function __construct(Request $request) 
    { 
     $this->request = $request; 
    } 

    public function format_that($text){ 
     if ($request->path() == "home"){ 
      return mb_strtoupper($text); 
     } 
     else{ 
      return $text; 
     } 
    } 

} 

Opzionalmente si può creare a Facadeapp/Facade/Formatter.php, per essere in grado di do Formatter::format_that($text):

<?php 

namespace App\Facades; 

use Illuminate\Support\Facades\Facade; 

/** 
* @see \App\Helpers\FormatGenerator 
*/ 

class Formatter extends Facade 
{ 
    protected static function getFacadeAccessor() { return 'formatter'; } 
} 

Si coul d chiediti:

  • Perché la facciata? È possibile riutilizzare il componente da qualche altra parte semplicemente chiamando Formatter::format_that($text) anziché app('formatter')->format_that($text). Sintassi zucchero davvero.
  • Perché il fornitore di servizi? Iniezioni di dipendenza. Se è necessario utilizzare Request o si desidera creare un oggetto complesso, il fornitore di servizi si prenderà cura di questo e lo renderà disponibile nell'oggetto $app.
Problemi correlati