这是一个非常长的问题(我认为)一个非常简单的答案,但我是Laravel的新手,我需要知道我是否以正确的方式解决它。
我做了什么
我跟着Intermediate Tutorial并稍微修改了一下,现在我有一个使用身份验证的简单任务列表。我在我的TaskController
构造函数中有这个:
public function __construct(TaskRepository $tasks)
{
$this->middleware('auth');
}
这将检查用户是否在启动任何方法之前已登录,因此我只需要在我的routes
文件中调用它们:
Route::get('/home', 'TaskController@index');
Route::get('/tasks', 'TaskController@indexUser');
然后我想删除index
方法的身份验证要求,以便所有用户都可以看到/ home页面(我列出所有任务),只有经过身份验证的用户才能看到/ tasks页面(我只列出用户任务并允许删除它们。我设法做到了这样:
1)我从$this->middleware('auth')
构造函数
TaskController
2)我修改了我的routes
文件,如下所示:
Route::get('/home', 'TaskController@index');
Route::get('/tasks', [
'middleware' => 'auth',
'uses' => 'TaskController@indexUser'
]);
好的,这可行,但是:
我想要实现的目标
我不希望在我的路径文件中有这个逻辑,我希望我的Controller决定哪些方法是公共的,哪些方法不公开。但是我被困住了。我认为它应该是这样的:
class TaskController extends Controller
{
/**
* Display a list of all current tasks
*/
public function index()
{
return view('tasks.index', [
'tasks' => Task::orderBy('created_at', 'asc')->get()
]);
}
/**
* Display a list of all of the logged user's task.
*
*/
public function indexUser(Request $request)
{
if (Auth::check() {
return view('tasks.index_user', [
'tasks' => $this->tasks->forUser($request->user()),
]);
} else {
//This is what I don't know how to do:
redirect_to_login
}
}
}
我怎样才能做到这一点?
答案 0 :(得分:2)
您可以决定哪个控制器方法应该执行中间件:
public function __construct()
{
$this->middleware('auth', ['only' => ['indexUser', 'update'] ];
}
只需添加only
您要保护的方法即可
当用户尝试访问某个方法时,会自动重定向到登录页面。
您可以在此处找到文档:https://laravel.com/docs/5.1/controllers#controller-middleware
答案 1 :(得分:1)
如果您想在控制器中使用此逻辑,则可以执行以下操作:
if (!Auth::check()) {
return redirect('/path/to/login/page');
}
这样你的控制器中就没有Giant else语句了。 (如果您的控制器包含的逻辑比上面的示例更多,则很方便)
我个人会选择Christian Giupponi提供的答案。因为在构造函数中然后在控制器中处理这个逻辑会更有意义。