Laravel: fonctions D'appel définies dans le contrôleur de base

En utilisant le framework laravel, comment puis-je appeler une fonction définie dans base_controller, dans une vue. Pour exactementmple:

class Base_Controller extends Controller {

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

Comment puis-je appeler format_something() dans un fichier de vue?

habituellement, l'erreur que j'obtiens ressemble à quelque chose comme ceci: La méthode [link_to_action] n'est pas définie dans la classe View.

Probablement une question stupide, mais merci d'avance!

Modifier

Ok! D'abord le bon endroit pour faire quelque chose comme dans le dossier des bibliothèques. Deuxièmement, le problème est que votre classe ne peut pas avoir de underscores.

donc dans application / libraries J'ai fait file AppHelper.php avec la classe

class AppHelper {

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

Et peut l'appeler comme:

$formated = AppHelper::format_something;

Merci pour l'AIDE et le bon forum trouver Boofus McGoofus.

14
demandé sur tereško 2012-11-21 00:01:15

3 réponses

cette réponse a été écrite pour Laravel 3. Pour Laravel 4 et les suivants, la réponse de Lajdák Marek en utilisant L'autoloader de Composer est meilleure.

Fonctions format_something() n'appartient pas à la manette. Le contrôleur devrait simplement être sur la collecte de données à partir de diverses sources et de le passer à la vue. C'est le travail est principalement de routage.

j'ai créé un dossier appelé "helpers" dans le dossier application pour toutes mes petites fonctions d'assistance. Assurez-vous que tous mes contrôleurs, les vues, et les modèles ont accès à eux, j'ai inclus les éléments suivants dans mon start.php fichier:

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

je soupçonne qu'il y a une meilleure façon de le faire, mais jusqu'à présent, il a travaillé pour moi.

10
répondu J.T. Grimes 2015-04-13 17:31:20

Pour moi, c'est:

Créer un répertoire "aides" ou quoi que ce soit et fichier:

// app/helpers/AppHelper.php

class AppHelper {

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

Ajouter un chemin à composer.json

// composer.json

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

Exécuter: (recharger l'autoload)

composer dump-autoload

Maintenant, vous pouvez appeler:

$formated = AppHelper::format_something();
21
répondu Lajdák Marek 2014-01-06 05:08:25

vous pouvez Vous inspirez-vous de Laravel cadre lui-même.

je vais prendre l'exemple d'un module de formatage et reportez-vous à url helper dans le Framework Laravel.

Commencez par créer votre propre helpers.php fichier:

<?php

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

Et ajouter pour votre composer.json fichier:

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

exécutez cette commande pour recréer le fichier php autoload:

$ composer dumpautoload

créez votre prestataire de services app/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']);
        });
    }
}

s'Inscrire votre fournisseur de services. Laravel framework invoque register méthode mais vous n'avez qu'à l'ajouter à votre fichier app config config/app.php:

 'providers' => [


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

 ]

Enfin, créez votre classe de la génératrice réelleapp/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;
        }
    }

}

vous pouvez créer en option une Façadeapp/Facade/Formatter.php, pour être en mesure de le faire 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'; }
}

Vous pourriez demander vous-même:

  • Pourquoi la façade? Vous pouvez réutiliser le composant ailleurs en appelant simplement Formatter::format_that($text) au lieu de app('formatter')->format_that($text). Sucre syntaxe vraiment.
  • pourquoi le fournisseur de services? injections de dépendance. Si vous avez besoin d'utiliser Request ou si vous voulez construire un objet complexe, le prestataire prendra en charge pour vous les rendre disponibles dans votre $app objet.
2
répondu Capripot 2016-08-19 22:47:58