Laravel Mix -> Hackers Galore 様編

Posted by muchag | CakePHP 3.x,Library & PlugIn & AddIn,困ったTT | 2018-12-07 (金) 13:31:02

【環境】
CakePHP: 3.6.5
php: 7.3.0 rc6
手順
シンボリックリンク問題対応

シンボリックリンク権限問題 解決のために
シンボリックリンクを作成。


mkdir /media/sf_CakeTest/node_modules
mkdir /var/CakeTest
mkdir /var/CakeTest/node_modules
mount --bind /var/CakeTest/node_modules /media/sf_CakeTest/node_modules
package.json 配置

https://github.com/laravel/laravel/blob/master/package.json
を CakePHP3 のルートディレクトリへ配置。

webroot 内に配置しないように。

私は、直接 Laravel 5.7.15 からコピペした。

インストール

cd /media/sf_CakeTest
yarn install
imagemin

imagemin についての警告が出るので、インストール。


warning "laravel-mix > img-loader@3.0.1" has unmet peer dependency "imagemin@^5.0.0 || ^6.0.0".

こちらを解決するために、imagemin をインストール。


yarn add -D imagemin
yarn add v1.12.3
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.4: The platform "linux" is incompatible with this module.
info "fsevents@1.2.4" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 14 new dependencies.
info Direct dependencies
└─ imagemin@6.0.0
info All dependencies
├─ @mrmlnc/readdir-enhanced@2.2.1
├─ @nodelib/fs.stat@1.1.3
├─ arrify@1.0.1
├─ call-me-maybe@1.0.1
├─ dir-glob@2.0.0
├─ fast-glob@2.2.4
├─ file-type@8.1.0
├─ glob-to-regexp@0.3.0
├─ globby@8.0.1
├─ ignore@3.3.10
├─ imagemin@6.0.0
├─ merge2@1.2.3
├─ p-pipe@1.2.0
└─ replace-ext@1.0.0
Done in 9.96s.
webpack.mix.js 配置

https://github.com/laravel/laravel/blob/master/webpack.mix.js
を CakePHP3 のルートディレクトリへ配置。

私は、直接 Laravel 5.7.15 からコピペした。

assets ディレクトリ配置
/assets/js/app.js
/assets/sass/app.sass

を配置。

私は、直接 Laravel 5.7.15 からコピペした。

webpack.mix.js 修正

参考サイトのものを基に、自分の環境に合わせて改変。

/webpack.mix.js

mix.js('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css');


mix.setPublicPath('webroot'); // since not in Laravel, need to help Mix along here
mix.js('assets/js/app.js', 'webroot/js')
.sass('assets/sass/app.scss', '../assets/build/css')
.sass('assets/sass/self.scss', '../assets/build/css')
.styles([
    'assets/build/css/app.css',
    'assets/build/css/self.css'
    ], 'webroot/css/app.css');
テストコード

参考サイトにはテストコードを記述する件があるけど
Laravel からコピペしてきた、ExampleComponent.vue があるので
テストコードはスキップ。

組み込み
/src/Template/Pages/home.ctp

header 閉じタグ直後に3行追加。


body 閉じタグ直前に2行追加。


webpack 始動

npm run watch

 DONE  Compiled successfully in 8082ms                                                                                                                                                                                                                                                                               15:57:56
                                                                                                                                                                                                                                                                                                                       Asset     Size  Chunks                    Chunk Names
  /js/app.js  1.38 MB       0  [emitted]  [big]  /js/app
/css/app.css   198 kB       0  [emitted]         /js/app
表示確認

CakePHP3 のロゴ黒帯下に

Example Component
I’m an example component.

と、ExampleComponent.vue の内容が表示された。

やた~!!

ところが・・・

その後の使い方で 困ったこと が・・・。

webpack.mix.js において
ファイル統合をしようとすると
表示時にデベロッパーツールのコンソールへ謎のエラー、
というか、
コンパイル後の app.js へ、謎の追記がされる。

stack overflow:Uncaught SyntaxError: Invalid or unexpected token in file compiled by Browserify(2016-06-10)
こちらと同じ症状っぽいんだけど、
上記は Elixir 時代のものだし、提示されている方法が Nginx のもので
私の環境は Apache なので、どうしてよいかわからずじまい。

webpack.mix.js

mix.setPublicPath('webroot'); // since not in Laravel, need to help Mix along here
mix.js('resources/assets/js/app.js', 'webroot/js')
.sass('resources/assets/sass/app.scss', 'webroot/css');

これだと問題ないけど


mix.setPublicPath('webroot'); // since not in Laravel, need to help Mix along here
mix.js('assets/js/app.js', 'webroot/js')
.sass('assets/sass/app.scss', '../assets/build/css')
.sass('assets/sass/self.scss', '../assets/build/css')
.styles([
    'assets/build/css/app.css',
    'assets/build/css/self.css'
    ], 'webroot/css/app.css');

これだと
コンパイルは無事に通り、ファイルも生成されるけど
Uncaught SyntaxError: Invalid or unexpected token となり
デベロッパーツール上では、app.js に ******************************************** な感じのが表示される。
コンパイル後の app.js ファイルを直接見てもそんな記述はないけど。。。

わかる方がいらしたら、ぜひ情報をください。

試行錯誤
yarn install

yarn install --no-bin-links
yarn install v1.12.3
info No lockfile found.
[1/4] Resolving packages...
warning laravel-mix > autoprefixer > browserslist@2.11.3: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning laravel-mix > css-loader > cssnano > autoprefixer > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning laravel-mix > css-loader > cssnano > postcss-merge-rules > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning laravel-mix > css-loader > cssnano > postcss-merge-rules > caniuse-api > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
[2/4] Fetching packages...
info fsevents@1.2.4: The platform "linux" is incompatible with this module.
info "fsevents@1.2.4" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning "laravel-mix > img-loader@3.0.1" has unmet peer dependency "imagemin@^5.0.0 || ^6.0.0".
[4/4] Building fresh packages...
success Saved lockfile.
Done in 120.15s.
解決1

warning laravel-mix > autoprefixer > browserslist@2.11.3: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning laravel-mix > css-loader > cssnano > autoprefixer > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning laravel-mix > css-loader > cssnano > postcss-merge-rules > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning laravel-mix > css-loader > cssnano > postcss-merge-rules > caniuse-api > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.

こちらの4行を解決するために

/package.json

へ、下記3行を追記。


"browserslist": [
    "> 1%",
    "last 2 versions"
],

と思ったけど、これでは解決しない。

解決2

こちらは、yarn install 前にはできないので
下記警告が出てから対処。


warning "laravel-mix > img-loader@3.0.1" has unmet peer dependency "imagemin@^5.0.0 || ^6.0.0".

こちらを解決するために、imagemin をインストール。


yarn add -D imagemin
npm run watch1

起動してみると


npm run watch

__ snip __

sh: cross-env: コマンドが見つかりません

と怒られた。

解決

teratail:npm run watch時に「sh: 1: cross-env: not found」のエラー発生(2018-04-05)
を参考にして、package.json を、下記の通り編集。

/package.json

{
    "private": true,
    "scripts": {
        "dev": "npm run development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "npm run development -- --watch",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
}


{
    "private": true,
    "scripts": {
        "dev": "npm run development",
        "development": "node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "npm run development -- --watch",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
}
npm run watch2

再び、webpack を起動してみると


npm run watch

__ snip __

These dependencies were not found:

* /media/sf_CakeTest/resources/assets/js/app.js in multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
* /media/sf_CakeTest/resources/assets/sass/app.scss in multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
解決

これは、resources ディレクトリを Laravel からコピペしたため
assets ディレクトリを配置し忘れていた。

npm run watch3

再び、webpack を起動してみると


npm run watch

__ snip __

 error  in ./resources/assets/sass/app.scss

Module build failed: Error: ENOENT: no such file or directory, scandir '/media/sf_CakeTest/node_modules/node-sass/vendor'
npm rebuild node-sass

Qiita:EC2環境でLaravelのセットアップ中にnode-sassのvenderディレクトリが見つからないと言われたときの対処法(2016-07-21)
を参考に npm rebuild node-sass してみた。


npm rebuild node-sass
npm ERR! path ../node-sass/bin/node-sass
npm ERR! code EROFS
npm ERR! errno -30
npm ERR! syscall symlink
npm ERR! rofs EROFS: read-only file system, symlink '../node-sass/bin/node-sass' -> '/media/sf_CakeTest/node_modules/.bin/node-sass'
npm ERR! rofs Often virtualized file systems, or other file systems
npm ERR! rofs that don't support symlinks, give this error.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-12-07T05_28_07_044Z-debug.log
シンボリックリンク権限問題

件の シンボリックリンク権限問題 が出たので


mkdir /var/CakeTest
mkdir /var/CakeTest/node_modules
mount --bind /var/CakeTest/node_modules /media/sf_CakeTest/node_modules
npm rebuild node-sass再

で、もっかい


npm rebuild node-sass

> node-sass@4.10.0 install /media/sf_CakeTest/node_modules/node-sass
> node scripts/install.js

node-sass build Binary found at /media/sf_CakeTest/node_modules/node-sass/vendor/linux-x64-57/binding.node

> node-sass@4.10.0 postinstall /media/sf_CakeTest/node_modules/node-sass
> node scripts/build.js

Binary found at /media/sf_CakeTest/node_modules/node-sass/vendor/linux-x64-57/binding.node
Testing binary
Binary is fine
node-sass@4.10.0 /media/sf_CakeTest/node_modules/node-sass

それでも vendor ディレクトリは生成されなかった。

npm install node-sass@3.7.0

そこで、
stack overflow:Error: ENOENT: no such file or directory, scandir
に載っていた


npm install node-sass@3.7.0

を実行してみると
大量のログが出たけど
vendor ディレクトリは生成されなかった。

解決?

ここで試しに webpack を起動。


npm run dev

すると、コンパイル完了。

どの時点で、不具合が解消されたか不明。
次回試行まだお預け。

予想

npm rebuild node-sass

こちらで入ってきた node-sass は 4.10.0

そして、3.7.0 を入れたらうまくいったので
4.10.0 の不具合?

参考サイト

Hackers Galore:Using Laravel Mix with CakePHP 3(2018-04-29)

ログ
sh: cross-env: コマンドが見つかりません

npm run watch

> @ watch /media/sf_CakeTest
> npm run development -- --watch


> @ development /media/sf_CakeTest
> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js "--watch"

sh: cross-env: コマンドが見つかりません
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! @ development: `cross-env NODE_ENV=development node_modules/webpack/bin
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the @ development script.
npm ERR! This is probably not a problem with npm. There is likely additional log

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-12-07T04_27_40_334Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ watch: `npm run development -- --watch`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ watch script.
npm ERR! This is probably not a problem with npm. There is likely additional log

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-12-07T04_27_40_345Z-debug.log
ERROR in multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss

npm run watch

ERROR  Failed to compile with 2 errors                                                                                                                                                                                                                                                                              14:16:59

These dependencies were not found:

* /media/sf_CakeTest/resources/assets/js/app.js in multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
* /media/sf_CakeTest/resources/assets/sass/app.scss in multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss

To install them, you can run: npm install --save /media/sf_CakeTest/resources/assets/js/app.js /media/sf_CakeTest/resources/assets/sass/app.scss                                                                                                                                                                     Asset     Size  Chunks             Chunk Names
/js/app.js  2.76 kB       0  [emitted]  /js/app

ERROR in multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
Module not found: Error: Can't resolve '/media/sf_CakeTest/resources/assets/js/app.js' in '/media/sf_CakeTest'
 @ multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss

ERROR in multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
Module not found: Error: Can't resolve '/media/sf_CakeTest/resources/assets/sass/app.scss' in '/media/sf_CakeTest'
 @ multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
Module build failed: Error: ENOENT: no such file or directory, scandir ‘/media/sf_CakeTest/node_modules/node-sass/vendor’

npm run watch

> @ watch /media/sf_CakeTest
> npm run development -- --watch


> @ development /media/sf_CakeTest
> node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js "--watch"

 10% building modules 1/1 modules 0 active
Webpack is watching the files…
                                                                                                                                                                                                                                                                                    95% emitting                             
 ERROR  Failed to compile with 2 errors                                                                                                                                                                                                                                                                              14:25:46

 error  in ./resources/assets/sass/app.scss

Module build failed: Error: ENOENT: no such file or directory, scandir '/media/sf_CakeTest/node_modules/node-sass/vendor'
    at Object.fs.readdirSync (fs.js:904:18)
    at Object.getInstalledBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/extensions.js:130:13)
    at foundBinariesList (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:20:15)
    at foundBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:15:5)
    at Object.module.exports.missingBinary (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:45:5)
    at module.exports (/media/sf_CakeTest/node_modules/node-sass/lib/binding.js:15:30)
    at Object. (/media/sf_CakeTest/node_modules/node-sass/lib/index.js:14:35)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object. (/media/sf_CakeTest/node_modules/sass-loader/lib/loader.js:3:14)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:13:17)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18

 @ ./resources/assets/sass/app.scss 4:14-266
 @ multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss

 error  in ./resources/assets/sass/app.scss

Module build failed: ModuleBuildError: Module build failed: Error: ENOENT: no such file or directory, scandir '/media/sf_CakeTest/node_modules/node-sass/vendor'
    at Object.fs.readdirSync (fs.js:904:18)
    at Object.getInstalledBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/extensions.js:130:13)
    at foundBinariesList (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:20:15)
    at foundBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:15:5)
    at Object.module.exports.missingBinary (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:45:5)
    at module.exports (/media/sf_CakeTest/node_modules/node-sass/lib/binding.js:15:30)
    at Object. (/media/sf_CakeTest/node_modules/node-sass/lib/index.js:14:35)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object. (/media/sf_CakeTest/node_modules/sass-loader/lib/loader.js:3:14)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:13:17)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at runLoaders (/media/sf_CakeTest/node_modules/webpack/lib/NormalModule.js:195:19)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:364:11
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:170:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:27:11)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at runLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:362:2)
    at NormalModule.doBuild (/media/sf_CakeTest/node_modules/webpack/lib/NormalModule.js:182:3)
    at NormalModule.build (/media/sf_CakeTest/node_modules/webpack/lib/NormalModule.js:275:15)
    at Compilation.buildModule (/media/sf_CakeTest/node_modules/webpack/lib/Compilation.js:157:10)
    at moduleFactory.create (/media/sf_CakeTest/node_modules/webpack/lib/Compilation.js:460:10)
    at factory (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:243:5)
    at applyPluginsAsyncWaterfall (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:94:13)
    at /media/sf_CakeTest/node_modules/tapable/lib/Tapable.js:268:11
    at NormalModuleFactory.params.normalModuleFactory.plugin (/media/sf_CakeTest/node_modules/webpack/lib/CompatibilityPlugin.js:52:5)
    at NormalModuleFactory.applyPluginsAsyncWaterfall (/media/sf_CakeTest/node_modules/tapable/lib/Tapable.js:272:13)
    at resolver (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:69:10)
    at process.nextTick (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:196:7)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
                                                                                                                                                                                                                                                                                                                     Asset     Size  Chunks                    Chunk Names
/js/app.js  1.39 MB       0  [emitted]  [big]  /js/app

ERROR in ./node_modules/css-loader??ref--5-2!./node_modules/postcss-loader/lib??postcss!./node_modules/resolve-url-loader??ref--5-4!./node_modules/sass-loader/lib/loader.js??ref--5-5!./resources/assets/sass/app.scss
Module build failed: Error: ENOENT: no such file or directory, scandir '/media/sf_CakeTest/node_modules/node-sass/vendor'
    at Object.fs.readdirSync (fs.js:904:18)
    at Object.getInstalledBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/extensions.js:130:13)
    at foundBinariesList (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:20:15)
    at foundBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:15:5)
    at Object.module.exports.missingBinary (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:45:5)
    at module.exports (/media/sf_CakeTest/node_modules/node-sass/lib/binding.js:15:30)
    at Object. (/media/sf_CakeTest/node_modules/node-sass/lib/index.js:14:35)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object. (/media/sf_CakeTest/node_modules/sass-loader/lib/loader.js:3:14)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:13:17)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
 @ ./resources/assets/sass/app.scss 4:14-266
 @ multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss

ERROR in ./resources/assets/sass/app.scss
Module build failed: ModuleBuildError: Module build failed: Error: ENOENT: no such file or directory, scandir '/media/sf_CakeTest/node_modules/node-sass/vendor'
    at Object.fs.readdirSync (fs.js:904:18)
    at Object.getInstalledBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/extensions.js:130:13)
    at foundBinariesList (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:20:15)
    at foundBinaries (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:15:5)
    at Object.module.exports.missingBinary (/media/sf_CakeTest/node_modules/node-sass/lib/errors.js:45:5)
    at module.exports (/media/sf_CakeTest/node_modules/node-sass/lib/binding.js:15:30)
    at Object. (/media/sf_CakeTest/node_modules/node-sass/lib/index.js:14:35)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object. (/media/sf_CakeTest/node_modules/sass-loader/lib/loader.js:3:14)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:13:17)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at runLoaders (/media/sf_CakeTest/node_modules/webpack/lib/NormalModule.js:195:19)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:364:11
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:170:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:27:11)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:165:10)
    at /media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:173:18
    at loadLoader (/media/sf_CakeTest/node_modules/loader-runner/lib/loadLoader.js:36:3)
    at iteratePitchingLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
    at runLoaders (/media/sf_CakeTest/node_modules/loader-runner/lib/LoaderRunner.js:362:2)
    at NormalModule.doBuild (/media/sf_CakeTest/node_modules/webpack/lib/NormalModule.js:182:3)
    at NormalModule.build (/media/sf_CakeTest/node_modules/webpack/lib/NormalModule.js:275:15)
    at Compilation.buildModule (/media/sf_CakeTest/node_modules/webpack/lib/Compilation.js:157:10)
    at moduleFactory.create (/media/sf_CakeTest/node_modules/webpack/lib/Compilation.js:460:10)
    at factory (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:243:5)
    at applyPluginsAsyncWaterfall (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:94:13)
    at /media/sf_CakeTest/node_modules/tapable/lib/Tapable.js:268:11
    at NormalModuleFactory.params.normalModuleFactory.plugin (/media/sf_CakeTest/node_modules/webpack/lib/CompatibilityPlugin.js:52:5)
    at NormalModuleFactory.applyPluginsAsyncWaterfall (/media/sf_CakeTest/node_modules/tapable/lib/Tapable.js:272:13)
    at resolver (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:69:10)
    at process.nextTick (/media/sf_CakeTest/node_modules/webpack/lib/NormalModuleFactory.js:196:7)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
 @ ./resources/assets/sass/app.scss
 @ multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
CakePHP 3.x,Library & PlugIn & AddIn,困ったTT | 2018-12-07 (金) 13:31:02 |

依存注入とコントローラ

Posted by muchag | Laravel 5.x | 2018-12-05 (水) 23:21:46


公式:コントローラ 依存注入とコントローラ

【環境】
Laravel: 5.7.15
コンストラクターインジェクション

コンストラクタにおいて依存注入を果たす。

コントローラ全体で利用する、できる。


namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * ユーザーリポジトリインスタンス
     */
    protected $users;

    /**
     * 新しいコントローラインスタンスの生成
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}
メソッドインジェクション

アクションにおいて依存注入を果たす。

アクション(メソッド)ローカルで利用する、できる。


namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 新ユーザーの保存
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->name;

        //
    }
}
暗黙の結合

delete アクションにおいて、すごい暗黙ルールがあった。

下記のようにルーティングすると


Route::delete('/task/{task}', function (Task $task) {
  $task->delete();

  return redirect('/');
});

パラメータ task.id から、該当する Task モデル(エンティティ)を
自動で取得してくるらしい。

{task}と$taskの名前が一致している場合には「暗黙の結合」という機能によって、
自動的に{task}のidを持つタスクが読み込まれ $taskに代入されます。
もし一致するidが見つからない場合は、404ページが生成されます。

beizのノート:Laravel 5.5 入門として「基本のタスクリスト」を作成する [その3](2018-11-01)
タスクのデータベースからの削除

すごいけど、ねぇ。。。

delete でなくても、反応しそう。

あ、これはコントローラの話じゃないか。

ルーティングの勉強をするときに移動。

Laravel 5.x | 2018-12-05 (水) 23:21:46 |

コマンド実行

Posted by muchag | PHP | 2018-05-18 (金) 23:53:31

php からサーバコマンドを実行する方法。

公式:execsystem

概要

php からサーバコマンドを実行するには
exec と system の2つの関数が用意されている。

二者の違いは、出力を返すか返さないかみたいだけど
引数指定次第でどちらも出力を返すみたいなので
結果的には、同じ働きなのかしらね~。

書式
exec

string exec ( string $command [, array &$output [, int &$return_var ]] )

第1引数:コマンド文字列
第2引数:出力格納用変数。省略可。省略すると出力を受け取れない
第3引数:コマンド実行結果ステータス格納用変数。省略可。省略するとステータスを受け取れない

system

string system ( string $command [, int &$return_var ] )

第1引数:コマンド文字列
第2引数:コマンド実行結果ステータス格納用変数。省略可。省略するとステータスを受け取れない

非同期処理

どちらもコマンド文字列に「 > /dev/null &」と付記してやることで、非同期に処理を実行できる。

注意:

プログラムがこの関数で始まる場合、 バックグラウンドで処理を続けさせるには、
プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。
そうしないと、プログラムが実行を終えるまで PHP はハングしてしまいます。

どうやら、上記付記内容は、出力をリダイレクトさせるものらしい。

参考サイト

SAMURAI:【PHP入門】外部コマンドの実行(exec)とコマンドライン実行の方法(2017-10-16)

PHP | 2018-05-18 (金) 23:53:31 |

phpDocumentor

Posted by muchag | PHP | 2018-04-11 (水) 15:52:58

個人で開発をしていると、こういうチームワーク的な手法に手が回らない。
実感が湧かないからね。。。

公式?:phpDocumentor

アノテーション
@property

公式?:@property
メンバ変数の型宣言をできる。

php では、メンバ変数を宣言する際に、型宣言を伴わない。
そのせいで phpStrom では、警告が出るらしい。

User.php

class User
{
    private $name;

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

この User クラスをメンバ変数 $leader へ代入すると
$leader が何者か不明なために、User クラス内メソッドを利用する際に警告となるらしい。

そこで、下記のように @property アノテーションで定義してやることで
理解してもらえるそうな。

ちなみに、複数管理するメンバ変数には、User[] という他言語タイプで伝えるとよいらしい。


/**
 * Class Group
 *
 * @property User $leader
 * @property User[] $leaders <- array ではなく User[]
 */
class Group
{
    private $leader;
    private $leaders = [];
}
@method

公式?:@method
findX のようなマジックメソッド利用時に用いる。
※マジックメソッドは、そんなメソッドは存在しないんだけど
メソッド名からフレームワーク側が解析して、処理してくれるメソッド?


/**
 * Class SampleModel
 *
 * @method array findById($id, $fields = null)
 */
class SampleModel extends AppModel
{

このように明記してやることができる。

@uses, @used-by

メソッド名を動的に生成する場合に用いる。
要は、当該メソッドがどこからも呼ばれていないと思われるのを避ける。

公式?:@uses & @used-by


class Hoge
{
    /**
     * @uses addUser(), addAdmin()
     */
    public function addMember($user, $user_type)
    {
        $method = sprintf('add%s', $user_type);
        $this->{$method}($user); // $user_type に合ったメソッドを呼ぶ
    }

    /**
     * @used-by addMember
     */
    private function addUser($user)
    {
    }

    /**
     * @used-by addMember
     */
    private function addAdmin($user)
    {
    }
}
@uses

@uses の呼び出し元に設定する。

@used-by

@uses の呼び出し先に設定する。

参考サイト

バシャログ。:PhpStorm の静的解析機能をさらに活用するための3つのアノテーション(2015-12-07)
→@property, @method, @uses について非常にわかりやすかった

PHP | 2018-04-11 (水) 15:52:58 |

editorconfig-eclipse

Posted by muchag | CakePHP 3.x,Eclipse,Library & PlugIn & AddIn | 2018-03-07 (水) 16:21:41

.editorconfig に対応するためのプラグイン。

CakePHP3 の コーディング規約 を調べていたら
.editorconfig なるものの存在を知った。

これを Eclipse で利用できるようになるプラグイン。

【環境】
editorconfig-eclipse: 0.3.0.201702161018 Beta
Eclipse:Oxygen (4.7)
EPP Marketplace Client:1.5.1.v20160929-1432
OS:Windows10 Pro 64bit
インストール

[ヘルプ]-[Eclipse マーケットプレース]
検索窓に「editorconfig」
「editorconfig-eclipse 0.x」がヒットするので [インストール]
ライセンスに同意して [完了]

警告:署名なしコンテンツを含むソフトウェアをインストールしています。
このソフトウェアの真正性または妥当性を実証できません。
インストールを続行しますか?

がーん。。。断念。 😥

CakePHP 3.x,Eclipse,Library & PlugIn & AddIn | 2018-03-07 (水) 16:21:41 |

さくら VPS -> Composer

Posted by muchag | CentOS,Library & PlugIn & AddIn,PHP,さくらインターネット | 2018-01-16 (火) 22:41:44

【環境】
Composer: 1.6.2
php: 7.1.13
CentOS: 7.4.1708
さくらインターネット:VPS 2G プラン
インストール

curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 1.6.2) successfully installed to: /root/composer.phar
Use it: php composer.phar
起動

php composer.phar
Do not run Composer as root/super user! See https://getcomposer.org/root for details
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.6.2 2018-01-05 15:28:41

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about                Shows the short information about Composer.
  archive              Creates an archive of this composer package.
  browse               Opens the package's repository URL or homepage in your browser.
  check-platform-reqs  Check that platform requirements are satisfied.
  clear-cache          Clears composer's internal package cache.
  clearcache           Clears composer's internal package cache.
  config               Sets config options.
  create-project       Creates new project from a package into given directory.
  depends              Shows which packages cause the given package to be installed.
  diagnose             Diagnoses the system to identify common errors.
  dump-autoload        Dumps the autoloader.
  dumpautoload         Dumps the autoloader.
  exec                 Executes a vendored binary/script.
  global               Allows running commands in the global composer dir ($COMPOSER_HOME).
  help                 Displays help for a command
  home                 Opens the package's repository URL or homepage in your browser.
  info                 Shows information about packages.
  init                 Creates a basic composer.json file in current directory.
  install              Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses             Shows information about licenses of dependencies.
  list                 Lists commands
  outdated             Shows a list of installed packages that have updates available, including their latest version.
  prohibits            Shows which packages prevent the given package from being installed.
  remove               Removes a package from the require or require-dev.
  require              Adds required packages to your composer.json and installs them.
  run-script           Runs the scripts defined in composer.json.
  search               Searches for packages.
  self-update          Updates composer.phar to the latest version.
  selfupdate           Updates composer.phar to the latest version.
  show                 Shows information about packages.
  status               Shows a list of locally modified packages.
  suggests             Shows package suggestions.
  update               Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  upgrade              Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate             Validates a composer.json and composer.lock.
  why                  Shows which packages cause the given package to be installed.
  why-not              Shows which packages prevent the given package from being installed.
実行ファイルの移動

mv composer.phar /usr/local/bin/composer

これで、直接 composer で利用できる。

アップデート

念の為、アップデート。


composer self-update
おまけ
インストール時警告

実は上記インストール時に、下記2行目の警告が出ていた。


curl -sS https://getcomposer.org/installer | php
PHP Warning:  Module 'intl' already loaded in Unknown on line 0
All settings correct for using Composer
Downloading...

Composer (version 1.6.2) successfully installed to: /root/composer.phar
Use it: php composer.phar

これは、php.ini で extension=intl.so をコメントアウトすることで消えたけど
CakePHP3 をインストールする際に intl は必要なはずなので、後ほど試す。

起動時警告

実は上記起動時に、下記2行目の警告が出ていた。


php composer.phar
Do not run Composer as root/super user! See https://getcomposer.org/root for details

あら、Composer って、root で利用してはいけないのね~。

実行ファイルを移動させて、一般ユーザに戻って利用したら
上記警告は出なくなった。

ちなみに、インストールを root でしたせいか
実行ファイルを移動しておかないと、php composer.phar では、実行できず


php composer.phar
Could not open input file: composer.phar

このように怒られた。。。

参考サイト

WinRoad徒然草:さくらのVPSサーバーにLaravelのインストール(2015-03-23)

結果セット整形

Posted by muchag | Symfony 1.x | 2016-11-19 (土) 12:04:24

DQL における、結果セットの整形。
Data Hydrators

【環境】
Symfony:1.4.13
doctrine:1.2.4
書式

execute, fetchOne, fetchAll などの第2引数に指定する。

  1. $q = Doctrine_Core::getTable('User')
  2.     ->createQuery('u')
  3.     ->leftJoin('u.Email e')
  4.     ->where('u.username = ?', 'jwage');
  5.  
  6. $user = $q->fetchOne(array(), Doctrine_Core::HYDRATE_RECORD);
詳細
HYDRATE_RECORD

レコードをオブジェクトとして取得。
デフォルト値なので、省略すればこれになる。

HYDRATE_ARRAY

連想配列として取得。

HYDRATE_SCALAR

連想配列として取得。
キーが、カラム名_フィールド名 という書式になっている。

HYDRATE_SINGLE_SCALAR

配列として取得。
WHERE 句で指定したカラムの値を、
添え字 0 から始まる配列の要素に格納(しているように見える)。

HYDRATE_ON_DEMAND

公式サイトを読む限り、
「1レコードしか読み込まないのでメモリを節約できるよ」
って書いてある気がするけど
実験したら、時間制限に引っ掛かって戻ってこなかったので
今回はパス。

HYDRATE_RECORD_HIERARCHY

nested ビヘイビアを利用しているときに使える引数っぽい。
オブジェクトとして取得。

HYDRATE_ARRAY_HIERARCHY

nested ビヘイビアを利用しているときに使える引数っぽい。
連想配列として取得。

HYDRATE_NONE

配列として取得。
取得してきたデータを、添え字 0 から始まる配列の要素に格納(しているように見える)。

HYDRATE_ARRAY_SHALLOW

連想配列として取得。
SELECT で指定したカラムだけを取得。

※下2つは、下記参考サイトから拾ってきた。
公式サイトに全種類が載っていないのは不思議・・・

HYDRATE_RECORD_SHALLOW

上記定数を参考に、こんなのもあるかと思ったけどなかったw

参考サイト

stackoverflow:Select One column Doctrine DQL(2013-01-19)

Symfony 1.x | 2016-11-19 (土) 12:04:24 |

ヒアドキュメント

Posted by muchag | PHP | 2016-01-16 (土) 10:53:42

なが~い文字列を扱うための構文。

PHP Manual:文字列 ヒアドキュメント

【環境】
PHP:5.4.7
注意

WordPress なのか iG:Syntax Hiliter なのか
<<< という記述をすると、表示が乱れるので <<< と表記してある。 でも、最後のコード表記は大丈夫なのよね~・・・。

書式
  1. &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD
  4. ;
  5.  
  6. // PHP 5.3.0 以降、開始 ID をダブルクォーテーションで囲めるように。
  7. // Nowdoc との違いを明示するのが目的?
  8. &lt;&lt;&lt;"EOM"
  9. hogehoge
  10. EOM
  11. ;
ID

ヒアドキュメントを識別するためのもの。
上記例では、EOD が該当する。

ルール
  • 英数字およびアンダースコアのみ
  • 数字でない文字またはアンダースコアで始まる必要がある
  • 終端 ID がある行には、セミコロン (;) 以外の他の文字が含まれていてはならない
  • ID はインデントしてはならない
  • セミコロンの前に空白やタブを付けてはいけない
  • 終端 ID の前の最初の文字は、使用するオペレーティングシステムで定義された 改行である必要がある
  • 最後の区切り文字の後にもまた、改行を入れる必要がある
;(セミコロン)
  1. $foo = &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD;

よく上記のようなスクリプトを見かけるけど
最後の ;(セミコロン)は、あくまでも $foo = に対するものであって
ヒアドキュメントとは関係ない。

つまり、下記のように記述すればイメージしやすい。

  1. $foo = &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD
  4. ;
文字列部

変数は、そのまま記述すればパースされる。

  1. echo &lt;&lt;&lt;EOT
  2. My name is "$name". I am printing some $foo->foo.
  3. Now, I am printing some {$foo->bar[1]}.
  4. This should print a capital 'A': \x41
  5. EOT;
  6.  
  7. // 出力結果
  8. My name is "MyName". I am printing some Foo.
  9. Now, I am printing some Bar2.
  10. This should print a capital 'A': A

PHP Manual:文字列 変数のパース
これを読んでも、「簡単」と「複雑」の定義がはっきりしないので
全て {}(波括弧、中括弧)を付けるほうが安全かも?

定数や関数

定数や関数は $(ドル)から始まらないので、処理不能・・・?

最初に Google 先生に質問したら、
「定数や関数は使えない」という回答ばっかり引っかかってきたけど
2回目の質問では、アッサリと解決策が。
Blog:PHPのヒアドキュメント内で定数や関数を動かす
Web、ときどきDTP。(うぇヴ(web)屋のネタ帳。):PHPのヒアドキュメント内で関数を使う。計算もしたい。

クラス

クラスを用意して、そのメンバ変数やメソッドとして利用する。

可変変数

定数は、そのまま変数にしてしまえばよい。
関数は、可変変数を用いて処理。

利用

直接出力しても

  1. echo &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD;

変数に代入してもよい。

  1. $foo = &lt;&lt;&lt;EOD
  2. hogehoge
  3. EOD;
Nowdoc

PHP 5.3.0 以降の機能。

ヒアドキュメントはダブルクォーテーションで括られた文字列として扱われるのに対して
Nowdoc は、シングルクォーテーションで括られた文字列として扱われる。

中身について、パース処理を行わないので、エスケープをする必要がなくなる。
SGML の

書式

開始 ID を、シングルクォーテーションで括る。

  1. &lt;&lt;&lt;'EOD'
  2. hogehoge
  3. EOD
  1. echo <<<'EOT'
  2. My name is "$name". I am printing some $foo->foo.
  3. Now, I am printing some {$foo->bar[1]}.
  4. This should not print a capital 'A': \x41
  5. EOT;
  6.  
  7. // 出力結果
  8. My name is "$name". I am printing some $foo->foo.
  9. Now, I am printing some {$foo->bar[1]}.
  10. This should not print a capital 'A': \x41
参考サイト

すたら日記:PHP ヒアドキュメントの使い方:2通り

PHP | 2016-01-16 (土) 10:53:42 |

array_column

Posted by muchag | PHP | 2016-01-13 (水) 21:51:59

array_column は、連想配列群の中から、単一カラムを取り出して配列で返してくれる。

【環境】
PHP: 5.4.7
内容

レコードセットのように、同型の連想配列が連番で格納されているような配列において
各レコードから特定のカラムの値だけを抽出する。

書式

array array_column ( array $input , mixed $column_key [, mixed $index_key = null ] )

php:array_column

第1引数:元配列
第2引数:抽出したいカラム名
第3引数:抽出後キーにしたいカラム名。省略可

  1. $users = Array(
  2.     0 => Array(
  3.         'id' => 'user001',
  4.         'name' => 'tanaka',
  5.     },
  6.     1 => Array(
  7.         'id' => 'user002',
  8.         'name' => 'suzuki',
  9.     },
  10.     2 => Array(
  11.         'id' => 'user003',
  12.         'name' => 'yamada',
  13.     },
  14. );
  15.  
  16. $names = array_column($users, 'name');
  17. print_r($names);
  18.  
  19. // 出力結果
  20. Array(
  21.     0 => 'tanaka',
  22.     1 => 'suzuki',
  23.     2 => 'yamada',
  24. );
  25.  
  26. $names = array_column($users, 'name', 'id');
  27. print_r($names);
  28.  
  29. // 出力結果
  30. Array(
  31.     'user001' => 'tanaka',
  32.     'user002' => 'suzuki',
  33.     'user003' => 'yamada',
  34. );
あれ?

PHP 5.5 から新しく加わった関数。

残念!
私は 5.4.7 だった><

代替

がっかりポンだ~と思っていたら
代替というか、GitHub:array_column/src/array_column.php で関数が提供されていた。
ありがとうございます!

ファイルに保存して、インクルードパスへ配置して
require して、見事動作しました♪

PHP | 2016-01-13 (水) 21:51:59 |

Doctrine -> DISTINCT, LEFT JOIN

Posted by muchag | Symfony 1.x | 2015-12-22 (火) 16:19:36

注意書きを見つけたのでメモ。

【環境】
OpenPNE:3.8.15
Symfony:1.4.13
doctrine:1.2.4
参考サイト

Qiita:DoctrineのDISTINCTは正しく動作しない
→回避策あり

Qiita:DoctrineのLEFT JOINはまともに使えない
→回避策あり

Symfony 1.x | 2015-12-22 (火) 16:19:36 |
次ページへ »