web-dev-qa-db-fra.com

Variable globale en laravel 4

Je me demandais comment faire une variable globale pour me sauver quelques lignes de copier et coller ces lignes. Arrangez-vous probablement et mettez-les dans une variable à la place? Je veux utiliser cette variable dans d'autres itinéraires.

  $providerEmail = Auth::user()->email;
  $providerName = Auth::user()->first_name;
  $providerSurname = Auth::user()->last_name;
  $providerMobile = Auth::user()->mobile;
19
nCore

Vous pouvez créer un événement singleton global dans App::before

App::before(function($request)
{
    // Singleton (global) object
    App::singleton('myApp', function(){
        $app = new stdClass;
        if (Auth::check()) {
            // Put your User object in $app->user
            $app->user = Auth::User();
            $app->isLoggedIn = TRUE;
        }
        else {
            $app->isLoggedIn = FALSE;
        }
        return $app;
    });
    $app = App::make('myApp');
    View::share('myApp', $app);
});

Dans n'importe quelle vue, utilisez-le comme

if($myApp->isLoggedIn) {
    $myApp->user->email;
    $myApp->user->first_name;
    // ...
}

Dans n'importe quel contrôleur, vous pouvez utiliser

$myApp = App::make('myApp');
if($myApp->isLoggedIn) {
    $myApp->user->email;
    $myApp->user->first_name;
    // ...
}

Départ Événements d'application .

52
The Alpha

Le meilleur moyen que j'ai vu est d'utiliser un fichier de configuration.

Dans votre application -> dossier de configuration, vous créez un nouveau fichier appelé (par exemple settings.php)

 app
     config
         settings.php

Ensuite, dans votre fichier de configuration que vous venez de créer (settings.php), vous pouvez ajouter:

<?php

$setting_data['foo'] = 'bar';
$setting_data['bar'] = 'foo';

return $setting_data;

Vous pouvez ensuite récupérer le fichier de configuration à partir de votre code en utilisant:

echo Config::get('settings.foo'); // Will echo bar
echo Config::get('settings.bar'); // Will echo foo
12
ajtrichards

Les globales sont mauvaises. Quoi qu'il en soit, n'utilisez pas de variables globales, ne pensez pas à utiliser des variables globales, réfléchissez toujours à la façon dont vous pouvez ne pas les utiliser dans votre code et dont vous avez toujours tout ce dont vous avez besoin. Voici quelques raisons , et il y en a beaucoup plus.

Utilisez plutôt Laravel pour vous aider à:

Forcer la connexion sur vos itinéraires en créant des groupes d’itinéraires authentifiés:

Route::group(array('before' => 'auth'), function()
{
    Route::get('/users/posts', array('as'=>'users.posts.index', 'uses'=>'PostsController@usersPostsIndex'));
});

Maintenant, vous savez que chaque appel de vos publications sera authentifié, vous pouvez simplement

class PostsController extends Controller {

    public function usersPostsIndex()
    {
        return View::('users.posts.index')->
                with('user', Auth::user());
    }

}

À votre avis, il vous suffira de

{{$user->email}}
{{$user->first_name . ' ' . $user->last_name}}
{{$user->email}}
{{$user->mobile}}

Si vous ne voulez pas écrire de code pour envoyer une instance utilisateur à toutes vos vues, utilisez la magie de View Composers de Laravel, ajoutez-la à votre filters.php ou créez un fichier composers.php:

View::composer(array('users.posts.index','users.posts.edit'), function($view)
{
    $view->with('user', Auth::user());
});

Et voici comment vos points de vue peuvent être utilisés maintenant:

class PostsController extends Controller {

    public function usersPostsIndex()
    {
        return View::('users.posts.index');
    }

    public function usersPostsEdit()
    {
        return View::('users.edit.index');
    }

}

Parce que Laravel injectera automatiquement Auth::user() dans ces vues en tant que $user.

7

J'aime la méthode View::share.

Ajoutez les éléments suivants dans app/controllers/BaseController.php

class BaseController extends Controller {
    public function __construct() {       
        $name = 'jack';    
        View::share('user', $name); // Share $user with all views
    }
}

et maintenant $user sera disponible pour toutes vos vues.

Références: Laravel docs , article de blog

5
Justin

Je vous ai également donné la même réponse dans une autre question que vous avez posée, vous n'avez pas répondu. Lien

Il n'y a aucune raison d'avoir une variable distincte pour chaque propriété de votre modèle $provider. Enregistrez simplement le modèle entier dans une variable comme celle-ci.

if (Auth::check())
{
    $provider = Auth::user();
}

Cela se ferait généralement dans un itinéraire comme celui-ci.

Route::get('/provider/page/example', function()
{
    $provider = Auth::user();

    return View::make('name.of.view', ['provider' => $provider]);
});

Après avoir fait cela, vous pouvez accéder aux différentes propriétés du $provider dans vos vues comme ceci.

<p>Your email address is: {{$provider->email}} and your first name is {{$provider->first_name}}</p>

Une autre option consiste à utiliser un contrôleur et à définir cette variable une seule fois dans le contrôleur, ce qui la rend accessible depuis toutes les vues à l'aide de View::share().

class ProviderController extends BaseController {

    protected $provider;

    public function __construct()
    {
        $this->provider = Auth::user();

        View::share('provider', $this->provider);
    }

    public function getIndex()
    {
        return View::make('some.view.name');
    }
}

Après cela, vous pouvez utiliser la variable $provider dans vos vues, comme indiqué ci-dessus, en utilisant des éléments tels que $provider->email. Vous pouvez également l'utiliser ailleurs dans le contrôleur en utilisant $this->provider.

1
Sajan Parikh

Vous devriez créer un objet pour le faire.

Créez un objet provider avec ces propriétés, email, name, etc., puis instanciez-le et définissez les valeurs des propriétés, comme suit:

$provider = new Provider();

$provider->email = Auth::user()->email;

Et puis vous enregistrez l'objet dans votre session:

$_SESSION['provider'] = $provider;

Je ne connais pas Laravel et je ne sais pas s'il est judicieux de travailler directement avec l'objet Auth, mais une solution plus simple consisterait à:

$_SESSION['provider'] = Auth::user();

Veillez également à utiliser des informations sensibles sur votre session :)

0
Gerep