Laravel:如何将$ id设置为Auth :: user() - > id;在资源控制器方法中

时间:2014-05-07 20:32:06

标签: php authentication laravel

我有Laravel内置的auth工作。用户可以注册和登录。

我要做的是为UserController的$id方法设置show()参数,其值为Auth::user()->id;

我的想法是,不必在路线中使用id。

我对OOP和一般的php都很陌生,所以我不确定如何解决这个问题。

提前感谢任何提示或帮助!

2 个答案:

答案 0 :(得分:0)

第一种方法

您可以拥有包含可选用户ID的路​​线:

Route::get('user/show/{id?}', 'UsersController@show')

如果你的控制器的show方法没有获得id,它可以改为使用Auth :: user():

class UsersController extends BaseController {

    public function show($id = null) 
    {
        return View::make('userProfile')->with('user', $this->getCurrentUser($id));
    }

    public function getCurrentUser($id)
    {
        $this->currentUser = $id ? User::find($id) : Auth::user();
    }

}

然后在您的视图中,您将始终

{{ $user->name }}

第二种方法

你也可以使用一个BaseController,它使用View :: share()自动为你做这个:

class BaseController extends Controller {

    public function __construct()
    {
        parent::__construct();

        $this->shareUser();
    }

    public function shareUser($id = null)
    {
        View::share('user', $id ? User::find($id) : Auth::user());
    }

}

然后在你的控制器中你不需要传递用户:

class UsersController extends BaseController {

    public function show() 
    {
        return View::make('userProfile');
    }

    public function thisIsAMethodOverridingIt($id)
    {
        $this->shareUser($id);

        return View::make('userProfile');
    }

}

服务提供此服务会更好,但您必须阅读有关服务提供商和外观的信息才能实现。

你仍然可以这样做:

{{ $user->name }}

因为View::share()会将该变量发送到您的所有视图。

第三种方法

如果您只是需要您的用户,请使用全局View :: composer():

View::composer('*', function($view)
{
    $view->with('currentUserName', Auth::check() ? Auth::user()->firstname : '');
});

你可以将它放在routes.php中,或者更好地创建一个文件用于此目的,比如app / composers.php并将其加载到app / start / global.php中:

require app_path().'/composers.php';

与往常一样,您可以在视图中使用它,这样:

{{ $user->currentUserName }}

如果你需要几个观点,你可以

View::composer(array('profile','dashboard'), function($view)
{
    $view->with('currentUserName', Auth::check() ? Auth::user()->firstname : '');
});

答案 1 :(得分:0)

这实际上是我在处理API时遇到的最新问题。

我处理它的方式是引入/me个端点,例如,你有:

Route::group(['before' => 'auth'], function() {
    Route::get('/user/show/{id}', 'UsersController@show');
    Route::get('/me', 'UsersController@show');
}

您会注意到两个路由指向相同的代码,但具有不同的地址。这意味着您可以使用/me约定简化请求,而无需重复代码。您还会注意到我将这些内容包含在应用auth过滤器的组中。这基本上只是确保用户被初始化,虽然第一个用户可能不需要,但第二个用户肯定是必需的。

然后你的show方法看起来像这样:

public function show($id = false)
{
    $user = $this->getUserOrMe($id);

    return View::make('myview', ['user' => $user]);
}

这需要以下功能:

private function getUserOrme($id)
{
    return $id !== false ? User::find($id) : Auth::user();
}

控制器方法应该彼此独立地访问,这意味着一旦返回User对象,当前请求的所有相关代码都可以访问它。将User对象存储在类属性中只会过度工程化。

希望有所帮助。