【问题标题】:Upgrading from Laravel 4.2 to Laravel 5 - Container从 Laravel 4.2 升级到 Laravel 5 - 容器
【发布时间】:2015-02-20 17:46:35
【问题描述】:

我仍然无法理解从 Laravel 4.2 到 5.0 的所有变化。

我已经成功地导入了我所有的模型、控制器、配置等。我已经为几乎所有东西都命名了,但我似乎无法管理的一件事是将此代码从 4.2 app\filters.php 转换为我的新 5.0 应用程序。

这是代码的一部分,下面添加了一些我遇到问题的解释。添加了以下代码,以便我们可以方便地在组内请求当前用户的所有操作/可见字段的权限。

if(App::make('Authflag', $usergroup->id)->can(GroupPermissions::EDIT_MEMBERS)) ...

4.2 的代码:

App::before(function($request) {

    App::instance('Authflags', array()); 

    App::bind('Authflag', function($app, $param) {

        $authflags = App::make('Authflags'); 

        if(isset($authflags[$param]))
        {
            return $authflags[$param]; 
        }

        // Calculate generate flag value

        $authflags[$param] = $authflag; 

        App::instance('Authflags', $authflags);

        return $authflag;
    });

});

说明:

实例 Authflags 包含 group_id => permissionObject

代码说明:

  • 获取 Authflags 数组实例
  • 如果我们已经拥有所需的权限对象,则返回它
  • 否则生成/计算/请求权限对象
  • 更新 Authflags 实例
  • 返回创建的权限对象

但无论我尝试什么,我都会不断收到ReflectionException in Container.php line 776: Class Authflag does not exist.

我尝试创建合同和服务并在AppServiceProvider 中设置绑定。但我很确定我在做一件完全错误/不同的事情。

我尝试在 AppServiceProvder 中进行一些修改后复制此代码。但这似乎是错误的,并没有奏效。

(想想看,整个代码应该都在start/global.php里面)

如何将此代码移植到 Laravel 5.0?

【问题讨论】:

  • 你必须使用中间件。
  • 中间件是过滤前后的“替代品”
  • 感谢您的评论!虽然我不确定,但我认为before/after 过滤器目前无关紧要。就在今天我开始认为我根本不需要它,应该将App::bindApp::instance直接放在global.php中。或者,如果您认为我错了,那么您能否在评论中回答并告诉我应该如何进行?最终我希望能够再次致电App::make('Authflag', $group_id)。但我不知道在 Laravel 5 中的何处或如何进行这些绑定。

标签: laravel laravel-4 laravel-5


【解决方案1】:

您必须使用中间件“封装”。这是一个示例,它将显示您必须在应用程序部分之前和之后放置自定义的位置。

use Closure;

class ChangeCookieLifetime {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        //anything put here will be run BEFORE your app
        $response = $next($request);
        //anything put here will be run AFTER your app
        return $response
    }

}

在您的特定情况下,我会像这样:

use Closure;

class ChangeCookieLifetime {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        App::instance('Authflags', array());

        App::bind('Authflag', function($app, $param) {

            $authflags = App::make('Authflags'); 
            if(isset($authflags[$param]))
            {
                return $authflags[$param]; 
            }

            // Calculate generate flag value
            $authflags[$param] = $authflag; 
            App::instance('Authflags', $authflags);
            return $authflag;
        });


        $response = $next($request);
        //anything put here will be run AFTER your app
        return $response
    }

}

虽然我不能保证我插入的部分会起作用,但这是从 Laravel 4.2 到 Laravel 5 的直接“翻译”

【讨论】:

  • 成功了!对于其他在这个问题/答案上绊倒的人,我在尝试实施它时也发现这很有帮助:L5 middleware filter style
  • 我也读过这篇文章,但是那篇文章不像我的例子那么容易理解......
  • 对不起,不是那个意思。我完全同意。但是在阅读了您的答案后,将这个中间件添加到所有路由中仍然有些麻烦。我从那里得到了一些额外的信息和知识。只是说它可能对其他人也有用。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2017-02-24
  • 2017-01-24
  • 2017-02-23
  • 2014-10-22
相关资源
最近更新 更多