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

Php Laravel:如何将$id设置为Auth::user()->;身份证件在资源控制器方法中,php,authentication,laravel,Php,Authentication,Laravel,我有拉威尔的内置授权工作。用户可以注册和登录 我要做的是使用Auth::user()->id中的值为UserController的show()方法设置$id参数 我的想法是,不必在路线上使用id 我对OOP和php都是新手,所以我不知道如何解决这个问题 提前感谢您提供的任何提示或帮助 第一种方法 您可以拥有具有可选用户id的路由: Route::get('user/show/{id?}', 'UsersController@show') 如果控制器的show方法未获得id,则可以使用Auth

我有拉威尔的内置授权工作。用户可以注册和登录

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

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

我对OOP和php都是新手,所以我不知道如何解决这个问题

提前感谢您提供的任何提示或帮助

第一种方法 您可以拥有具有可选用户id的路由:

Route::get('user/show/{id?}', 'UsersController@show')
如果控制器的show方法未获得id,则可以使用Auth::user()代替:

那么在你看来,你将能够永远

{{ $user->name }}
第二种方法 您还可以有一个BaseController,它使用View::share()自动为您执行此操作:

然后,在控制器中,您不需要传递用户:

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()
会将该变量发送到所有视图

第三种方法 如果您只需要用户无处不在,请使用全局视图::composer():

您可以将其放在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 : '');
});

这实际上是我最近在使用API时遇到的一个问题

我处理它的方式是引入
/me
端点,例如,您可以:

Route::group(['before' => 'auth'], function() {
    Route::get('/user/show/{id}', 'UsersController@show');
    Route::get('/me', 'UsersController@show');
}
您会注意到,两条路由都指向相同的代码,但具有不同的地址。这意味着您可以使用
/me
约定简化请求,而无需重复代码。您还将注意到,我将它们包含在一个应用auth过滤器的组中。这基本上只是确保用户经过身份验证,虽然第一个用户可能不需要身份验证,但第二个用户肯定需要身份验证

然后,您的显示方法将如下所示:

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();
}
控制器方法应该相互独立地访问,这意味着一旦返回
用户
对象,当前请求的所有相关代码都可以访问它。将
用户
对象存储在类属性中会超出工程的范围


希望有帮助。

啊!我得试一试。我在试图弄清楚如何设置setter函数并在不重写对象的
id
属性的情况下使用它时迷失了方向。这澄清了很多!谢谢由于控制器的性质,您不需要用户对象存在于方法的范围之外,因此根本不需要setter函数。这不是一个真正的setter,而是一个整理show方法的helper方法。编辑以使其看起来更好。
Route::group(['before' => 'auth'], function() {
    Route::get('/user/show/{id}', 'UsersController@show');
    Route::get('/me', 'UsersController@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();
}