目前我们在几个项目中使用Laravel框架,但我们不断喜欢的一个问题是以下问题:
假设您有一个主页和一个内容页面
HomepageController具有所有主页特定的PHP代码ContentpageController具有所有内容特定的PHP代码
我们有一个app.blade.php
@yield('page')
Run Code Online (Sandbox Code Playgroud)
HomepageController调用包含的视图homepage.blade.php
@extends('app')
@section('page')
Some HTML part
@include('parts.top_5')
@endsection
Run Code Online (Sandbox Code Playgroud)
ContentController调用包含的视图content.blade.php
@extends('app')
@section('page')
Some different HTML part
@include('parts.top_5')
@endsection
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到两个页面都包含parts.top_5,前5个需要一些特定的变量才能输出top5.现在问题是我们正在复制两个控制器或分组中间件中top5变量的代码,但是当包含该部件时,是否有更好的解决方案来生成一些刀片特定变量?有点像加载刀片模板时运行控制器功能?
我一直在网上搜索,但似乎找不到任何有相同问题的人.希望有人可以帮助我解决这个令人心碎的问题!
我在构造函数中有一个带有以下内容的控制器:
$this->middleware('guest', ['except' =>
[
'logout',
'auth/facebook',
'auth/facebook/callback',
'auth/facebook/unlink'
]
]);
Run Code Online (Sandbox Code Playgroud)
"注销"规则(默认存在)工作正常,但我添加的其他3个规则将被忽略.路线routes.php如下:
Route::group(['middleware' => ['web']],function(){
Route::auth();
// Facebook auth
Route::get('/auth/facebook', 'Auth\AuthController@redirectToFacebook')->name('facebook_auth');
Route::get('/auth/facebook/callback', 'Auth\AuthController@handleFacebookCallback')->name('facebook_callback');
Route::get('/auth/facebook/unlink', 'Auth\AuthController@handleFacebookUnlink')->name('facebook_unlink');
}
Run Code Online (Sandbox Code Playgroud)
如果我访问auth/facebook,auth/facebook/callback或auth/facebook/unlink登录时我被中间件拒绝并被扔回主页.
我已经尝试通过继续指定'除'规则,/因此它们routes.php完全匹配路线,但没有区别.任何想法为什么忽略这些规则,而默认的"注销"规则被尊重?
干杯!
我想基于中间件进行一些身份验证..但不幸的是,它返回,因为类不存在
这是我的中间件
Staff.php
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class Staff
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user = Auth::user()->type;
if ($user == 'S'){
return $next($request);
}
return "no";
}
}
Run Code Online (Sandbox Code Playgroud)
这是kernel.php
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array …Run Code Online (Sandbox Code Playgroud) 我在同一台服务器上托管了多个 Laravel 站点。在我创建的最新网站中,联系表单拒绝提交,并且不会抛出 419 错误。我已经在 web.php 文件中设置了路由,就像其他网站一样,这些网站有实时、有效的联系表单,并且我以完全相同的方式生成和发送令牌 - 使用{{ csrf_field() }}.
我找到了类似问题的答案,指出您可以通过$except向 中的数组添加条目来禁用 Csrf 检查app/Http/Middleware/VerifyCsrfToken.php。我已经验证这确实解决了 419 错误:
protected $except = [
'contact',
'contact*',
];
Run Code Online (Sandbox Code Playgroud)
但我当然希望保留 Csrf 功能,并且我仅更新了$except用于故障排除值的数组。
有谁知道新的 Laravel 环境可能有什么不同,尽管传递了生成的令牌,但仍会出现 419 行为?我尝试过更新一些 ENV 设置并切换不同的东西,但除了修改$except数组之外,没有任何其他方法对这个问题产生任何影响。
由于到目前为止已经进行了一些讨论,我想我应该提供一些额外的信息和代码。
首先,这是一个 ajax 形式,但先不要从座位上跳起来。我一直在使用和不使用ajax 的情况下测试表单。如果我想使用 ajax 进行测试,我只需单击连接到 jQuery 侦听器的按钮即可。如果没有,我会更改或删除按钮的 ID,或者$("#formName").submit();在控制台窗口中运行。
上述(ajax、老式提交和带有 的 jquery 选择器.submit();)都会产生完全相同的响应 - 419 错误。
为了完整起见,这是我的 ajax 代码,它可以在我托管的所有其他网站上运行。我定义了一个 postData 数组以使其保持整洁,并console.log()在其后面直接添加了一条语句以(再次)确认令牌生成良好并且正在随请求正确传递。
var postData = {
name: $("#name").val(),
email: …Run Code Online (Sandbox Code Playgroud) 我正试图在我的Laravel 5项目中实现本地化,而且我遇到了一个问题.我用来捕获语言的中间件如下:
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Routing\Redirector;
use Illuminate\Http\Request;
use Illuminate\Foundation\Application;
use Illuminate\Contracts\Routing\Middleware;
class Language implements Middleware {
public function __construct(Application $app, Redirector $redirector, Request $request) {
$this->app = $app;
$this->redirector = $redirector;
$this->request = $request;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Make sure current locale exists.
$locale = $request->segment(1);
if ( ! array_key_exists($locale, $this->app->config->get('app.locales'))) {
$segments …Run Code Online (Sandbox Code Playgroud) 我想在中间件中使用模型执行某些操作.这是我想要实现的一个例子:
public function handle($request, Closure $next)
{
$itemId = $request->param('item'); // <-- invalid code, serves for illustration purposes only
$item = Item::find($itemId);
if($item->isBad()) return redirect(route('dont_worry'));
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何从中检索所需的参数$request?
我使用过Laravel Authentication(快速入门).但我需要检查用户的状态(已批准/待定).如果未获批准,则会在登录页面中显示错误.我需要知道我必须在哪个文件中进行更改以及更改内容.目前我正在研究Laravel 5.3.
当我在所有控制器中应用身份验证中间件时,除了登录和注册之外,对所有路由进行身份验证的正确方法是什么?有没有办法在一个地方应用身份验证中间件并排除登录、注册路由?
我为 API 端点创建了一个资源控制器。我还为模型创建了相应的策略。
如果我使用每个方法进行授权检查
$this->authorize('delete', $asset);
Run Code Online (Sandbox Code Playgroud)
然后它按预期工作。但是如果我将以下内容添加到构造中,我总是会收到 403 禁止。不确定我缺少什么,因为以下内容应适用于所有方法的授权。
$this->authorizeResource(Asset::class, 'asset');
Run Code Online (Sandbox Code Playgroud)
这是我的路线:
Route::group(['middleware' => ['auth:api']], function () {
Route::Resource('asset', 'AssetsApiController');
});
Run Code Online (Sandbox Code Playgroud)
我的政策是这样注册的:
protected $policies = [
Asset::class => AssetPolicy::class,
];
Run Code Online (Sandbox Code Playgroud)
我的删除策略方法是
public function delete(User $user, Asset $asset)
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
API 控制器构造函数如下所示:
public function __construct()
{
$this->authorizeResource(Asset::class,'asset');
}
Run Code Online (Sandbox Code Playgroud)
API控制器方法是
public function destroy($assetID)
{
$asset = Asset::findOrFail($assetID);
$asset->delete();
}
Run Code Online (Sandbox Code Playgroud)
我的路线是
| GET|HEAD | api/asset | asset.index | App\Http\Controllers\AssetsApiController@index | api,auth:api |
| POST | api/asset | asset.store | App\Http\Controllers\AssetsApiController@store | …Run Code Online (Sandbox Code Playgroud) 我正在使用中间件来检查是否存在来自另一个站点的登录令牌。如果登录令牌存在并且用户尚未登录,我想使用该令牌来登录用户并将其发送到他们想要的页面。如果他们已经登录,我希望它什么也不做。
正如所建议的,这应该是 aServiceProvider吗?
这是我的中间件:
<?php
namespace App\Http\Middleware;
use Session;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Auth\LoginController;
class CheckRepLoginToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next){
$loginToken = $request->repLoginToken;
$goto = '/'.$request->path();
if(isset($loginToken) && Auth::guest()){
(new LoginController)->login($loginToken,$goto);
}
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我需要在之前运行所有这些,$middlewareGroups因此如果为 true 但存在令牌,则$routeMiddleware用户不会发送到登录屏幕。Auth::guest()
protected $middleware我目前在的 部分中拥有中间件,Kernel无论是否登录,每个人似乎都是“访客”。
这是内核文件:
<?php
namespace …Run Code Online (Sandbox Code Playgroud) laravel ×8
php ×7
laravel-5 ×5
blade ×1
laravel-5.3 ×1
laravel-5.8 ×1
laravel-nova ×1
middleware ×1