10

我是 laravel 的新手,正在我的第一个应用程序上设置管理面板授权。我当前设置文件的方式是:

controllers/
    admin/
        dashboard.php
        settings.php
    non-admin-controller1.php
    non-admin-controller1.php
views/
    admin/
        dashboard.blade.php
        login.blade.php
        template.blade.php
    non-admin-view1.php
    non-admin-view1.php
    non-admin-view1.php

...这些是我的路线

Route::get('admin/login', function()
{
    return View::make('admin.login');
});

Route::get('admin/logout', function()
{
    return Auth::logout();
    return Redirect::to('admin/login');
});

Route::post('admin/login', function()
{
    $userdata = array('username' => Input::get('username'),
                      'password' => Input::get('password'));
    
    if (Auth::attempt($userdata))
    {
        return Redirect::to('admin');
    }
    else
    {
        return Redirect::to('admin/login')->with('login_errors',true);
    }
});

Route::controller('admin.dashboard');

Route::get('admin', array('before' => 'auth', function() {
    return Redirect::to_action('admin@dashboard');
}));

Route::filter('auth', function()
{
    if (Auth::guest()) return Redirect::to('admin/login');
});

当我转到 /admin 时,我被重定向到 admin/login 并要求登录,这正是我需要它工作的方式。登录后,我被重定向到管理员/仪表板,那里看起来也很好。但是我有两个问题。

  1. 当我进入管理员/注销时,我已注销,但出现了一个空白页面(它没有重定向到管理员/登录)

  2. 注销时,如果我转到管理/仪表板,我会收到错误消息

错误呈现视图:[admin.dashboard]

试图获取非对象的属性

我在这里做错了什么?我做对了什么?为管理员创建一个单独的捆绑包更有意义吗?谢谢!

4

3 回答 3

10

所以我能够以稍微不同的方式解决我的问题。我在控制器文件夹的根目录中创建了一个(基本)Admin_Controller,并在执行前调用了 auth 过滤器的构造函数:

class Admin_Controller extends Base_Controller {

    public function __construct()
    {
        $this->filter('before', 'auth');
    }

}

然后让我在 /controllers/admin 中的所有与管理员相关的控制器扩展 Admin_Controller 并调用父构造函数:

class Admin_Dashboard_Controller extends Admin_Controller {

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

    public function action_index()
    {
        return View::make('admin.dashboard');
    }

}

这可能不是最有说服力的解决方案,但它确实有效!

于 2013-04-07T04:57:52.457 回答
9

在您的admin/login路线中,您在通话前有不必要的回报Auth::logout(),核对它应该修复它。

这里的另一个问题是只有您的一个“管理员”路由被过滤。您可以使用 a 包装所有管理路由Route::group()并在过滤器之前应用“auth”,或者您也可以使用Route::filter('pattern: admin/*', 'auth')

查看:

http://laravel.com/docs/routing#filters

对于第二个问题,您的 Admin Dashboard 控制器类是否已命名Admin_Dashboard_Controller,如果是,您是否有 action_index() 或 get_index() 函数在其中返回视图?

查看:

http://laravel.com/docs/controllers#nested-controllers

(我假设你在这里使用 L3 顺便说一句。)

于 2013-04-05T06:34:51.167 回答
8

对于未来的读者,一个非常干净的方法是使用 Laravel 的Route Groups

路由组允许您跨大量路由共享路由属性,例如中间件或命名空间,而无需在每个单独的路由上定义这些属性。

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});

它们不仅可以用于身份验证,还可以用于NamespacesSub-Domains等。

于 2015-12-31T22:48:19.170 回答