2012-11-20 18 views
13

Podczas korzystania z frameworka laravel, w jaki sposób wywołać funkcję zdefiniowaną w base_controller, w widoku. Na przykład:Laravel: Funkcje wywołania zdefiniowane w base_controller z widoku

class Base_Controller extends Controller { 

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

Jak mogę wywołać format_something() w pliku widoku?

Zwykle otrzymywany przeze mnie błąd wygląda mniej więcej tak: Metoda [link_to_action] nie jest zdefiniowana w klasie View.

Prawdopodobnie głupie pytanie, ale z góry dzięki!

Edit

Ok! Najpierw poprawne miejsce do zrobienia czegoś takiego znajduje się w folderze bibliotek. Po drugie, problem polega na tym, że klasa nie może zawierać podkreśleń.

Więc w aplikacji/bibliotek Zrobiłem plik AppHelper.php z klasą

class AppHelper { 

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

A może nazwać to lubią:

$formated = AppHelper::format_something; 

Dzięki za pomoc i dobre forum znaleźć Boofus McGoofus.

Odpowiedz

10

Ta odpowiedź została napisana dla Laravel 3. Dla Laravel 4 i później odpowiedź Lajdáka Marka przy użyciu autoloadera Composer jest lepsza.

Funkcje takie jak format_something() nie należą do kontrolera. Kontroler powinien po prostu gromadzić dane z różnych źródeł i przekazywać je do widoku. Jego zadaniem jest głównie rutowanie.

Utworzyłem folder o nazwie "helpers" w folderze aplikacji dla wszystkich moich małych funkcji helpery. Aby upewnić się, że wszystkie moje kontrolery, widoki, i modele mają do nich dostęp, podaję następujące w moim start.php pliku:

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

Podejrzewam, że istnieje lepszy sposób to zrobić, ale jak dotąd nie ma pracował dla mnie.

+0

Więc zrobiłem plik biblioteki o nazwie App_Helpers.php z App_Helpers klasy iz tego co mogę powiedzieć mój autoloadera w start.php jest ładowanie folder bibliotek domyślnie, tak moja aplikacja nadal nie wydaje się wiedzieć, jakie App_Helpers :: format_something() to? – Jim

+1

@Jim - Myślę, że odpowiedź jest tutaj: http://forums.laravel.com/viewtopic.php?pid=18328#p18328 - brak podkreśleń w nazwach klas biblioteki –

+0

Ach tak! Dziękuję bardzo dobrze znaleźć! – Jim

20

Dla mnie działa:

utworzyć katalogu "pomocników" lub cokolwiek i plik:

// app/helpers/AppHelper.php 

class AppHelper { 

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

Dodaj ścieżkę do composer.json

// composer.json 

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

Uruchom: (przeładowanie AutoLoad)

composer dump-autoload 

Teraz można nazwać:

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

Ta metoda jest również bardzo przydatna, szczególnie jeśli używasz kompozytor w twoim projekcie. (FYI ten wątek był dla L3). – Jim

+0

Podoba mi się twój pomysł i działa jak urok. – gwinh

+4

Korzystając z tej techniki, mogę wywołać metodę w kontrolerze, ale nie w szablonie. Ostatecznie chcę mieć możliwość {{Powiadomienia :: alert ("informacje", "Moja wiadomość informacyjna")}} w szablonie widoku. Jak to osiągnąć? – jcorry

2

Możesz inspirować się od Laravel framework itself.

Podam twój przykład formatyzatora i zajrzyj do pomocnika url w Laravel Framework.

zacząć od stworzenia własnego helpers.php plik:

<?php 

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

And add it do pliku composer.json:

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

wykonaniu tego polecenia, aby odtworzyć plik autoload PHP:

$ composer dumpautoload 

Stwórz swoją 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 usługodawca. Laravel ramy wywołuje register metody, ale wystarczy dodać go do swojej aplikacji pliku konfiguracyjnym config/app.php:

'providers' => [ 


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

] 

Wreszcie, stwórz 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; 
     } 
    } 

} 

Opcjonalnie można utworzyć a Facadeapp/Facade/Formatter.php, aby móc 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'; } 
} 

You coul d zadaj sobie pytanie:

  • Dlaczego fasada? Możesz ponownie użyć komponentu w innym miejscu, dzwoniąc pod numer Formatter::format_that($text) zamiast app('formatter')->format_that($text). Składnia cukru naprawdę.
  • Dlaczego dostawca usługi? Wstrzyknięcia zależności. Jeśli chcesz użyć obiektu Request lub chcesz zbudować złożony obiekt, dostawca usług zaopiekuje się nim i udostępni go w obiekcie $app.
Powiązane problemy