从 Laravel 4.2 升级到 Laravel 5 - 容器
Upgrading from Laravel 4.2 to Laravel 5 - Container
我仍然无法理解从 Laravel 4.2 到 5.0 的所有变化。
我已经成功地导入了我所有的模型、控制器、配置等。我已经为几乎所有东西命名空间,但我似乎无法管理的一件事是将此代码从 4.2 app\filters.php
转换为我的新的 5.0 应用程序。
这是我遇到问题的部分代码,在下面添加了一些解释。添加了以下代码,以便我们可以方便地为当前用户的所有 actions/visible 字段请求组内的权限。
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 数组实例
- 如果我们已经有了需要的permissionObjectreturn它
- 否则generate/calculate/request permissionObject
- 更新 Authflags 实例
- Return 创建的权限对象
但无论我尝试什么,我都会得到 ReflectionException in Container.php line 776: Class Authflag does not exist.
我尝试创建合同和服务并在 AppServiceProvider
中设置绑定。但我很确定我正在做一件完全 wrong/different 的事情。
我试图只复制此代码并在 AppServiceProvder 中进行一些修改。但这似乎是错误的,没有用。
(想想整个代码应该在 start/global.php
里面)
如何将此代码移植到 Laravel 5.0?
你必须使用中间件"encapsulation"。这是一个示例,它将显示您必须在应用的某些部分之前和之后放置自定义内容的位置。
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
的直接"translation"
我仍然无法理解从 Laravel 4.2 到 5.0 的所有变化。
我已经成功地导入了我所有的模型、控制器、配置等。我已经为几乎所有东西命名空间,但我似乎无法管理的一件事是将此代码从 4.2 app\filters.php
转换为我的新的 5.0 应用程序。
这是我遇到问题的部分代码,在下面添加了一些解释。添加了以下代码,以便我们可以方便地为当前用户的所有 actions/visible 字段请求组内的权限。
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 数组实例
- 如果我们已经有了需要的permissionObjectreturn它
- 否则generate/calculate/request permissionObject
- 更新 Authflags 实例
- Return 创建的权限对象
但无论我尝试什么,我都会得到 ReflectionException in Container.php line 776: Class Authflag does not exist.
我尝试创建合同和服务并在 AppServiceProvider
中设置绑定。但我很确定我正在做一件完全 wrong/different 的事情。
我试图只复制此代码并在 AppServiceProvder 中进行一些修改。但这似乎是错误的,没有用。
(想想整个代码应该在 start/global.php
里面)
如何将此代码移植到 Laravel 5.0?
你必须使用中间件"encapsulation"。这是一个示例,它将显示您必须在应用的某些部分之前和之后放置自定义内容的位置。
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
的直接"translation"