Ich versuche, eine Website mit mehreren Sprachen (mit Laravel 5.5) zu erstellen. Deshalb folge ich dem Tutorial https://mydnic.be/post/how-to-build-an-efficient-and-seo-friendly-multilingual-architecture-for-your-laravel-application, aber irgendwie habe ich Probleme mit der Sprache Middleware-Teil:Web-Middleware wird nicht ausgeführt (Laravel 5.5)
// BeforeLanguage.php
namespace App\Http\Middleware;
use Closure;
class BeforeLanguage
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Check if the first segment matches a language code
if (!array_key_exists($request->segment(1), config('translatable.locales'))) {
// Store segments in array
$segments = $request->segments();
// Set the default language code as the first segment
$segments = array_prepend($segments, config('app.fallback_locale'));
// Redirect to the correct url
return redirect()->to(implode('/', $segments));
}
return $next($request);
}
}
Es funktioniert, wenn ich eine URL mit der Kennung für die Sprache zu öffnen, e. G. http://ps.dev/de/app/login
, aber ich bekomme "Sorry, die gesuchte Seite konnte nicht gefunden werden." Wenn ich versuche, die Seite ohne die Sprachkennung in der URI zu öffnen, e. G. http://ps.dev/app/login
.
Aber hier würde ich erwarten, dass die Middleware das Sprachsegment zum URI hinzufügt. Irgendeine Idee was könnte schief gehen?
Unten möchte ich einige zusätzliche Informationen bereitstellen.
web.php
Route::prefix('app')->group(function() {
// Authentication routes
Route::get('login', '[email protected]')->name('login');
// ...
});
Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\BeforeLanguage::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
Nach der Laravel Dokumentationsseite der an die Middleware-Gruppe Web zugewiesen Middle für jede Strecke innerhalb web.php definiert standardmäßig ausgeführt werden sollen . (Out of the box, ist die Web-Middleware-Gruppe auf Ihre Routen/web.php Datei vom RouteServiceProvider automatisch übernommen.)
RouteServiceProvider.php
protected function mapWebRoutes()
{
$locale = Request::segment(1);
Route::prefix($locale)
->middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
Sie haben wahrscheinlich keine Route für URLs ohne das Sprachenpräfix. – tkausl
@tkausl Danke für die schnelle Antwort. Du hast recht. Ich habe keine Route für URLs ohne Sprachpräfix definiert. Aber wenn ich es richtig verstehe, muss ich keins definieren, da es die BeforeLanguage Middleware gibt, die jede Anfrage übernehmen und das Sprachpräfix hinzufügen sollte, falls es fehlt, aber irgendwie wird die Middleware in meinem Fall nicht ausgeführt. – Andreas
Sie haben es selbst erwähnt: "Laut der Laravel-Dokumentationsseite werden die Middlewares, die dem Middlewaregruppen-Web zugewiesen sind, standardmäßig für jede in der web.php definierte Route ausgeführt", das ist Ihr Dilemma. Solange in der web.php keine Route für die aktuelle URL definiert ist, wird die Middleware (-group) nicht ausgeführt. Laravel weiß nicht, welche Mittel zu laufen, bevor es zuerst eine Route findet. – tkausl