我正在对用户执行权限检查以确定他们是否可以查看页面.这涉及首先通过一些中间件传递请求.
我遇到的问题是我在将数据返回到视图本身之前,在中间件和控制器中复制相同的数据库查询.
以下是设置示例;
- routes.php
Route::get('pages/{id}', [
'as' => 'pages',
'middleware' => 'pageUser'
'uses' => 'PagesController@view'
]);
Run Code Online (Sandbox Code Playgroud)
- PageUserMiddleware.php(类PageUserMiddleware)
public function handle($request, Closure $next)
{
//get the page
$pageId = $request->route('id');
//find the page with users
$page = Page::with('users')->where('id', $pageId)->first();
//check if the logged in user exists for the page
if(!$page->users()->wherePivot('user_id', Auth::user()->id)->exists()) {
//redirect them if they don't exist
return redirect()->route('redirectRoute');
}
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
- PagesController.php
public function view($id)
{
$page = Page::with('users')->where('id', $id)->first();
return view('pages.view', ['page' => $page]); …Run Code Online (Sandbox Code Playgroud) 当我想在我的laravel项目中注册用户时,页面总是说
未定义的变量:错误(查看:/var/www/resources/views/auth/register.blade.php)"
根据Laravel文档,$errors应始终自动设置:
因此,重要的是要注意每个请求的所有视图中都会提供$ errors变量,这样您就可以方便地假设$ errors变量始终定义并且可以安全使用.
我使用时在每个视图上都有这个:
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
Run Code Online (Sandbox Code Playgroud)
或者当我想使用$errors变量时的任何其他方式.
为什么是这样?我之前从未遇到过这个问题.
有谁可以帮助我吗?
laravel laravel-5 laravel-validation laravel-middleware laravel-5.2
是否可以将中间件添加到资源丰富路由的所有或部分项目中?
例如...
<?php
Route::resource('quotes', 'QuotesController');
Run Code Online (Sandbox Code Playgroud)
此外,如果可能的话,我想将所有路由放在一边index并show使用auth中间件.或者这是否需要在控制器内完成?
我正在尝试为管理部分创建一个组路由,并将中间件应用于除登录和注销之外的所有路径.
到目前为止我所拥有的是:
Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'authAdmin'], function() {
Route::resource('page', 'PageController');
Route::resource('article', 'ArticleController');
Route::resource('gallery', 'GalleryController');
Route::resource('user', 'UserController');
// ...
});
Run Code Online (Sandbox Code Playgroud)
如何通过上述设置声明中间件的异常?
该Laravel 5文档描述了分配两种方式中间件:
但是,我意识到在控制器__construct()函数中编写的任何代码都将在中间件之前运行,即使在控制器函数的第一行声明了中间件__construct.
我在Laravel github存储库中找到了类似问题的错误报告.然而,合作者关闭了该问题,声明"这是预期的行为.".
我想知道,middleware应该是应用程序之外的"层",而__construct功能是应用程序的一部分.为什么__construct函数在中间件之前执行(假设它是在中间件之前)?为什么会这样?
我正在为Laravel 5开发一个软件包.
我的软件包包含一个自定义中间件,我想将它添加到$routeMiddleware我的软件包服务提供程序中的Kernel类的数组中.
但我似乎找不到办法做到这一点.
我试图创建一个扩展Kernel类的自定义类,然后我可以将数组与我的数组合并.
但是一旦出了构造函数就不可能了.
在L4中你有App :: middleware,但L5中不再提供该功能.
任何解决过这个问题的人都可以帮我解决这个问题吗?
请告诉我,如果我的问题不够明确,那么我可以稍微澄清一下.
在我的项目中,我使用Laravel纯粹作为后端api,所有前端都由Angular javascript处理.目前,Laravel路线可以直接访问,它会扼杀浏览器中显示的Json中的所有数据.我想对它进行限制,因此Laravel只响应Ajax请求而没有别的.
我在这里阅读了这篇文章,该文章为Laravel 4提供了一个解决方案,即通过添加限制filter.php.但是从Laravel 5.1开始,不再使用过滤器,我相信中间件可以用来做同样的事情.但是,我不知道如何在过滤器到中间件的过程中更改Laravel 4解决方案.
有人可以分享您如何防止直接访问Laravel 5.1路由的想法吗?
Laravel 4解决方案使用filter.php:在filter.php声明此过滤器:
Route::filter('isAJAX', function()
{
if (!Request::AJAX()) return Redirect::to('/')->with(array('route' => Request::path()));
});
Run Code Online (Sandbox Code Playgroud)
然后将您只想通过AJAX访问的所有路由放入一个组中.在您的routes.php中:
Route::group(array('before' => 'isAJAX'), function()
{
Route::get('contacts/{name}', ContactController@index); // Or however you declared your route
... // More routes
});
Run Code Online (Sandbox Code Playgroud) laravel laravel-routing laravel-filters laravel-middleware laravel-5.1
如何将变量从中间件传递到控制器或执行此类中间件的路由?我看到一些关于将它附加到请求的帖子,如下所示:
$request->attributes->add(['key' => $value);
Run Code Online (Sandbox Code Playgroud)
还有其他人用闪光灯吸食:
Session::flash('key', $value);
Run Code Online (Sandbox Code Playgroud)
但我不确定这是最佳做法,还是有更好的方法来做到这一点?这是我的中间件和路线:
namespace App\Http\Middleware;
use Closure;
class TwilioWorkspaceCapability
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$workspaceCapability = new \Services_Twilio_TaskRouter_Workspace_Capability("xxxxx", "xxxx", "xxxx");
$workspaceCapability->allowFetchSubresources();
$workspaceCapability->allowDeleteSubresources();
$workspaceCapability->allowUpdatesSubresources();
$token = $workspaceCapability->generateToken();
//how do I pass variable $token back to the route that called this middleware
return $next($request);
}
}
Route::get('/manage', ['middleware' => 'twilio.workspace.capability', function (Request $request) {
return view('demo.manage', …Run Code Online (Sandbox Code Playgroud) 我有两个中间件:beforeCache和afterCache,两者都在Kernel上注册.
我想按顺序将它们称为路由:1.beforeCache 2. myController 3. afterCache
如果我定义这样的路线:
Route::get('especies/{id}', [
'middleware' => 'beforeCache',
'uses' => 'MyController@myMethod',
'middleware' => 'afterCache',
]);
Run Code Online (Sandbox Code Playgroud)
beforeCache不执行,因为afterCache重新定义了相同的数组键中间件.
我该怎么办?谢谢!
我一直在使用Laravel的中间件遇到一些问题.让我告诉你我想要完成的基本想法:
网站上的注册用户将具有以下四种角色之一:
fyi:'overview'是一种索引视图,但仅适用于审批者角色和更高级别
你们有什么建议是最好的方法呢?这是我到目前为止所做的,但它似乎不起作用:
Kernel.php
protected $middlewareGroups = [
...
'approver+' => [
\App\Http\Middleware\Approver::class,
\App\Http\Middleware\Editor::class,
\App\Http\Middleware\Admin::class,
],
];
protected $routeMiddleware = [
...
'student' => \App\Http\Middleware\Student::class,
'approver' => \App\Http\Middleware\Approver::class,
'editor' => \App\Http\Middleware\Editor::class,
'admin' => \App\Http\Middleware\Admin::class,
];
Run Code Online (Sandbox Code Playgroud)
HTTP \中间件\ admin.php的
public function handle($request, Closure $next)
{
if (Auth::check())
{
if(Auth::user()->isAdmin())
{
return $next($request);
}
}
return redirect('login');
}
Run Code Online (Sandbox Code Playgroud)
'用户'Eloquent模型:
public function isAdmin() …Run Code Online (Sandbox Code Playgroud) laravel-5 ×7
laravel ×6
php ×6
laravel-5.1 ×1
laravel-5.2 ×1
laravel-5.4 ×1
package ×1
routes ×1