我有Laravel内置的auth工作。用户可以注册和登录。
我要做的是为UserController的$id
方法设置show()
参数,其值为Auth::user()->id;
我的想法是,不必在路线中使用id。
我对OOP和一般的php都很陌生,所以我不确定如何解决这个问题。
提前感谢任何提示或帮助!
答案 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
对象存储在类属性中只会过度工程化。
希望有所帮助。