Laravel 中间件将变量返回给控制器

新手上路,请多包涵

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

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

这是设置的示例;

-- 路由.php

 Route::get('pages/{id}', [
   'as' => 'pages',
   'middleware' => 'pageUser'
   'uses' => 'PagesController@view'
]);

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

-- PagesController.php

 public function view($id)
{
    $page = Page::with('users')->where('id', $id)->first();
    return view('pages.view', ['page' => $page]);
}

如您所见,在中间件和控制器中都重复了 Page::with('users')->where('id', $id)->first() 。我需要将数据从一个传递到另一个,以免重复。

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 691
2 个回答

我相信正确的方法(在 Laravel 5.x 中)是将您的自定义字段添加到 attributes 属性。

从源代码注释中,我们可以看到属性用于自定义参数:

  /**
 * Custom parameters.
 *
 * @var \Symfony\Component\HttpFoundation\ParameterBag
 *
 * @api
 */
public $attributes;

因此,您将按如下方式实现它;

 $request->attributes->add(['myAttribute' => 'myValue']);

然后,您可以通过调用来检索属性:

 \Request::get('myAttribute');

或者来自 laravel 5.5+ 中的请求对象

 $request->get('myAttribute');

原文由 GWed 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您的网站有从数据库中获取的 cms 页面,并且希望在 laravel 应用程序的所有页面的页眉和页脚块中显示其标题,则使用中间件。在中间件中编写以下代码:

 namespace App\Http\Middleware;

use Closure;

use Illuminate\Support\Facades\DB;

public function handle($request, Closure $next)
{

$data = DB::table('pages')->select('pages.id','pages.title')->where('pages.status', '1')->get();

\Illuminate\Support\Facades\View::share('cms_pages', $data);

return $next($request);

}

然后转到您的 header.blade.php 和 footer.blade.php 并编写以下代码以添加 cms 页面的链接:

 <a href="{{ url('/') }}">Home</a> |

@foreach ($cms_pages as $page)

<a href="{{ url('page/show/'.$page->id) }}">{{ $page->title }}</a> |

@endforeach

<a href="{{ url('contactus') }}">Contact Us</a>

非常感谢所有人并享受代码:)

原文由 Kamlesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题