質問: ### cakePHP3をCapistranoでデプロイしたい github上にあるcakePHP3のソースをCapistranoでデプロイしたいと思っています。 フォルダ構成は以下です。 ``` ├── capistrano │ ├── Capfile │ ├── config │ ├── lib │ └── log ├── current -> /hoge/fuga/releases/20160509123213 ├── releases │ ├── 20160508132358 │ ├── 20160508170830 │ ├── 20160508172906 │ ├── 20160509112513 │ └── 20160509123213 │ ├── REVISION │ ├── bin │ ├── config │ ├── docs │ ├── index.php │ ├── logs │ ├── phpunit.xml.dist │ ├── plugins │ ├── src │ ├── tests │ ├── tmp │ ├── vendor -> /hoge/fuga/shared/vendor │ └── webroot └── shared └── vendor ``` Git上ではvendorを管理していないため、シンボリックリンクを貼っています。 ### あるはずのControllerが見つからないとエラーが発生する ![](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/f6c7b05838fd3beee79890920a64585e.png) src以下に配置しているUsersControllerが無いと言われてしまう。 ### 試したこと 20160509123213以下のvendorのシンボリックリンクを一旦削除し、 直接vendorフォルダを配置すると、正常に動作しました。 ### おわりに CapistranoでデプロイしGit上でvendorを管理しない以上、 直接配置するのではなく、シンボリックリンクを貼らなければならないと思っています。 なぜvendorがシンボリックリンクだとこのようなエラーが出るのか? そしてvendorを直接配置せずにvendorのシンボリックリンクを貼る方法で、 正常に動作させるにはどうしたらいいのかをご教示いただければと思います。 ### 追記1 シンボリックリンクの表現を変更しました。 ### 追記2 httpd.conf ``` Options FollowSymLinks AllowOverride All ```
回答: // 既に解決済みかもしれませんが ComposerのAutoloadに起因するものだと思います。 Composerから生成される shared/vendor/composer/autoload_psr4.php が恐らく以下のようになっていると思います。 ``` // autoload_psr4.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname(dirname($vendorDir)); return array( ... 'App\\' => array($baseDir . '/src'), ); ``` これにより、releases以下のファイルでなく親の方のディレクトリでAppを参照しようとしているため読めていません。 綺麗かはわかりませんが、デプロイタスクにcomposerを実行しておらず、CakePHP以外で参照していない場合は以下に書き換えれば良いと思います。 (すぐに思いついたものですので、他にも良い方法があるとは思います。) ``` // autoload_psr4.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); // $baseDir = dirname(dirname($vendorDir)); $baseDir = ROOT; // CakePHPのROOTです。 ``` ※本来はアプリのバージョンごとでライブラリのバージョンも異なる可能性があるので、 シンボリックリンクを使わずにバージョンで composer install を行い自動テスト〜デプロイすべきだとは思います。 諸々の事情でライブラリが固定、シンボリックリンクで参照とする場合の方法かと思います。