19

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 variable in other routes.

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

6 回答 6

52

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;
    // ...
}

查看应用程序事件

于 2013-11-13T12:31:39.830 回答
13

我见过的最好的方法是使用配置文件。

在您的 app -> config 文件夹中,您创建一个名为(例如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
于 2014-03-10T14:06:39.453 回答
7

全局变量很糟糕。不管怎样,不要使用全局变量,不要想着使用全局变量,总是想着你怎么能不在你的代码中使用它们而仍然拥有你需要的一切。这里有一些原因,还有更多。

相反,请使用 Laravel 的强大功能来帮助您:

在您的路由上强制登录,创建经过身份验证的路由组:

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

现在您知道每次调用您的帖子都会经过身份验证,您可以

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

如果您不想编写代码将 User 实例发送到所有视图,请使用 Laravel 的 View Composers 的魔力,将其添加到您的 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.

于 2013-11-13T13:02:56.513 回答
5

我喜欢这个View::share方法。

在app/controllers/BaseController.php中添加以下内容

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

现在$user将可用于您的所有视图。

参考: Laravel 文档博客文章

于 2014-02-06T19:47:45.563 回答
1

在你问的另一个问题中,我也给了你同样的答案,你没有回答。关联

没有理由为$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.

于 2013-11-13T11:46:47.737 回答
0

你应该创建一个对象来做到这一点。

使用这些属性创建一个provider对象emailname, 等并实例化它并设置属性值,例如:

$provider = new Provider();

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

然后将对象保存在会话中:

$_SESSION['provider'] = $provider;

我不熟悉 Laravel,我不知道直接使用Auth对象是否是一种好习惯,但更简单的解决方案是:

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

还要注意在会话中使用敏感信息 :)

于 2013-11-13T11:40:57.320 回答