标签: laravel-middleware

Laravel Middleware将变量返回给控制器

我正在对用户执行权限检查以确定他们是否可以查看页面.这涉及首先通过一些中间件传递请求.

我遇到的问题是我在将数据返回到视图本身之前,在中间件和控制器中复制相同的数据库查询.

以下是设置示例;

- 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)

php laravel laravel-5 laravel-middleware

66
推荐指数
7
解决办法
5万
查看次数

未定义的变量:Laravel中的错误

当我想在我的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

62
推荐指数
3
解决办法
6万
查看次数

Laravel 5 Resourceful Routes Plus中间件

是否可以将中间件添加到资源丰富路由的所有或部分项目中?

例如...

<?php

Route::resource('quotes', 'QuotesController');
Run Code Online (Sandbox Code Playgroud)

此外,如果可能的话,我想将所有路由放在一边indexshow使用auth中间件.或者这是否需要在控制器内完成?

routes laravel laravel-routing laravel-5 laravel-middleware

54
推荐指数
4
解决办法
5万
查看次数

Laravel Middleware除了Route :: group之外

我正在尝试为管理部分创建一个组路由,并将中间件应用于除登录和注销之外的所有路径.

到目前为止我所拥有的是:

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)

如何通过上述设置声明中间件的异常?

php laravel-routing laravel-5 laravel-middleware

26
推荐指数
2
解决办法
2万
查看次数

Laravel 5中的中间件执行顺序

Laravel 5文档描述了分配两种方式中间件:

  1. 将中间件分配给控制器的路由.
  2. 在控制器的构造函数中指定中间件.

但是,我意识到在控制器__construct()函数中编写的任何代码都将在中间件之前运行,即使在控制器函数的第一行声明了中间件__construct.

我在Laravel github存储库中找到了类似问题的错误报告.然而,合作者关闭了该问题,声明"这是预期的行为.".

我想知道,middleware应该是应用程序之外的"层",而__construct功能是应用程序的一部分.为什么__construct函数在中间件之前执行(假设它是在中间件之前)?为什么会这样?

php laravel laravel-5 laravel-middleware

18
推荐指数
3
解决办法
9740
查看次数

Laravel 5从包服务提供商中注册中间件

我正在为Laravel 5开发一个软件包.
我的软件包包含一个自定义中间件,我想将它添加到$routeMiddleware我的软件包服务提供程序中的Kernel类的数组中.
但我似乎找不到办法做到这一点.

我试图创建一个扩展Kernel类的自定义类,然后我可以将数组与我的数组合并.
但是一旦出了构造函数就不可能了.

在L4中你有App :: middleware,但L5中不再提供该功能.

任何解决过这个问题的人都可以帮我解决这个问题吗?

请告诉我,如果我的问题不够明确,那么我可以稍微澄清一下.

php package service-provider laravel-5 laravel-middleware

14
推荐指数
3
解决办法
1万
查看次数

如何防止直接访问Laravel路由(即非ajax请求)

在我的项目中,我使用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

14
推荐指数
1
解决办法
8983
查看次数

Laravel - 将变量从中间件传递到控制器/路由

如何将变量从中间件传递到控制器或执行此类中间件的路由?我看到一些关于将它附加到请求的帖子,如下所示:

$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)

laravel laravel-middleware

12
推荐指数
1
解决办法
1万
查看次数

Laravel 5:进入路线之前和之后的中间件

我有两个中间件: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重新定义了相同的数组键中间件.

我该怎么办?谢谢!

php laravel-routing laravel-5 laravel-middleware

11
推荐指数
2
解决办法
1万
查看次数

具有多种角色的Laravel中间件

我一直在使用Laravel的中间件遇到一些问题.让我告诉你我想要完成的基本想法:

网站上的注册用户将具有以下四种角色之一:

  1. 学生(默认):可以访问" 索引 "和" 显示 "视图
  2. 审批人:可以访问上一个,加上" 概述 "," 更新 "
  3. 编辑:可以访问上一个,加上' 创建 ',' 编辑 '和' 存储 '
  4. 管理员:可以访问一切

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)

php laravel-middleware laravel-blade laravel-5.4

10
推荐指数
1
解决办法
2万
查看次数