[5.6]concrete5のパッケージにLaravel5を組み込む

環境

  • ディレクトリ構成は、CPI ACE01
  • SSHではphpコマンドを打てないので、ローカルで諸々の環境を作ってからサーバー上で展開
  • ローカルのPHPはphpenvで環境にあわせてバージョンを指定
└── html
    ├── blocks
    ├── concrete
    ├── config
    ├── controllers
    ├── css
    ├── elements
    ├── files
    ├── helpers
    ├── jobs
    ├── js
    ├── languages
    ├── libraries
    ├── mail
    ├── models
    ├── packages
    ├── packages
    │   └── example
    │       ├── controllers
    │       │   └── dashboard
    │       │       └── example
    │       │           └── sandbox
    │       ├── laravel
    │       └── single_pages
    │           └── dashboard
    │               └── example
    │                   └── sandbox
    ├── page_types
    ├── single_pages
    ├── themes
    ├── tools
    └── updates

Laravel5の導入

composerインストール

  • プロジェクトのルートディレクトリにcomposerをインストール
  • ローカルで運用
> curl -sS https://getcomposer.org/installer | php

Laravel5のインストール

> php composer.phar create-project laravel/laravel html/packages/example/laravel --prefer-dist

composer.jsonにForm・HTMLヘルパーを追加

Upgrade Guide – Laravel – The PHP Framework For Web Artisans

    "require": {
        "laravel/framework": "5.0.*",
        "laravelcollective/html": "~5.0" // 追加
    },

Call to undefined method Illuminate\Foundation\Application::getCachedCompilePath()

先ほど追加したForm・HTMLヘルパーを入れるためにupdateを実行して上記エラーが出た場合の対処

Call to undefined method Illuminate\Foundation\Application::getCachedCompilePath() · Issue #8127 · laravel/framework

> rm vendor/compiled.php
> php composer.phar update

パッケージ内のコントローラーからLaravel5を読み込む

パッケージのパスを取得して、autoload.phpなどをrequireしていく
concrete5 :: Get the Package Path in a Dashboard Single Page Controller

<?php
defined('C5_EXECUTE') or die("Access Denied.");

use \App\User;

class DashboardExampleSandboxController extends DashboardBaseController {

    public $helpers = array('html', 'form');

    public $laravel;

    public function on_start() {
        parent::on_start();
        $packagePath = Package::getByID($this->c->pkgID)->getPackagePath();
        require $packagePath . '/laravel/bootstrap/autoload.php';
        $this->laravel = require_once $packagePath . '/laravel/bootstrap/app.php';
    }

    public function view() {
        // Laravel5標準の認証用ユーザーモデル
        $user = new User();
    }

まとめ

強引な方法だけれども、Laravel5内のリソースにアクセスできた。Eloquentも普通に使えるはずなので検証を継続。

もっとスマートな方法があれば情報求む。

情報提供

パッケージコントローラーのon_start()で読み込むとスッキリだった。あとはPSR-0準拠として、Laravel側のnamespaceを置き換えれば良さそう