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