2013-11-13 4 views
19

Мне было интересно, как сделать глобальную переменную, чтобы сохранить несколько строк копии и вставить эти строки. Массив, возможно, и вместо них вместо них помещается одна переменная? Я хочу использовать эту переменную в других маршрутах.Глобальная переменная в laravel 4

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

ответ

0

Вы должны создать объект для этого.

Создать provider объект с теми свойствами, email, name и т.д., и создать его экземпляр и установить значения свойств, таких как:

$provider = new Provider(); 

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

А затем сохранить объект в сеансе:

$_SESSION['provider'] = $provider; 

Я не знаком с Laravel, и я не знаю, хорошо ли работать непосредственно с объектом Auth, но более простым решением будет:

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

быть также осведомлены о работе с конфиденциальной информацией на сессии :)

+0

Единственная конфиденциальная информация на данный момент - это адрес электронной почты пользователей. – nCore

+1

Вам следует позаботиться о своей информации о сеансе, если вам действительно нужно ее сохранить, сделайте это. Мои сеансы хранят пользователь 'id', и когда мне это нужно, я запрашиваю его из базы данных. – Gerep

1

Я также дал вам тот же ответ на другой вопрос, который Вы задали, вы не ответили. Link

Нет причин иметь отдельную переменную для каждого имущества вашей модели $provider. Просто сохраните всю модель с такой переменной.

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

Это обычно делается на таком маршруте.

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

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

После того, как сделать это, вы можете получить доступ к различным свойствам в в $provider в своих взглядах, как это.

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

Другой вариант заключается в использовании контроллер и установить эту переменную только один раз в контроллере, что делает его доступным из всех представлений с использованием 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'); 
    } 
} 

После проделав всего этого, вы можете использовать переменную $provider в своих взглядах, как показано выше, используя такие вещи, как $provider->email. Вы также можете использовать его в другом месте контроллера, используя $this->provider.

53

Вы можете создать глобальный singleton внутри 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); 
}); 

В любом виде, использовать его как

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

В любом контроллере, вы можете использовать

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

Отъезд Application Events.

+3

этот парень получает это – almosnow

+1

Я думаю @almosnow, спасибо! –

+0

Где я могу вставить строку App :: before {code here}? Я имею в виду, какой файл? Спасибо за разъяснение :) – melvnberd

6

Глобалы плохие.Независимо от того, что, не используйте глобальные переменные, не думайте об использовании глобальных переменных, всегда думайте о том, как вы не можете использовать их в своем коде и все еще иметь все, что вам нужно. Here are some reasons, и есть еще много.

Вместо этого используйте Laravel силу, чтобы помочь вам:

Принудительно входа на маршрутах создания групп аутентифицированных маршрутов:

Route::group(array('before' => 'auth'), function() 
{ 
    Route::get('/users/posts', array('as'=>'users.posts.index', 'uses'=>'[email protected]')); 
}); 

Теперь вы знаете, что каждый вызов ваших постов будет проходить проверку подлинности, вы можете просто

class PostsController extends Controller { 

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

} 

на ваш взгляд, вы просто должны

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

Если вы не хотите, чтобы написать код, чтобы отправить экземпляр пользователя для всех ваших взглядов, использовать магию Laravel Высказаться композиторов, добавив в ваш filters.php или создание composers.php файла:

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

И это теперь, как ваши взгляды могут быть использованы в настоящее время:

class PostsController extends Controller { 

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

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

} 

Поскольку Laravel будет автоматически вводить Auth::user() в этих взглядах как $user.

5

Мне нравится View::share способ.

Добавьте следующее в приложение/контроллеры/BaseController.php

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

и теперь $user будут доступны для всех ваших взглядов.

Ссылки: Laravel docs, blog post

+0

все еще не работает для меня. Я что-то упускаю? В нем говорится «неопределенная переменная» – Kheme

+0

Вы должны быть, это работает и находится в официальных документах. Убедитесь, что вы добавили 'View :: share ('myvar', 'myvalue');' в контроллере, а затем в своем представлении убедитесь, что вы используете '$ myvar'. – Justin

12

Лучший способ я видел это с помощью конфигурационного файла.

В приложении -> папка конфигурации, необходимо создать новый файл с именем (например settings.php)

app 
    config 
     settings.php 

Затем в файле конфигурации вы только что создали (settings.php) можно добавить:

<?php 

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

return $setting_data; 

Вы можете извлечь конфигурационный файл из вашего кода с помощью:

echo Config::get('settings.foo'); // Will echo bar 
echo Config::get('settings.bar'); // Will echo foo 
Смежные вопросы