Hiroto's diary

プログラミング関連とイベントの感想を書くかもしれない

Laravelのpublicディレクトリを変更する。

タイトルの通り、Laravelのpublicディレクトリを変更する方法。hiroto-k.netサブドメイン統合に際してpublicディレクトリを動かしたのと、その後のテストでコケたのでその時のメモです。

先に書いておくと、この方法ではphp artisan serveコマンドは使えず、Homestead等で開発する必要が出てきますのでご了承ください。


まず最初に変更後のディレクトリ構成。サブドメイン毎でpublicディレクトリを分ける為、publicの中にapinetresourcesを掘り、既にあるindex.php等をコピーしました。。

f:id:Hiroto-K:20180607005533p:plain

次に各ディレクトリのindex.phppath.publicをバインドします。少し面倒ですが全てのindex.php$appの下に書き加えます。

<?php

// 省略

$app = require_once __DIR__.'/../../bootstrap/app.php';

$app->bind('path.public', function () {
    return realpath(__DIR__);
});

// 省略

書き換え後、Homesteadのsitestoで新しいpublicディレクトリの位置を指定してリロードすれば完了。HTTPからのアクセスでは、public_path等の返り値が設定したディレクトリで帰ってきます。

テスト時のディレクトリ設定

で、ここまでHTTPからのアクセスは何の問題も無いのですが、このまま何も設定せずにphpunitを走らせると、path.publicはデフォルトのpublicで帰ってきます。コントローラーなどでpublic_pathを使っていると確実にコケて非常に厄介です。

という訳でTestCaseからpublicディレクトリを変更出来るようにします。

TestCase.php$publicPathSuffixプロパティを生やすのと、createApplicationpath.publicをバインドする処理を追加。

<?php

use Illuminate\Contracts\Console\Kernel;
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{

    // 追加
    /**
     * Suffix of public path.
     *
     * @var string
     */
    protected $publicPathSuffix;

    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        // 追加
        if (isset($this->publicPathSuffix)) {
            $newPublicPath = public_path($this->publicPathSuffix);
            $app->bind('path.public', function () use ($newPublicPath) {
                return $newPublicPath;
            });
        }

        $app->make(Kernel::class)->bootstrap();

        return $app;
    }
}

コントローラー等のテストではpublicPathSuffixを設定。

AppsControllerTest.php

<?php

class AppsControllerTest extends TestCase
{
    protected $publicPathSuffix = 'net';
}

これでphpunitを走らせると、publicPathSuffixを設定したテストケースではpublicディレクトリの位置が変更されてテストが実行されます。

© 2015-2018 Hiroto-K