zend-expressive-skeleton을 GoogleAppEngine/PHP에 설치

Zend 공식 PSR-7 대응 마이크로 프레임 워크 "zend-expressive"를 사용해 보려고 생각,
Google App Engine에 설치했으므로 비망 메모입니다.

설치한 zend-expressive 버전은 1.0.0입니다.

--2016.06.10 추가 start--

이 기사의 내용을 토대로,
별기사 「 zend-expressive-skeleton을 GoogleAppEngine/PHP용으로 맞춤설정
으로, 간단하게 인스톨 할 수 있는 커스터마이즈판 스켈레톤을 준비했습니다.

--2016.06.10 추가 end--

skeleton 설치



동작을 쉽게 확인할 수 있도록 해골을 설치합니다.
템플릿 엔진을 "Plates"로 설정한 것 외에는 기본값으로 유지됩니다.
$ composer create-project zendframework/zend-expressive-skeleton <project dir>

Minimal skeleton? (no default middleware, templates, or assets; configuration only)
  [y] Yes (minimal)
  [n] No (full; recommended)
  Make your selection (No):

Which router do you want to use?
  [1] Aura.Router
  [2] FastRoute
  [3] Zend Router
  Make your selection or type a composer package name and version (FastRoute):

Which container do you want to use for dependency injection?
  [1] Aura.Di
  [2] Pimple
  [3] Zend ServiceManager
  Make your selection or type a composer package name and version (Zend ServiceManager):

Which template engine do you want to use?
  [1] Plates
  [2] Twig
  [3] Zend View installs Zend ServiceManager
  [n] None of the above
  Make your selection or type a composer package name and version (n): 1

Which error handler do you want to use during development?
  [1] Whoops
  [n] None of the above
  Make your selection or type a composer package name and version (Whoops):


project dir 바로 아래에 app.yaml 추가



Google App Engine에 필요한 설정 파일입니다.
우선 샘플 화면을 표시할 수 있는 정도의 설정으로 했습니다.
module: default
version: 1
runtime: php55
api_version: 1

handlers:
- url: /favicon.ico
  static_files: public/favicon.ico
  upload: public/favicon.ico

- url: /zf-logo.png
  static_files: public/zf-logo.png
  upload: public/zf-logo.png

- url: /.*
  script: public/index.php


로컬 환경에서 동작 확인(실패)



참고 : htps : // c ぉ d. 오, ぇ. 코 m / 아펜 기네 / 도 cs / php / 쿠이 cks rt # st_ te _ e p ぃ 카치 온

항례의 SDK로 동작 확인해 봅니다.
$ dev_appserver.py <project dir>


브라우저에서 localhost:8080 에 액세스해 보면.
주름 fatal error입니다.
Catchable fatal error: Argument 1 passed to Zend\ServiceManager\Config::__construct() must be of the type array, null given, called in /Users/shuhei/Documents/src/googleAppEngine/phpzend/config/container.php on line 11 and defined in /Users/shuhei/Documents/src/googleAppEngine/phpzend/vendor/zendframework/zend-servicemanager/src/Config.php on line 65


config/autoload 부하의 정의 파일을 glob 할 수 없어서 곤란하고 있는 것 같습니다.

Load configuration for Google App Engine



정의 파일의 읽어들이기는, config/config.php 로 실시하고 있습니다만, 문제점은 이하의 2점입니다.
  • glob() 함수를 사용하고 있다
  • 정의 파일의 내용을 캐쉬 할 때의 출력처가 파일 (file_put_contents)

  • Google App Engine용 로드 프로세스를 만들었습니다.
  • glob() 함수를 opendir()/readdir() 함수로 변경
  • 캐시 출력 대상을 파일에서 Memcache로 변경

  • 다음 내용을
    config/config-gae.php
    로 배치합니다.

    config/config-gae.php
    <?php
    
    use Zend\Stdlib\ArrayUtils;
    
    /**
     * Configuration files are loaded in a specific order. First ``global.php``, then ``*.global.php``.
     * then ``local.php`` and finally ``*.local.php``. This way local settings overwrite global settings.
     *
     * The configuration can be cached. This can be done by setting ``config_cache_enabled`` to ``true``.
     *
     * Obviously, if you use closures in your config you can't cache it.
     */
    
    $cachedConfigKey = 'cache_app_config';
    
    $mc = new Memcached();
    
    // Try to load the cached config
    if(!($config = $mc->get($cachedConfigKey))) {
        if ($mc->getResultCode() == Memcached::RES_NOTFOUND) {
            $config = [];
        }
        $confdir = __DIR__ . '/autoload';
        if ($handle = opendir($confdir)) {
            $pattern = '/(global|local)\.php$/';
            $files = [];
            while (false !== ($file = readdir($handle))) {
                if (preg_match($pattern, $file) === 1) {
                    $fn = implode('.', array_reverse(explode('.', $file)));
                    $files[] = $fn;
                }
            }
            asort($files);
            foreach($files as $file) {
                $fn = implode('.', array_reverse(explode('.', $file)));
                $config = ArrayUtils::merge($config, include $confdir.'/'.$fn);
            }
            closedir($handle);
        }
    
        // Cache config if enabled
        if (isset($config['config_cache_enabled']) && $config['config_cache_enabled'] === true) {
            $mc->set($cachedConfigKey, $config);
        }
    }
    
    // Return an ArrayObject so we can inject the config as a service in Aura.Di
    // and still use array checks like ``is_array``.
    return new ArrayObject($config, ArrayObject::ARRAY_AS_PROPS);
    
    

    발신자
    config/container.php
    을 편집합니다.

    config/container.php
    // Load configuration
    //$config = require __DIR__ . '/config.php';
    $config = require __DIR__ . '/config-gae.php';
    

    로컬 환경에서 동작 확인(성공)



    SDK의 웹 서버가 자동으로 다시로드되므로,
    브라우저를 다시 로드하면 정상적으로 표시됩니다.

    Zend Expressive

    app_config.php의 끝에서 언급했듯이,
    오류 화면 템플릿도 제공되므로 404 Not Found 화면도 표시할 수 있습니다.

    배포



    참고 : htps : // c ぉ d. 오, ぇ. 코 m / 아펜 기네 / cs / php / 쿠키 cks rt #에서 p y y r r p

    htps : // 이런. 로 ゔぉぺぺrs. 오, ぇ. 코m/
    에서 프로젝트를 만들고 해당 프로젝트 ID로 배포합니다.
    $ appcfg.py -A YOUR_PROJECT_ID update app.yaml
    

    http://(YOUR_PROJECT_ID).appspot.com/

    앞으로 개발을 진행하는데 있어서 어떠한 문제가 나올지 모르겠지만, 일단 첫걸음, 완료입니다.

    좋은 웹페이지 즐겨찾기