シンプルな Laravel Spark アプリがあり、GitHubにある laravel.com から /docs コードをコピーしようとしています。これらは基本的にそのリポジトリから直接コピーされ、バージョン配列が変更されています。
問題は、/docs/VERSION にアクセスすると 404 が返されることです。ルートの /docs にアクセスすると、showRootPage() 関数にヒットし、適切に /docs/0.1 に転送されますが、これは 404 で終わるルートです。すべてのドキュメント/0.1/xyz ルートは正常に機能します。たとえば、ファイル /resources/docs/0.1/documentation.md が存在し、URL /docs/0.1/documentation が期待どおりに機能します。docs/VERSION ルートのみに問題があります。
これをデフォルトに送信する show() メソッドのコードが表示されますが、そこには到達しません... DocsController の show() メソッドに dd() があることがわかります。404 を返すときにこのポイントに到達することはないため、ルーティングの問題のようです。
問題に関するアイデアは大歓迎です!
これが私のroutes/web.phpです
<?php
// srvAudit.com
Route::get('/', 'WelcomeController@show');
Route::get('/blog', 'WelcomeController@blog');
Route::get('/support', 'WelcomeController@support');
// The docs
define('DEFAULT_VERSION', '0.1');
function markdown($text)
{
return (new ParsedownExtra)->text($text);
}
Route::get('docs', 'DocsController@showRootPage');
Route::get('docs/{version}/{page?}', 'DocsController@show');
// The app
Route::get('/home', 'SessionController@index');
Route::get('/sessions', 'SessionController@listSessions');
Route::get('/sessions/{id}', 'SessionController@getSession');
Route::get('/sessions/server/{id}', 'SessionController@getServers');
Route::get('/sessions/user/{id}', 'SessionController@getUser');
該当路線はこちら
root@312fedf0dc89:/var/www/test# artisan route:list|grep docs
| | GET|HEAD | docs | | App\Http\Controllers\DocsController@showRootPage | web,hasTeam |
| | GET|HEAD | docs/{version}/{page?} | | App\Http\Controllers\DocsController@show | web,hasTeam |
そしてDocsController.php
<?php
namespace App\Http\Controllers;
use App\Documentation;
use Symfony\Component\DomCrawler\Crawler;
class DocsController extends Controller
{
/**
* The documentation repository.
*
* @var Documentation
*/
protected $docs;
/**
* Create a new controller instance.
*
* @param Documentation $docs
* @return void
*/
public function __construct(Documentation $docs)
{
$this->docs = $docs;
}
/**
* Show the root documentation page (/docs).
*
* @return Response
*/
public function showRootPage()
{
return redirect('docs/'.DEFAULT_VERSION);
}
/**
* Show a documentation page.
*
* @param string $version
* @param string|null $page
* @return Response
*/
public function show($version, $page = null)
{
dd($version);
if (! $this->isVersion($version)) {
return redirect('docs/'.DEFAULT_VERSION.'/'.$version, 301);
}
if (! defined('CURRENT_VERSION')) {
define('CURRENT_VERSION', $version);
}
$sectionPage = $page ?: 'srvAudit';
$content = $this->docs->get($version, $sectionPage);
if (is_null($content)) {
abort(404);
}
$title = (new Crawler($content))->filterXPath('//h1');
$section = '';
if ($this->docs->sectionExists($version, $page)) {
$section .= '/'.$page;
} elseif (! is_null($page)) {
return redirect('/docs/'.$version);
}
$canonical = null;
if ($this->docs->sectionExists(DEFAULT_VERSION, $sectionPage)) {
$canonical = 'docs/'.DEFAULT_VERSION.'/'.$sectionPage;
}
return view('docs', [
'title' => count($title) ? $title->text() : null,
'index' => $this->docs->getIndex($version),
'content' => $content,
'currentVersion' => $version,
'versions' => Documentation::getDocVersions(),
'currentSection' => $section,
'canonical' => $canonical,
]);
}
/**
* Determine if the given URL segment is a valid version.
*
* @param string $version
* @return bool
*/
protected function isVersion($version)
{
return in_array($version, array_keys(Documentation::getDocVersions()));
}
}
最後に私の Documentation.php モデル
<?php
namespace App;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Contracts\Cache\Repository as Cache;
class Documentation
{
/**
* The filesystem implementation.
*
* @var Filesystem
*/
protected $files;
/**
* The cache implementation.
*
* @var Cache
*/
protected $cache;
/**
* Create a new documentation instance.
*
* @param Filesystem $files
* @param Cache $cache
* @return void
*/
public function __construct(Filesystem $files, Cache $cache)
{
$this->files = $files;
$this->cache = $cache;
}
/**
* Get the documentation index page.
*
* @param string $version
* @return string
*/
public function getIndex($version)
{
return $this->cache->remember('docs.'.$version.'.index', 5, function () use ($version) {
$path = base_path('resources/docs/'.$version.'/srvAudit.md');
if ($this->files->exists($path)) {
return $this->replaceLinks($version, markdown($this->files->get($path)));
}
return null;
});
}
/**
* Get the given documentation page.
*
* @param string $version
* @param string $page
* @return string
*/
public function get($version, $page)
{
return $this->cache->remember('docs.'.$version.'.'.$page, 5, function () use ($version, $page) {
$path = base_path('resources/docs/'.$version.'/'.$page.'.md');
if ($this->files->exists($path)) {
return $this->replaceLinks($version, markdown($this->files->get($path)));
}
return null;
});
}
/**
* Replace the version place-holder in links.
*
* @param string $version
* @param string $content
* @return string
*/
public static function replaceLinks($version, $content)
{
return str_replace('{{version}}', $version, $content);
}
/**
* Check if the given section exists.
*
* @param string $version
* @param string $page
* @return boolean
*/
public function sectionExists($version, $page)
{
return $this->files->exists(
base_path('resources/docs/'.$version.'/'.$page.'.md')
);
}
/**
* Get the publicly available versions of the documentation
*
* @return array
*/
public static function getDocVersions()
{
return [
'0.1' => '0.1',
];
}
}