laravel 4中的全局变量

时间:2013-11-13 11:28:17

标签: php variables laravel laravel-4 global

我想知道如何做一个全局变量来保存几行复制并粘贴这一行。它可能是数组并将它们放在一个变量中?我想在其他路线中使用这个变量。

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

6 个答案:

答案 0 :(得分: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;
    // ...
}

查看Application Events

答案 1 :(得分: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

答案 2 :(得分:7)

全球比赛很糟糕。无论如何,不​​要使用全局变量,不考虑使用全局变量,总是考虑如何在代码中使用它们,并且仍然拥有所需的全部内容。 Here are some reasons,还有更多。

相反,使用Laravel power来帮助你:

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

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

答案 3 :(得分: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 docsblog post

答案 4 :(得分: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在控制器的其他位置使用它。

答案 5 :(得分:0)

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

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

$provider = new Provider();

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

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

$_SESSION['provider'] = $provider;

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

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

还要注意在会话中处理敏感信息:)