所以我跟随Laravel 5基础知识教程,我坚持表单验证。我完全按照教程进行了操作,但我得到了一个未定义的变量:我的创建文章视图中的错误。
在我关注的教程和我在网上找到的内容中,他们说刀片文件中的错误变量始终存在,供您使用,所以我不知道我做错了什么?
任何帮助将不胜感激!喜欢Laravel除了这个错误!
View
@if($errors->any())
<ul class="alert alert-danger">
@foreach($errors->any() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
@endif
控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use App\Http\Requests;
use App\Http\Requests\UserRequest as UserRequest;
// use App\Http\Requests\CreateArticleRequest as CreateArticleRequest;
use App\Http\Controllers\Controller;
use Illuminate\View\Middleware\ErrorBinder;
class UserController extends Controller
{
public function create(){
return view('pages.signUp');
}
public function store(UserRequest $request){
User::create($request->all());
return 'the user has been registered!';
return view('user.profile');
}
}
请求验证
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class UserRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required',
'email' => 'required|email',
'country' => 'required',
'password' => 'required|min:6',
'confirm_password' => 'required|same:password',
'height' => 'required',
'weight' => 'required',
];
}
}
答案 0 :(得分:39)
这是5.2升级的一个突破性问题。正在发生的是中间件,它负责使所有视图可用的system_profiler SPUSBDataType
变量未被利用,因为它已从全局中间件转移到ioreg -p IOUSB -l -w 0
中间件组。
有两种方法可以解决这个问题:
在errors
文件中,您可以将中间件web
移回kernel.php
媒体资源。
您可以使用路由组包装所有Web路由,并将\Illuminate\View\Middleware\ShareErrorsFromSession::class
中间件应用于它们。
protected $middleware
答案 1 :(得分:23)
<强>解决强>
您可以更改以下任何一项:
<强> 1。将您的工作路线(app/http/routes.php)
放在
Route::group(['middleware' => ['web']], function () {
// Here like
Route::get('/', 'TodoController@index');
Route::post('/', 'TodoController@store');
});
截图 -
<强> 2。移动protected $middlewareGroups web
(app/Http/Kernel.php)
protected $middleware = []
截图 -
答案 2 :(得分:18)
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
从protected $middlewareGroups
到protected $middleware
答案 3 :(得分:18)
这是解决方案:
使用中间件,从更改路线组的定义:
Route::group(['middleware' => 'web'], function () {
到
Route::group(['middlewareGroups' => 'web'], function () {
答案 4 :(得分:6)
只需从 routes.php 页面中的, 'middleware' => 'web'
移除Route::group(array('prefix' => 'user', 'middleware' => 'web'), function()
或
移动
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
kernel.php 页面中的protected $middlewareGroups
到protected $middleware
正如Laravel文档所说:
注意:如果您的Laravel副本已经有一个RouteServiceProvider 包括Web中间件组中的默认路由文件 不需要手动将组添加到routes.php文件中。
因此从routes.php
文件中删除将是正确的方法。
答案 5 :(得分:5)
发布此内容可能对其他人有用,
正如第一个解决方案中提到的Smartrahat,在Kernel.php
文件(app/Http/Kernel.php
)中移动\Illuminate\View\Middleware\ShareErrorsFromSession::class
从$middlewareGroups
到protected $middleware
属性,但同样会开始抛出错误&#34;会话存储未按请求设置&#34;,
解决此举动
\Illuminate\Session\Middleware\StartSession::class,
也可以$middleware property
。
答案 6 :(得分:5)
自5.2起,routes.php
默认情况下已在['middleware'=>'web']
RouteServiceProvider
的上下文中调用。但是在routes.php
默认生成的身份验证路由中,默认情况下仍会发生Route::group
调用 - 因此,如果从Route::group
应用程序中删除routes.php
声明,则应用程序会正确显示错误。
答案 7 :(得分:4)
关于这个问题的几点意见。首先,github中有关于此问题的相关错误 PFA https://github.com/laravel/framework/issues/12022
如果你看看格雷厄姆写的最后一条评论,我认为这是我面临的问题。 对我来说即使表单发布数据有错误,我也得到了以下相等
boolval(count($errors) === 0) === true
在我的情况下,我在
中添加了日志语句\Illuminate\Session\Middleware\StartSession::class
上面的中间件类针对给定的请求运行了两次,我不知道它为什么会运行两次,但我认为因此$errors
变量正在重置。
我正在使用这种配置(我认为默认使用Laravel@5.2.43)
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
我改变了对我有用的配置,$errors
变量的计数不为零(上述中间件每次请求只运行一次)
protected $middleware = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
注意:
在Kernel.php配置更改之前和之后,我的所有路由都在web
中间件组中,我根本没有从web
中间件组移动我的路由。
答案 8 :(得分:2)
将@foreach($errors->any() as $error)
更改为@foreach($errors->all() as $error)
答案 9 :(得分:0)
在这种情况下 laravel 5.2 您可以参考示例代码并编辑您的kernal.php
文件。移动此\Illuminate\View\Middleware\ShareErrorsFromSession::class
,将middlewareGroups
移至middleware
并将\Illuminate\Session\Middleware\StartSession::class
添加至middleware
然后它的工作正常。
答案 10 :(得分:0)
在我们的应用程序中同时具有Web和API要求,我们不想移动中间件;也许那会奏效:
我们遇到了一种非常特殊的情况:flash[]
和$errors
会话数据在标准的laravel资源方法store()
和edit()
之间正确传输,但在某些情况下数据没有回到几乎相同的方法storeSale()
和editSale()
。
我们发现在我们的开发和部署环境中,“文件”和“数据库”会话驱动程序在所有情况下都有效,但“cookie”驱动程序没有。
在所有实例中切换到数据库驱动程序解决了这个问题。