Laravelのコア1つを、マルチドメイン（サブドメイン)を作ったエックスサーバーで駆動させる

## 概要 ##

筆者以前から実験してみたかったのですが、エックスサーバーのサブドメインで、マルチサイトを作れるCMSを構築したい。
個人的にエックスサーバーが好きなんです。すみません。

使い道は、
・テンプレートタイプのLPやホームページの運用
・通販サイト

そんな感じかなぁと。
私は、単純に日々の業務を合理化したいのが目的です。

## 設定 ##
### config/app.php ###
config/app.php に記述されている urlは　標準だと.envから設定値を読み取り設定しています。
動的に設定したいので、PHPで記述しておきます。
テンプレートで {{ulr('/xxx')}} を使いたい時など設定しておくと便利かと。
.envのAPP_URLは、使っているドメインでも入れておけば良いかと。使われませんので。

```
    //'url' => env('APP_URL', 'http://localhost'),
    'url' => empty($_SERVER["HTTPS"]) ? "http://" : "https://" . $_SERVER["HTTP_HOST"],
```


### public_html/{subdomain}/###
エックスサーバーでサブドメインを作成すると、ドメインの手前の部分はフォルダでpublic_htmlの直下に作成されてきて、そのフォルダがサブドメインのルートディレクトリになりますよね。

サブドメインのルートに標準で作成されているpublicフォルダのデータをコピーします。
ただ、階層が１つ深く沈むのでindex.phpを少々編集が必要です。
autoload.phpとbootstrap/app.php'の相対パス（../)をそれぞれ１つ増やします。

```
/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

define('LARAVEL_START', microtime(true));

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/

require __DIR__.'/../../vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

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

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

```


###routes/web.php###
ここについては、マニュアル通りに設定してみます。
(公式マニュアル)
https://laravel.com/docs/6.x/routing#route-group-subdomain-routing

```
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


Route::domain('{subdomain}.yourdomain.com')->group(function () {
    Route::get('/', function ($subdomain) {
    //ビュー渡し
        return view('welcome',['subdomain'=>$subdomain]);
    });
    //コントローラ渡し
    Route::get('/', 'Controller@index');
});
```

```
    /**
     * コントローラ渡しの時は、引数がこれで渡ります
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request, $subdomain)
    {
        return view('welcome', [
            'subdomain'=> $subdomain
        ]);
    }
```
https://subdomain.yourdomain.com　
所定のURLを開いてみると、welcomeテンプレートには、subdomainの変数が取れるようになります。
あとは、このsubdomainを引数として使って、コントローラやモデルを組んでいけば、
マルチサイトの構築は、いつも通りに作っていけば、できそうですね。
なかなか面白いと思います。
比較的簡単なので興味ある方は一度試してみてわ。
でわでわ。




### 追記 ###
yourdomainやjpの部分も{}でくくると、サブドメインではなくて、通常ドメインも変数化できました。
マルチドメイン運用も1つのCMSで運用できます。
アイデア次第で他にも設計方法はありますので、運用方法やメンテナンスしやすさにあわせて、実装方法をよく検討する事が肝心です。

```
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


Route::domain('{subdomain}.{yourdomain}.{com}')->group(function () {
    Route::get('/', function ($subdomain) {
    //ビュー渡し
        return view('welcome',['subdomain'=>$subdomain]);
    });
    //コントローラ渡し
    Route::get('/', 'Controller@index');
});
```

```
    /**
     * コントローラで、ドメインの引数を取る例
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request, $subdomain, $yourdomain , $com)
    {
        //ホスト名を配列で表現しても同じ事
        $hostArry = explode(".", $_SERVER['HTTP_HOST']);

        return view('welcome', [
            'subdomain'=> $subdomain
            'yourdomain'=> $yourdomain
            'com'=> $com
        ]);
    }
```