Laravelでトレイリングスラッシュを使う方法
公開日:
Laravelでは、URLの末尾に/(スラッシュ)が付くとスラッシュなしにリダイレクトされるようになっており、リンクとして生成されるURLも末尾にスラッシュがないものとなります。
URLの最後をスラッシュで終わらせたいケースもあると思いますので、トレイリングスラッシュの設定方法についてご紹介します。
まずは、公開ディレクトリとなるpublic内の.htaccessを書き換えます。
public/.htaccessのRedirect Trailing Slashes If Not A Folder…部分をコメントアウトすることで、末尾スラッシュなしのURLにリダイレクトされるのを止めます。
次にLaravelが生成するURLの末尾にスラッシュを付けるためUrlGeneratorのformatメソッドを上書きすることで、末尾にスラッシュを付けたURLで運用することができるようになります。
app/Services/Routeディレクトリを作成し、UrlGeneratorを配置します。
<?php namespace App\Services\Route; use Illuminate\Routing\UrlGenerator as BaseUrlGenerator; class UrlGenerator extends BaseUrlGenerator { /** * Create a new manager instance. * * @param Illuminate\Routing\UrlGenerator $url */ public function __construct(BaseUrlGenerator $url) { parent::__construct($url->routes, $url->request); } /** * Format the given URL segments into a single URL. * * @param string $root * @param string $path * @return string */ public function format($root, $path, $route = NULL) { $path = parent::format($root, $path, $route); $mathes = null; preg_match("/([^\/]+?)?$/", $path, $mathes); $last = $mathes[0] ?? ''; if (strpos($last, ".") === false) { return $path."/"; } return $path; } } ?>
作成したUrlGeneratorをAppServiceProviderに登録します。
app/Providers/AppServiceProvider.phpのregisterにUrlGeneratorを登録する記述は以下の通りです。
public function register() { $url = $this->app['url']; $this->app->singleton('url', function () use ($url) { return new \App\Services\Route\UrlGenerator($url); }); }