Laravelで、public(公開)フォルダの位置を変更する際の設定

参考先の、publicフォルダの移動と付帯する設定変更を行う。

# 概要

1. 動機
  1. こんな構成のサイトを作りたい
  2. Webサーバ上で公開するものは、極力少なくしたい
2. Laravelのpublicディレクトリと読み込みについて
3. 方針把握
  1. システムとデザインは極力分離したい
  2. ディレクトリ構造はこうなった
4. 実装手順
　1. まず、Laravel本体を生成する。
　2. publicディレクトリを、公開領域に移設する。
　3. publicディレクトリ内のindex.phpを修正する。
　4. Laravel本体側の設定を変更する
5. artisanサーバを使わない場合のhost設定(httpd)
6. 参考


# 動機

## こんな構成のサイトを作りたい

1. DBにアクセスして一覧表示、登録などの処理が多数ある部分
2. サイト紹介ページなどの、フレームワークを使うほどでもないコンテンツ。
3. ニュースリリースなどの部分。

1の部分はフレームワークを使わないと、割とどうでもいい部分で車輪の再発明をしがち。

2の部分は、あえてフレームワークを使わなくともすむ内容なら、HTML＋生PHP程度で良い。

3のニュース配信部分などは、WordPressでまかなえる。

## 極力、公開する領域に置くものは少なくしたい

httpdなどのWebサーバで、公開する領域に
設定や処理するものをあまり置きたくないない。

# Laravelのpublicディレクトリと読み込みについて

先に、この仕組みを押さえておく。
Laravelで扱うWebページのルート部分は`public/`ディレクトリになる。

# 方針把握

## システムとデザインは極力分離したい


リクエストを処理して、DBに対するアクセスや表示データを加工するシステム部分と、
ビューを定義するデザインの部分は極力分離したい。

## ディレクトリ構造はこうなった

```bash:ディレクトリ構造
/var/www/               　　　    （Apacheで公開対象になっていないディレクトリ）
/var/www/laravel/my_project/　     （Laravelの本体部分が入っている＝本体は見せたくない）
/var/www/html/         　　　     （Apacheで公開対象になっているディレクトリ）
/var/www/html/my_project_public/  (Laravel本体から分離した、コンテンツ置き場）
/var/www/html/my_project_public/css/ (Laravel制御下のコンテンツと、静的コンテンツ両方で参照を想定）
/var/www/html/my_project_public/faq.html (Laravel制御下ではない、静的なHTMLファイル）
/var/www/html/my_project_public/wp/ （WordPressコンテンツ）
```

# 実装手順

## まず、Laravel本体を生成する。

本体を置くディレクトリ（ここでは`/var/www/laravel/`）に、Composer使って作成します。
`my_project` の部分は、各自作りたいプロジェクト名を入力してください。

```bash:Composerで生成する
$ composer create-project laravel/laravel --prefer-dist my_project
```

Laravelのスケルトンが生成されますが、この時のpublicディレクトリが、ブラウザなどでアクセルする場所になります。
ここでは`/var/www/laravel/my_project/public/`に相当します。
（VirtualHostを指定する時には、このディレクトリを参照します）

## publicディレクトリを、公開領域に移設する。

```bash:publicディレクトリを移動する
$ mv public /var/ww/html/my_project_public`
```

## publicディレクトリ内のindex.phpを修正する。

`/var/ww/html/my_project_public` が、いろいろな処理を呼び出して動いている。
ディレクトリ移動によって影響を受けたファイルパスを修正し
laravelプロジェクトが存在する位置にあるものを正しくアクセスするようにする。

```php:index.phpの修正
#Register The Auto Loaderの下
（修正前）　require __DIR__.'/../bootstrap/autoload.php';
（修正後）　require '/var/www/laravel/my_project/bootstrap/autoload.php';

#Register Turn On The Lightsの下
（修正前）　$app = require_once __DIR__.'/../bootstrap/app.php';
（修正後）　$app = require_once '/var/www/laravel/my_project/bootstrap/app.php';
```

上記例では絶対パスで記載しましたが、参考先のように相対パスでも良いかもしれません。

## Laravel本体側の設定を変更する

アプリケーションのドキュメントルートは、ハードコーディングされているので
新しいクラスを使って読み込ませます。

```php:app/Apprication.php（新規作成
<?php

namespace App;

class Application extends \Illuminate\Foundation\Application
{
    public function publicPath()
    {
      return '/var/www/html/my_project_public';
    }
}
```

```php:bootstrap/app.php(修正する）
//Create The Application　の下
//修正前
// $app = new Illuminate\Foundation\Application(
//     realpath(__DIR__.'/../')
// );

/*修正後*/
$app = new App\Application(
    realpath(__DIR__.'/../')
);
```

mod_rewrite を書き換える

```php:server.php
//(修正前）
 if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
     return false;
}

require_once __DIR__.'/public/index.php';

//（修正後）
if ($uri !== '/' && file_exists('/var/www/html/my_project_public'.$uri)) {
    return false;
}

require_once '/var/www/html/my_project_public/index.php';

```

# artisanサーバを使わない場合のhost設定(httpd)

artisanを使わず、httpdで動かす場合

ドメイン名は　`example-site.orz` と仮定する。

```bash:httpd.confにvirtualhostを追記
#to use laravel mixed
<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/html/my_project_public/
    ServerName example-site.orz
    ErrorLog logs/example-site.orz-error_log
    CustomLog logs/example-site.orz-error_log common
</VirtualHost>



```

# 参考
Laravel の publicフォルダの階層を移動させたい

http://qiita.com/matsuoshi/items/b0dceb9b380a9282719a