我仍然很难理解从Laravel 4.2到5.0的所有更改。
我已经成功地导入了我所有的模型、控制器、配置等。我几乎所有的东西都有名称空间,但有一件事我似乎无法管理,那就是将此代码从4.2 appfilters.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数组实例
- 如果我们已经拥有所需的permissionObject,则返回它
- 否则生成/计算/请求permissionObject
- 更新Authflags实例
- 返回创建的permissionObject
但无论我做什么,我都会得到ReflectionException in Container.php line 776: Class Authflag does not exist.
我尝试创建一个契约和一个服务,并在AppServiceProvider
中设置一个绑定。但我很确定我做了一件完全错误/不同的事情。
我试图在AppServiceProwder中进行一些修改来复制这段代码。但这似乎是错误的,没有奏效。
(仔细想想,整个代码可能应该在start/global.php
内)
如何将此代码移植到Laravel 5.0
您必须使用中间件"封装"。这里有一个例子,它将显示您必须在应用程序的各个部分之前和之后将自定义内容放在哪里。
use Closure;
class ChangeCookieLifetime {
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $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 IlluminateHttpRequest $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 的直接"翻译"