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.
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.
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();
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 deapp('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.