Global variable in laravel 4

前端 未结 6 541
萌比男神i
萌比男神i 2020-12-07 23:17

I was wondering how to do a global variable to save me few lines of copy and pasting this lines. Array it probably and put them in one variable instead? I want to use this

相关标签:
6条回答
  • 2020-12-07 23:48

    You can create a global singleton within App::before event

    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);
    });
    

    In any view, use it like

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

    In any controller, you can use

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

    Check out Application Events.

    0 讨论(0)
  • 2020-12-07 23:48

    I also gave you the same answer in another question you asked, you did not respond. Link

    There is no reason to have a separate variable for each property of your $provider model. Simply save the entire model to a variable like this.

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

    This would generally be done in a route like this.

    Route::get('/provider/page/example', function()
    {
        $provider = Auth::user();
    
        return View::make('name.of.view', ['provider' => $provider]);
    });
    

    After having done that, you can access the different properties in of the $provider in your views like this.

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

    Another option is to use a controller and set this variable only once in the controller, making it accessible from all views using 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');
        }
    }
    

    After having done just this, you can use the $provider variable in your views as shown above using things like $provider->email. You can also use it elsewhere in the controller by using $this->provider.

    0 讨论(0)
  • 2020-12-07 23:56

    Globals are bad. No matter of what, don't use global variables, don't think about using global variables, always think about how can you not use them in your code and still have all you need to have. Here are some reasons, and there are lot more.

    Instead, use Laravel power to help you:

    Enforce login on your routes creating groups of authenticated routes:

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

    Now you know that every call to your posts will be authenticated, you can just

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

    In your view you'll just have to

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

    If you don't want to write code to send a User instance to all your views, use the magic of Laravel's View Composers, adding this to your filters.php or creating a composers.php file:

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

    And this is now how your views can be used now:

    class PostsController extends Controller {
    
        public function usersPostsIndex()
        {
            return View::('users.posts.index');
        }
    
        public function usersPostsEdit()
        {
            return View::('users.edit.index');
        }
    
    }
    

    Because Laravel will automatically inject Auth::user() in those views as $user.

    0 讨论(0)
  • 2020-12-08 00:00

    You should create an object to do that.

    Create a provider object with those properties, email, name, etc and instantiate it and set the properties values, like:

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

    And then you save the object in your session:

    $_SESSION['provider'] = $provider;
    

    I'm not familiar with Laravel and I don't know if it's a good practice to work directly with the Auth object but a simpler solution would be:

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

    Also be aware of working with sensitive information on your session :)

    0 讨论(0)
  • 2020-12-08 00:05

    The best way i've seen is by using a config file.

    In your app -> config folder, you create a new file called (for example settings.php)

     app
         config
             settings.php
    

    Then in your configuration file you just created (settings.php) you could add:

    <?php
    
    $setting_data['foo'] = 'bar';
    $setting_data['bar'] = 'foo';
    
    return $setting_data;
    

    You can then retrieve the config file from your code using:

    echo Config::get('settings.foo'); // Will echo bar
    echo Config::get('settings.bar'); // Will echo foo
    
    0 讨论(0)
  • 2020-12-08 00:06

    I like the View::share method.

    Add the following in app/controllers/BaseController.php

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

    and now $user will be available to all your views.

    References: Laravel docs, blog post

    0 讨论(0)
提交回复
热议问题