symfony.lockとは?

 

symfonyを使ってるといつの間にか入ってて、更新もされるsymfony.lock。
composer.lockと何が違うのか等、よくわかってなかったので自分なりに調べたことをまとめます。

 

\いろいろまとめてみたんですが、すでに記事ありました!/
こちらの方が断然わかりやすいです!!!
https://zenn.dev/ttskch/articles/13013224b61531

 

symfony.lockには何が書いてある?

composer require symfony/<name> などのコマンドを叩いた時に、必要な環境変数(.env)やconfig/のyamlの追加が自動的にされることがあります。
この履歴がsymfony.lockに記録されています。
doctrine/annotationsといったsymfony/<name>以外の対象もあります。

ちなみに、
composer require symfony/notifierをした時、「config/packages/notifier.yamlを追加する」といった定義(レシピ)はsymfony/recipesによって管理されています。

さらに、
「config/packages/notifier.yamlを追加する」という定義(レシピ)の実行は、symfony/flex(Composer Plugin for Symfony)によって行われています。

composer.lockとの違いは?

  • symfony/recipesに置いてあるどのバージョン(version)のmanifest(レシピの定義)を使っているのかが明記されています。
  • 追加や更新するファイル(files)についても明記されています。
// symfony.lock
{
    "symfony/flex": {
        "version": "2.3",
        "recipe": {
            "repo": "github.com/symfony/recipes",
            "branch": "main",
            "version": "1.0",
            "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172"
        },
        "files": [
            ".env"
        ]
    },
    "symfony/notifier": {
        "version": "6.3",
        "recipe": {
            "repo": "github.com/symfony/recipes",
            "branch": "main",
            "version": "5.0",
            "ref": "c31585e252b32fe0e1f30b1f256af553f4a06eb9"
        },
        "files": [
            "config/packages/notifier.yaml"
        ]
    }
}
// composer.lock
    ...
    "packages": [
        {
            "name": "symfony/flex",
            "version": "v2.3.1",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/flex.git",
                "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/flex/zipball/3c9c3424efdafe33e0e3cfb5e87e50b34711fedf",
                "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf",
                "shasum": ""
            },
            "require": {
                "composer-plugin-api": "^2.1",
                "php": ">=8.0"
            },
            "require-dev": {
                "composer/composer": "^2.1",
                "symfony/dotenv": "^5.4|^6.0",
                "symfony/filesystem": "^5.4|^6.0",
                "symfony/phpunit-bridge": "^5.4|^6.0",
                "symfony/process": "^5.4|^6.0"
            },
            "type": "composer-plugin",
            ...

symfony.lockはsymfony/flexをrequireすると追加される

symfony/flex => Composer plugin for Symfony

$ composer require symfony/flex
...
// ↓↓↓ この辺りがsymfony/flexによって行われている。 ↓↓↓

Symfony operations: 1 recipe (ad5e8d2058412a4be7bb46bf8d4af76c)
  - Configuring symfony/flex (>=1.0): From github.com/symfony/recipes:main

// ↑↑↑ この辺りがsymfony/flexによって行われている。 ↑↑↑

No security vulnerability advisories found
Using version ^2.3 for symfony/flex


$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git restore ..." to discard changes in working directory)
    modified:   composer.json

Untracked files:
  (use "git add ..." to include in what will be committed)
    .env
    composer.lock
    symfony.lock

no changes added to commit (use "git add" and/or "git commit -a")

 

どうなったらsymfony.lockに追加や更新されるか?

symfony/flexがinstall済みで、かつsymfony/recipesで管理されているcomposerパッケージについてcomposer requirecomposer updateをした時のようです。

また、レシピがないパッケージについても以下コマンドでsymfony.lockに追加できます。さらに、既にsymfony.lockに定義されているパッケージについてのバージョンを更新できます。

$ composer recipes:install <vendor>/<package> --force -vた

ただ、レシピがないのにsymfony.lockに定義してるパッケージは何の意味があるのかよくわかっていません🤔 誰か教えてください!

最後に

この記事を書くために、symfony/flexを読みました。Composer pluginの作り方や流れを知ることができたので次の記事で書こうと思います。

参考

CIのComposerバージョンが2になる(composer self-updateさせてた)せいでテストがコケてた話



今回の目標

CIをphp7.4に対応したい
(Herokuでは既に7.4.7だったので)

 

.circleci/config.ymlのimageをcircleci/php:7.4-node-browsers
にしたところ、composer-plugin-apiに関するエラーが発生しました。

Composer2でcomposer installを実行したのに、composer.lockでcomposer-plugin-apiは1系って書いてあるから互換性ないやないかーみたいなこと言ってる、おそらく。Composer2はcomposer-plugin-api2系使えってこと?

($ composer install -n –prefer-dist以下)

$ php --version
PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

$ composer --version
Composer version 2.0.8 2020-12-03 17:20:38

$ composer install -n --prefer-dist
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

Problem 1
- ocramius/package-versions is locked to version 1.4.2 and an update of this package was not requested.
- ocramius/package-versions 1.4.2 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
Problem 2
- symfony/flex is locked to version v1.5.3 and an update of this package was not requested.
- symfony/flex v1.5.3 requires composer-plugin-api ^1.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
Problem 3
- ocramius/package-versions 1.4.2 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
- ocramius/proxy-manager 2.1.1 requires ocramius/package-versions ^1.1.1 -> satisfiable by ocramius/package-versions[1.4.2].
- ocramius/proxy-manager is locked to version 2.1.1 and an update of this package was not requested.

ocramius/package-versions only provides support for Composer 2 in 1.8+, which requires PHP 7.4.
If you can not upgrade PHP you can require composer/package-versions-deprecated to resolve this with PHP 7.0+.

You are using Composer 2, which some of your plugins seem to be incompatible with. Make sure you update your plugins or report a plugin-issue to ask them to support Composer 2.

 

そもそもCircleCIを導入しようとしてましたが、すでにTravis導入済みだったのでCircleCI導入はやめました。すみません💦(ただエラー内容はだいたい一緒だったと思います。)

当時設定していた.travis.ymlのPHPバージョンが7.1~7.3だったので7.4にしようと思います。

ローカルではcomposer1.8系を使っていたのでエラーはみられませんでしたが、
.travis.yamlではbefore_install: composer self-updateにしてたのでcomposer2系でcomposer installを実行しようとしていました。

エラー内容:

xxx/yyy n.n.n requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.

composer.jsonのrequireにcomposer-plugin-api: "^1.0 || ^2.0"を追記で↑のエラーは回避できました!!!

参考:https://github.com/composer/composer/issues/8726

 

[おまけ]composer validate追記したらエラーでた

実際にでてたエラーログです。

$ composer validate
./composer.json is valid for simple usage with composer but has
strict errors that make it unable to be published as a package:
See https://getcomposer.org/doc/04-schema.md for details on the schema
name : The property name is required
description : The property description is required
symfony/debug-pack, symfony/maker-bundle, symfony/profiler-pack, symfony/test-pack are required both in require and require-dev, this can lead to unexpected behavior
require.symfony/debug-pack : unbound version constraints (*) should be avoided
require.symfony/orm-pack : unbound version constraints (*) should be avoided
require.symfony/profiler-pack : unbound version constraints (*) should be avoided
require.symfony/serializer-pack : unbound version constraints (*) should be avoided
require.symfony/test-pack : unbound version constraints (*) should be avoided
require.symfony/twig-pack : unbound version constraints (*) should be avoided

 

1) エラー内容:
xxx/yyy are required both in require and require-dev, this can lead to unexpected behavior

→ requireとrequire-devに同じpackageが書いてあるのがダメみたいなのでrequire-devから重複削除しました。

 

2) エラー内容:
name : The property name is required
description : The property description is required

→ composer.jsonにnameとdescriptionが必要とのことなので、追加しました。

 

3) エラー内容:
require.xxx/yyy: unbound version constraints (*) should be avoided

→ xxx/yyy: "*"はやめるべきとのことなのでバージョン指定をしました。

 

すべて(今回は3つ)のエラーを解消させ、

composer updateでcomposer.lockを更新して再度composer validateするvalidになりました〜🙌

$ composer validate
./composer.json is valid

 

メモ

  • 今回対応での差分

https://github.com/kin29/dj-kin29/pull/10/files

 

 

  • 後々考えてみたら、ローカル環境のcomposerバージョンを2にして、composer updateでcomposer.lockを更新してcommitで良かったのかも😅

composer-plugin-api:^2.0に対応してないpackageだったら、composer.jsonのrequireにcomposer-plugin-api: "^1.0 || ^2.0"追記が必要なのかも。

 



Symfony installerを削除して、Symfony CLI(symfonyコマンド)を入れて使ってみる!

 

お久しぶりです☺️

Symfonyを使っているにもかかわらず、symfonyコマンド使ってないなー
と今更感じたので、この記事を書きます。

 

はじめに

私の場合、Symfony2,3で使っていたSymfony installerを削除する必要がありました。
symfonyというコマンド名でバッテングしてるので、Symfony4からdepricatedになったSymfony installerを削除→Symfony CLIをインストールという手順をしました。
(※ composerを使えば良い話なんですが、symfonyコマンド使ってみたかったので)

Symfony installerが入っている状態

$ symfony

Symfony Installer (1.5.11)
==========================

This is the official installer to start new projects based on the
Symfony full-stack framework.
...

 

ここで、symfony new でプロジェクトを作成しようとすると、
Symfony InstallerはSymfony4から互換性(compatible)なくなったよーって言われました。
また、Symfony4から代わりにcomposer create-project symfony/skeleton [my_project_name]を使ってねーって言ってます。

$ symfony new my_project
PHP Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in phar:///usr/local/bin/symfony/vendor/guzzlehttp/ringphp/src/Client/CurlFactory.php on line 363
PHP Stack trace:

...

[RuntimeException]
The Symfony Installer is not compatible with Symfony 4.x or newer versions.
Run this other command to install Symfony using Composer instead:
composer create-project symfony/skeleton my_project

一瞬、Symfony4からsymfonyコマンドなくなった?って思いましたが、Symfony4.4のBestPracticeでしっかり使っているので、少し混乱しました😅
参考:

 

SymfonyInstallerを削除して、SymfonyCLIをinstallする。

あまり良くない消し方な気がしますが、以下の方法でSymfonyInstallerを消しました。

$ ls -al ~/.symfony
total 0
drwxr-xr-x 3 watashi staff 96 4 4 20:51 .
drwxr-xr-x+ 118 watashi staff 3776 4 20 18:45 ..
drwxr-xr-x 3 watashi staff 96 4 21 09:23 bin
$ ls -al /usr/local/bin/symfony
-rwxr-xr-x 1 watashi staff 246243 7 4 2019 /usr/local/bin/symfony
$ rm -rf ~/.symfony
$ rm -rf /usr/local/bin/symfony
$ symfony -V
-bash: /usr/local/bin/symfony: No such file or directory

そして、SymfonyCLIをインストールします🚀

$ curl -sS https://get.symfony.com/cli/installer | bash
Symfony CLI installer

Environment check
[*] cURL is installed
[*] Gzip is installed
[*] Git is installed
[*] You architecture (amd64) is supported

Download
Finding the latest version (platform: "darwin_amd64")...
Downloading version 4.14.1 (https://github.com/symfony/cli/releases/download/v4.14.1/symfony_darwin_amd64.gz)...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 636 100 636 0 0 1311 0 --:--:-- --:--:-- --:--:-- 1311
100 7909k 100 7909k 0 0 878k 0 0:00:09 0:00:09 --:--:-- 1443k
Uncompress binary...
Making the binary executable...
Installing the binary into your home directory...
The binary was saved to: /Users/watashi/.symfony/bin/symfony

The Symfony CLI v4.14.1 was installed successfully!

Use it as a local file:
/Users/watashi/.symfony/bin/symfony

Or add the following line to your shell configuration file:
export PATH="$HOME/.symfony/bin:$PATH"

Or install it globally on your system:
mv /Users/watashi/.symfony/bin/symfony /usr/local/bin/symfony

Then start a new shell and run 'symfony'

$ mv /Users/watashi/.symfony/bin/symfony /usr/local/bin/symfony

うぉー!Symfony CLIが入りましたー!!! 🎉

$ symfony
Symfony CLI version v4.14.1 (c) 2017-2020 Symfony SAS
Symfony CLI helps developers manage projects, from local code to remote infrastructure

These are common commands used in various situations:

Work on a project locally

new Create a new Symfony project
serve Run a local web server
server:stop Stop the local web server
security:check Check security issues in project dependencies
composer Runs Composer without memory limit
console Runs the Symfony Console (bin/console) for current project
php, pecl, pear, php-fpm, php-cgi, php-config, phpdbg, phpize Runs the named binary using the configured PHP version

Manage a project on Cloud

login Log in with your SymfonyConnect account
init Initialize a new project using templates
link Link current git repository to a SymfonyCloud project
projects List active projects
envs List environments
env:create Create an environment
tunnel:open Open SSH tunnels to the app's services
ssh Open an SSH connection to the app container
deploy Deploy an environment
domains List domains
vars List variables
user:add Add a user to the project

Show all commands with symfony help,
Get help for a specific command with symfony help COMMAND.

 

Symfony CLIを使ってみる

プロジェクトを作成してみます。
今回は、webアプリケーションを作ってみます。
composer create-project symfony/website-skeleton [project_name]git initをしていることがわかります。

$ symfony new symfony_command_test_web_app --full
* Creating a new Symfony project with Composer
  (running /usr/local/bin/composer create-project symfony/website-skeleton /Users/watashi/symfony_command_test_web_app)

* Setting up the project under Git version control
  (running git init /Users/watashi/symfony_command_test_web_app)


 [OK] Your project is now ready in /Users/watashi/symfony_command_test_web_app


 

symfony server:startを使ってローカルサーバを立てて、ブラウザを確認してみると…いい感じにSymfony5.0.8のwelcomeページが表示されましたー!🍺

$ symfony server:start

 [WARNING] run "symfony server:ca:install" first if you want to run the web server with TLS support, or use
 "--no-tls" to avoid this warning


Apr 29 11:13:01 |DEBUG| PHP    Reloading PHP versions
Apr 29 11:13:01 |DEBUG| PHP    Using PHP version 7.3.11 (from default version in $PATH)
Apr 29 11:13:01 |INFO | PHP    listening path="/usr/sbin/php-fpm" php="7.3.11" port=55287
Apr 29 11:13:01 |DEBUG| PHP    started
Apr 29 11:13:01 |INFO | PHP    'user' directive is ignored when FPM is not running as root
Apr 29 11:13:01 |INFO | PHP    'group' directive is ignored when FPM is not running as root
Apr 29 11:13:01 |INFO | PHP    fpm is running, pid 3483
Apr 29 11:13:01 |INFO | PHP    ready to handle connections

 [OK] Web server listening
      The Web server is using PHP FPM 7.3.11

      http://127.0.0.1:8000

 

symfony server:ca:installをしたら、TLSで確認できるらしいので、入れてみる🔐
を「https://」になったー!ブラウザもちゃんとみれる👀

$  symfony server:start
Apr 29 11:29:01 |DEBUG| PHP    Reloading PHP versions
Apr 29 11:29:02 |DEBUG| PHP    Using PHP version 7.3.11 (from default version in $PATH)
Apr 29 11:29:02 |INFO | PHP    listening path="/usr/sbin/php-fpm" php="7.3.11" port=55368
Apr 29 11:29:02 |DEBUG| PHP    started
Apr 29 11:29:02 |INFO | PHP    'user' directive is ignored when FPM is not running as root
Apr 29 11:29:02 |INFO | PHP    'group' directive is ignored when FPM is not running as root
Apr 29 11:29:02 |INFO | PHP    fpm is running, pid 12395
Apr 29 11:29:02 |INFO | PHP    ready to handle connections

 [OK] Web server listening
      The Web server is using PHP FPM 7.3.11

      https://127.0.0.1:8000

 

さいごに

今までは、composerでプロジェクトを作って、php -S 127.0.0.1:8880 -t public/でブラウザ確認をしていたので、symfonyコマンドの方が短いので使って楽したほうがいいなーと思いました。

 

npxで電子名刺つくってみた!

 

先週、Nagoya.php#17でLTをしていた方がnpxを使った電子名刺で自己紹介をしていて、

めちゃくちゃカッコよくて真似して作ってみました!

 

 

ターミナルで

$ npx kin29

を打つと以下スクショのように情報がでるようにしました!

追記(2022/09/10):使う機会がないので非公開&削除しました😅

business-card

 

 

仕組み

npx <user-name>を実行すると、

該当のnpmパッケージを落としてきて、package.jsonにある"main": "/bin/card.js"を実行する(テキストファイルをconsole.logする)とのこと。

package.json

{
...
  "main": "/bin/card.js",
  "bin": {
    "kin29": "./bin/card.js"
  },
...
  "scripts": {
    "prepublish": "npm run build",
    "build": "node build.js",
    "dev": "npm run build && node ./bin/card.js",
    "lint": "standard",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
...

"scripts"にあるように、build.jsを自分用に修正をして、
npm run buildすると、出力ファイルである./bin/outputができます。
npm run dev で、 npx * のシュミレーションができます。

bin/card.js

#!/usr/bin/env node
// 👆 Used to tell Node.js that this is a CLI tool

'use strict'

const fs = require('fs')
const path = require('path')
const output = fs.readFileSync(path.join(__dirname, 'output'), 'utf8')
console.log(output)  // bin/output に出力テキストがある

 

そもそも、npxとは?

公式サイト:https://www.npmjs.com/package/npx

npm5.2.0以上が導入されていれば、npxコマンドも使えるそうです。

指定されたnpmパッケージがローカルに存在しない場合には、インストールをしてコマンド実行するものだそうです。

npmと違うのは、たとえローカルにインストールされていなくてインストールすることになっても、一時的にしかインストールせず実行後は削除されるらしいです。

ローカルを汚さずにすみますね😄

 

npmとnpxを比較してみた💡

● npm

:~/test-npm$ ls //まだローカルには何もない

:~/test-npm$ npm install eslint
...
+ eslint@6.3.0
added 119 packages from 75 contributors and audited 176 packages in 5.246s
found 0 vulnerabilities

:~/test-npm$ ls   //ローカルにインストールされた!
node_modules package-lock.json

:~/test-npm$ node_modules/.bin/eslint --version
v6.3.0

●npx

:~/test-npx$ ls

:~/test-npx$ npx eslint --version
npx: 119個のパッケージを4.678秒でインストールしました。
v6.3.0

:~/test-npx$ ls //ローカルにインストールされてないよ^^

 

npmに公開する

npxを使った電子名刺を公開するためには、npmで公開する必要があります。

やりかた

  1. https://www.npmjs.com/ にアカウントを登録する。
  2. $ npm adduser でログイン(1の登録情報を使う)する。
  3. GitHubリポジトリを作成し、masterにpushする。
  4. $ npm publish でnpmに公開をする。
    // タグをつけてpushする。
    $ git tag -a v1.0.0
    $ git push origin tags/v1.0.0
    
    // npmに公開する。
    $ npm publish ./
  5. npx <user-name> を試して、確認する。

 

さいごに

composerにもnpxみたいな機能ないんかな?って思って、

「composer npx」でググったら、https://github.com/composer/composer/issues/7272

↑でなんか、あるよー的な雰囲気なことを書いてると私の英訳力では感じたのですが、本当にできるのかよくわからんです 😅

 

 

 

参考:

[Qiita]npm 5.2.0の新機能!「npx」でローカルパッケージを手軽に実行しよう

[Qiita]npxでnodeモジュールを実行する

[Qiita]初めてのnpm パッケージ公開

 

Composerでrequireしたときのエラー解決法

 

どうも!名古屋生活満喫してます。
大須が好きで毎週行ってしまってます。
ただ、友達がいないので一人で大体いってますw
名古屋で遊んでくれる友達欲しい。。。

今回の記事は、
PHPerなら、とても助かっているであろうComposerについてです。
いろんなパッケージ使おうとrequireしてたら、なんか導入できない!
英語でわかわからんってなって諦めてました。
そろそろ次に進めなければと思い、私が問題解決を行った方法をまとめます。

 

composerコマンドだけで、できる方法はありそうなので見つけたら教えてください!
私も見つけたら書きます\(^^)/

 

Composerとは…

公式サイト:https://getcomposer.org/

PHPで何かを作るときに、
既存のライブラリやパッケージを導入/更新するときに使います。
そのとき、依存管理もしてくれるツールです。
JavaScriptでいうnpm的なやつだと思っています。

Composerの公式サイトに飛んだときに気づいたのですが、
ロゴのおじさん、いろんなカラーパターンがある!!!
リロードするたびに変化するのでぜひ遊んでみてください!

composer_uncle

(多分5パターン)

 

 

本題に入ります。

例えばこんな例

hautelook/alice-bundleをdev環境に導入する時….
下記のエラーで導入できなかった例です。

$ composer require hautelook/alice-bundle --dev
Using version ^2.5 for hautelook/alice-bundle
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for hautelook/alice-bundle ^2.5 -> satisfiable by hautelook/alice-bundle[2.5.0].
    - hautelook/alice-bundle 2.5.0 requires doctrine/orm ^2.5.11 -> satisfiable by doctrine/orm[2.5.x-dev, 2.6.x-dev, 2.7.x-dev, v2.5.11, v2.5.12, v2.5.13, v2.5.14, v2.6.0, v2.6.1, v2.6.2, v2.6.3] but these conflict with your requirements or minimum-stability.


Installation failed, reverting ./composer.json to its original content.

 

日本語でざっくり訳すと(わたしの解釈です)

hautelook/alice-bundleのv2.5.0(バージョン指定してないので最新版をインストールしようとします)は、
doctrine/ormのv2.5.0以上が必要です。

 

 

ということは、doctrine/ormが今v2.5.0以下なんです。
いざ、確認!!!

$ composer show doctrine/orm    //導入中のpackage(doctrine/orm)詳細を表示
name     : doctrine/orm
descrip. : Object-Relational-Mapper for PHP
keywords : database, orm
versions : * v2.4.7
...

 

エラー警告通りで、doctrine/ormのバージョンは、2.5.0以下の2.4.7でした。
ということで、現状のパッケージ群のままでhautelook/alice-bundleを導入する想定で問題解決していきたいと思います。

そんなとき使うのが、「packagist 」です!
packagistでは、composerで導入できるパッケージ群が管理されていて検索ができてバージョンごとの詳細も確認できます。

そこで導入したいパッケージ(hautelook/alice-bundle)を検索して、左側のバージョン選択欄からバージョンを下げながら見ていって、
導入ができない原因のパッケージ(doctrine/orm)のバージョン(現在v2.4.7)が通る導入したいパッケージ(hautelook/alice-bundle)のバージョンを見つけます。

\日本語下手でごめんなさい…/

packagist検索結果

 

この方法により
hautelook/alice-bundlev1.4.1であれば、
doctrine/orm: ^2.4doctrine/ormv2.4以上なので
導入できることがわかりました!

 

したがって、hautelook/alice-bundleを最新版ではなくv1.4.1をバージョン指定で導入してみます。

$ composer require hautelook/alice-bundle:1.4.1 --dev
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing fzaninotto/faker (v1.8.0): Downloading (70%)
  ....

いけましたー!!!

$ composer show hautelook/alice-bundle
name     : hautelook/alice-bundle
descrip. : Symfony2 Bundle to manage fixtures with Alice and Faker.
keywords : Fixture, alice, faker, orm, symfony
versions : * v1.4.1
...

 

便利なComposerコマンド一覧

参考:https://qiita.com/KEINOS/items/86a16b06af6e936a1841

インストール済みのパッケージ情報の一覧を取得

$  composer show -i
You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.
...
phpunit/phpunit                    7.5.12   The PHP Unit Testing framework.

 

パッケージ名指定もできます。

$ composer show [vendor]/[package]
$ composer show phpunit/phpunit
name     : phpunit/phpunit
descrip. : The PHP Unit Testing framework.
keywords : phpunit, testing, xunit
versions : * 7.5.12
type     : library
license  : BSD 3-Clause "New" or "Revised" License (BSD-3-Clause) (OSI approved) https://spdx.org/licenses/BSD-3-Clause.html#licenseText
source   : [git] https://github.com/sebastianbergmann/phpunit.git 9ba59817745b0fe0c1a5a3032dfd4a6d2994ad1c
dist     : [zip] https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9ba59817745b0fe0c1a5a3032dfd4a6d2994ad1c 9ba59817745b0fe0c1a5a3032dfd4a6d2994ad1c
path     : /path/vendor/phpunit/phpunit
names    : phpunit/phpunit
...

 

まとめ

英語のエラーって怖いって思いがちですが、
問題解決方法だったりヒントを表示してくれるだけでほんと助かるなーって気持ちに改めてなりました。

複数チケットサービス検索用ライブラリを作って、はじめてのpackagist登録

どうもー!
5月なのに暑いですね、そして梅雨こないですねー
宮崎にも来る気配なしです。

 

今日も音楽フェスに行くのですが、
皆さん、チケットを取る際にどのチケット販売サービスを使っていますか?
どういう基準で選んでますか?
ポイントだったり会員ランクなどてしょうか。

 

入手困難なバンドなんかだと、
私の経験でよくあるのがA,Bというサービスではsold outにもかかわらず、
Cでは残りわずかで残っていたりするのです。
ありがたく即購入するんですが、
この事実に辿りつくまで、
サービスAで検索→sold outを確認
→サービスBで検索→sold outを確認
→サービスCで検索→残りわずかを確認
→嬉し恥ずかし焦る気持ちを抑える
→無事ゲット!!!(ゴール)

ゴールに行くまで3サイトも順番に回るのです。
順番や早さによっては、
先に早く見ておけば取れたかもしれないチケットを
失ってしまうのです。
そんな自分の経験から、複数サービス
(現在チケットぴあ、eplus、ローチケ)を
一括検索できるライブラリを作りました!
スクレイピングを使ってるので、
リニューアルとかされると困りますw

Github→kin29/ticket-hunter

 

Packagistにも登録済みですので、

$ composer require kin29/ticket-hunter

からも取得可能でございます。

 

今回、Packagistへの登録を初めてしました!

こちらを参考にさせてもらいました。

https://qiita.com/niikunihiro/items/fbd696e506e734782d8f

6. GithubのサービスフックにPackagistを登録する

は、自動になったのか勝手に登録された気がしました。

 

 

使い方は、簡単です!

  • 使いたい販売サービス名(TicketPia/Eplus/LawsonTicketのどれか、複数指定可)
  • キーワード(「雨のパレード」など)

を渡すだけです。

<?php

try {
  $ticketVendors = new Kin29\TicketHunter\TicketHunter(['TicketPia', 'Eplus', 'LawsonTicket'], '雨のパレード');
  $ticketVendors->echoJson($ticketVendors->getList());
} catch (\Exception $e) {
    die($e->getMessage());
}

出力結果はこんな感じです。

{
  "TicketPia": [
    {
      "title": "GRAPEVINE/雨のパレード〔愛知〕",
      "date_time": "2019/8/2(金)",
      "pref_id": "23",
      "pref_name": "愛知県",
      "stage": "名古屋クラブクアトロ",
      "sale_method": "先行抽選",
      "sale_status": "近日抽選受付2019/6/8(土) 10:00 ~ 2019/6/10(月) 18:00",
      "link": "http://ticket.pia.jp/pia/ticketInformation.do?eventCd=1922500&rlsCd=&lotRlsCd=27947"
    },
    ...
  ],
  "Eplus": [
    {...省略...},
  ],
  "LawsonTicket": [
    {...省略...},
  ]
}

販売前の場合、販売開始日を取得できるといいな
と今気づきました、issueに入れておこう!
日付のフォーマットも入れてないな、、、入れよう。
アウトプットしてると気づくことて多いですよね、大切。

 

このライブラリを作っていた矢先、先を越されたかのように、
Freaxがリリースれました、、便利ですね。

内容が被っていますが、ライブラリはなさそうなので作り続けました^^;

 

今後は、このライブラリを使ってAPIを作りたいなとおもっています。
BearSundayでまた作りたいなあと思っております。
さらに、検索フォームをSymfonyで作ろうかと思っています。

 

怠けないように宣言しておきます!

では、森道市場2019行ってきます!

 

 

php-cs-fixerとphp_codesnifferの違いって?

 

サボり気味でした。。。
五月病ですね、気引き締めます。
ネタもちょっと尽きてきた感ありますが、頑張ります!

 

コード整形系のツール

  • php-cs-fixer
  • php_codesniffer

って大変お世話になるんですが、
名前が似すぎて同じものだと思っていました。
なのでちょっと違いを調べてみました。

 

おまけで、

  • phpmd/phpmd
  • phpstan/phpstan-shim

についても、書きました!

 

php-cs-fixer

[friendsofphp/php-cs-fixer]

.php_cs/.php_cs.dist(ルール設定ファイル)に沿って、
PHPコードの修正を提示してくれたり、修正を実行してくれる。

 

(例)配列の書き方はshortに統一することを宣言

.php_cs.dist

...
'array_syntax' => ['syntax' => 'short'],
...

実行結果

// コード修正の提示
$ vendor/bin/php-cs-fixer fix -v --dry-run
Loaded config default from "/Users/XXXX/ticket-hunter-api/.php_cs.dist".
Using cache file ".php_cs.cache".
SSSSSSSFSSSSS
Legend: ?-unknown, I-invalid file syntax, file ignored, S-Skipped, .-no changes, F-fixed, E-error
1) src/test.php (array_syntax)

以下のように、書き直すことで S-Skipped となり解消されます。

-        $arrRet = array();
+        $arrRet = [];

 

 

ただし、実行結果の出力より対象ファイル名は分かりますが、
何行目かなどの詳細はわかりません。
そこで、修正の実行もしてもらう事もできます。「–dry-run」を外すだけです。

$ vendor/bin/php-cs-fixer fix -v --dry-run

 

 

さらに、.php_cs.distでルールを設定する際、
各ルールの具体例みたいなーって時は、以下コマンドで確認できます。

$ vendor/bin/php-cs-fixer describe [name]
$ vendor/bin/php-cs-fixer describe array_syntax
Description of array_syntax rule.
PHP arrays should be declared using the configured syntax.

Fixer is configurable using following option:
* syntax ('long', 'short'): whether to use the `long` or `short` array syntax; defaults to 'long'

Fixing examples:
 * Example #1. Fixing with the default configuration.
   ---------- begin diff ----------
   --- Original
   +++ New
   @@ -1,2 +1,2 @@
    <?php
   -[1,2];
   +array(1,2);

   ----------- end diff -----------

 * Example #2. Fixing with configuration: ['syntax' => 'short'].
   ---------- begin diff ----------
   --- Original
   +++ New
   @@ -1,2 +1,2 @@
    <?php
   -array(1,2);
   +[1,2];

   ----------- end diff -----------

 

 

 

php_codesniffer

[squizlabs/php_codesniffer]

phpcs(PHP Code Sniffer) …判定
phpcbf(PHP Code Beautifier and Fixer) …整形

既定のコーディング標準として用意されているもの(vendor/bin/phpcs -i)をベース
に判定/整形を行う。

phpcs.xml(設定ファイル)にexclude(除外)するものや追加ルールを記載し、カスタマイズすることが可能です。

 

//現在、デフォで適用されているコーディング規約の確認
$ vendor/bin/phpcs -i
The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1 and PSR12

 

例えば、既定のコーディング標準のままだとPEARはfunctionコメントが必須なので、
phpcs.xmlでexcludeする定義を書いたりしてカスタマイズすることができます。

phpcs.xml の例

<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="PHP_CodeSniffer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/squizlabs/php_codesniffer/phpcs.xsd">
 <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter"/>
 <rule ref="PEAR.Commenting.FunctionComment">
 <exclude name="PEAR.Commenting.FunctionComment.MissingReturn"/>
 <exclude name="PEAR.Commenting.FunctionComment.MissingParamComment"/>
 <exclude name="PEAR.Commenting.FunctionComment.SpacingBeforeTags"/>
 <exclude name="PEAR.Commenting.FunctionComment.MissingParamTag"/>
 <exclude name="PEAR.Commenting.FunctionComment.Missing"/>
 <exclude name="PEAR.Commenting.FunctionComment.ParameterCommentsNotAligned"/>
 </rule>
</ruleset>

 

実行方法

$ vendor/bin/phpcs [適用コーディング(--standard=PSR2とか)] [対象ファイル名]
$ vendor/bin/phpcbf [適用コーディング(--standard=PSR2とか)] [対象ファイル名]

 

phpcs.xmlに沿って、src/以下を判定してもらう。

$ vendor/bin/phpcs --standard=phpcs.xml src

FILE: /Users/XXXX/YYY/src/test.php
----------------------------------------------------------------------
FOUND 0 ERRORS AND 2 WARNINGS AFFECTING 1 LINE
----------------------------------------------------------------------
 9 | WARNING | The method parameter $arrString is never used
 9 | WARNING | The method parameter $arrRet is never used
----------------------------------------------------------------------

Time: 57ms; Memory: 6MB

使われていないメソッドの引数があるよーって教えてくれました。

 

phpcbfでフォーマットしてもらう例は以下です。

$ vendor/bin/phpcbf --standard=PEAR src

PHPCBF RESULT SUMMARY
-----------------------------------------------------------------------------
FILE                                                         FIXED  REMAINING
-----------------------------------------------------------------------------
/Users/XXXX/YYY/src/test1.php                                 7      10
/Users/XXXX/YYY/src/test2.php                                 2      5
/Users/XXXX/YYY/src/test3.php                                 2      8
-----------------------------------------------------------------------------
A TOTAL OF 11 ERRORS WERE FIXED IN 3 FILES
-----------------------------------------------------------------------------

 

 

ついでに、、、

phpmd

[phpmd/phpmd]

phpmd.xml(ルール設定ファイル)に沿って、
「ここに使われてない変数あるよ」や、
「コンストラクタ関数が__constractじゃなくてclassnameで宣言されてるやつはダメよ」とか、「ここキャメルケースになってないよ」とかの注意をしてくれる。
若干、phpcsなどとルール設定がかぶる可能性はありそうです。

 

phpmd.xml の例

...
 <!--naming-->
 <rule ref="rulesets/naming.xml/ConstantNamingConventions"/>
 
 <!--unusedcode-->
 <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter"/>
 <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable"/>
 <rule ref="rulesets/unusedcode.xml/UnusedPrivateField"/>
 <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod"/>
 
 <!--controversial-->
 <rule ref="rulesets/controversial.xml/CamelCaseClassName"/>
 <rule ref="rulesets/controversial.xml/CamelCasePropertyName"/>
 <rule ref="rulesets/controversial.xml/CamelCaseMethodName"/>
...

 

実行方法

$ phpmd [file_path] [結果出力フォーマット(text/xml)] [ルール設定ファイル]
$ vendor/bin/phpmd src/TicketHunter.php text phpmd.xml

./Users/XXX/YYY/src/test.php:9 Avoid unused parameters such as '$arrString'
./Users/XXX/YYY/src/test.php:9 Avoid unused parameters such as '$arrRet'

 

 

phpstan

phpstan/phpstan-shim

静的解析ツールで、
– 構文エラーはないか?
– 関数に渡すパラメータの数が適切か?
– 未定義のものにアクセスしようとしていないか?
– 関数に渡す値が関数のパラメータの型宣言と一致するか?
– PHPDocの内容と関数の戻り値は同じか?
などをチェックしてくれます。

除外したいルールがあればphpstan.neonで設定のカスタマイズできるようです。

$ vendor/bin/phpstan analyse -l [レベル] [ファイルパス] -c phpstan.neon

レベルは0~7,maxがあり、レベルが高くなるにつれて厳しくチェックしてくれるとのことです。
またオプションで「–no-progress」を付与すると、進捗を表すバーを非表示にしてくれます。
その他詳細は $ vendor/bin/phpstan analyse -h で確認ができます。

 

$ vendor/bin/phpstan analyse -l max src tests -c phpstan.neon --no-progress
 ------ ----------------------------------
  Line   src/test1.php
 ------ ----------------------------------
  11     Undefined variable: $arrString
 ------ ----------------------------------


 [ERROR] Found 1 errors

参考:https://qiita.com/qiita_masaharu/items/24bf34579119628eefe2

 

 

 

まとめ

各ツールでルール設定が異なっている場合、
(変数名をphpcsではキャメルケース、phpmdではスネークケースを許容している等)
phpcsでは判定が通るけど、phpmdでは判定が通らない
ということが起きかねないなと感じました。
なので、ガチガチにルールを決めちゃうのも
手間がかかるし結構大変だなと思いました。

私はこちらをよく使わせてもらってます。
[Koriym.PhpSkeleton]

 

 



PHP7.3からbreakの代わりにcontinueを使うとWarningになる。

最近PHP7.3にしました!
すると、以下のエラーで大好きなcomposerが使えなくなりました。

 "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?  

Google翻訳さんを使って、
「continue」ターゲティングスイッチは「break」と同じです。 “continue 2″を使用するつもりでしたか?
的なことをいってるみたいだなとわかりました。

 

( 解決策はQiitaに書いてます! )

composer installができなくなった時の解決法(PHP7.3)

 

 

そこでまず、
▶︎PHP7.3から、continueをbreakの代わりに使うと、Warningになる?
▶︎continue 2とは?使ったことない!
と私は直感で思いました。

 

 

よくわからなかったので、

とりあえず、やってみます。

参考:https://blog.ohgaki.net/php-7-3#continue

$ php -v
PHP 7.3.1 (cli) (built: Jan 10 2019 13:15:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies

 

test_continue.php

<?php
//$month = 1;を想定

for ($day = 1; $day <= 31; $day++) {

    $message = "{$day}日は、";
    switch ($day) {
        case 1:
            $message .= "月初\n";
            continue;  //break;と同じらしい
        case 15:
            $message .= "月のど真ん中\n";
            continue;
        case 31:
            $message .= "月末\n";
            continue;
        default:
            $message .= "なんともいえない日\n";
            continue;
    }

    echo $message;
}

 

いざ、実行!

$ php test_continue.php 
PHP Warning:  "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /Users/kin29/php7_3/test_continue.php on line 11
...
/Users/kin29/php7_3/test_continue.php on line 14
...
/Users/kin29/php7_3/test_continue.php on line 17
...
/Users/kin29/php7_3/test_continue.php on line 20
1日は、月初
2日は、なんともいえない日
...
15日は、月のど真ん中
16日は、なんともいえない日
...
31日は、月末

やはり、warningでてますねえ。
おっしゃる通りにcontinue→breakにしてみる。

test_break.php

<?php

//$month = 1;を想定

for ($day = 1; $day <= 31; $day++) {

    $message = "{$day}日は、";
    switch ($day) {
        case 1:
            $message .= "月初\n";
            break;  //continue;と同じ動作をするはず
        case 15:
            $message .= "月のど真ん中\n";
            break;
        case 31:
            $message .= "月末\n";
            break;
        default:
            $message .= "なんともいえない日\n";
            break;
    }

    echo $message;
}

breakで実行すると、
warningも出ず、continueの時と同じ挙動のようです!!!

$ php test_break.php 
1日は、月初
2日は、なんともいえない日
...
15日は、月のど真ん中
16日は、なんともいえない日
...
31日は、月末

そもそも、switchには普段からbreak使ってます。
なんとなくcontinueを使わず、break使ってましたが、それが正しいようです。

ではcontinueの使い時は?continue 2とは?
の確信につきたいと思います。

 

test_continue_2.php

<?php 

//$month = 1;を想定

for ($day = 1; $day <= 31; $day++) {

    $message = "{$day}日は、";
    switch ($day) {
        case 1:
            $message .= "月初\n";
            break;
        case 15:
            $message .= "月のど真ん中\n";
            break;
        case 31:
            $message .= "月末\n";
            break;
        default:
            $message .= "なんともいえない日\n";
            continue 2; //抜けるループのレベル指定
    }

    echo $message;
}

 

さっそく実行!

$ php test_continue_2.php 
1日は、月初
15日は、月のど真ん中
31日は、月末

continueに引数を使うと、抜けるループレベルが指定できるようです。
今回の例でいくと、breakやcontinue(引数なし)ではswitch文しか抜けません。
ただし、continue 2(引数あり)とするとfor文からも抜けだすことができます。

 

まとめ

breakとcontinue(引数なし)は同じ意味なのに、別で存在しているので統一させたい。
あんど、continueは引数ありで使うべきと言いたいんでしょうか。
(そう私は解釈しました。)

stripe決済をフレームワーク使わずに組み込んでみる!(PHP)

こんにちは!
過去に簡単決済「stripe」を導入してみる。を紹介しました。
今更気づいたんですが、べつにLaravel使う必要なかったなって(笑)
ただ、使いたかったんだと思います!ww

そこで!
PHPのフレームワークを使わないパターンで
もっとシンプルに組み込みたいと思います。

完成は、こちらです。
[ kin29/stripe_practice_php ]
↑だと、.envの設定だけで
ビルドインサーバ立てたら、もうできちゃいます。

 

さあ、つくろう。

リファレンス

stripe API
Card Payments Quickstart
ほぼ、↑のクイックスタートをやってます。

環境

– Mac
– PHP7.2.7

準備

stripeアカウント発行、テスト環境申請(申請後すぐできました)
↑これだけ!

手順

1.プロジェクト(作業ディレクトリ)の作成

~$ mkdir stripe_practice_php/

 

2.stripe/stripe-phpの導入 ←composer経由

$ cd stripe_practice_php/
$ composer require stripe/stripe-php
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Using version ^6.20 for stripe/stripe-php
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing stripe/stripe-php (v6.20.0)
    Downloading: 100%
Writing lock file
Generating autoload files

$ ls
composer.json composer.lock vendor

 

3.カード情報入力フォームをつくる。

$ cd stripe_practice_php/
$ vi index.php
...
<div class="content">  
  <div class="title">stripe DE おかいもの</div>
  <div>¥100</div>
    <form action="./payment.php" method="POST">
    <script
       src="https://checkout.stripe.com/checkout.js"
       class="stripe-button"
       data-key="{pk_test_XXXXXXXXXXXXXXXXXXX}"
       data-amount="{商品の値段}"
       data-name="{カード入力モーダルのタイトル}"
       data-description="{カード入力モーダルのタイトル下の説明文}"
       data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
       data-locale="auto"
       data-currency="jpy">
    </script>
  </form>
</div>
...

 

 

4.バックエンドをつくる。

$ cd stripe_practice_php/
$ vi payment.php
<?php
require __DIR__.'/vendor/autoload.php';

\Stripe\Stripe::setApiKey("{sk_test_XXXXXX}"); 

$token = $_POST['stripeToken']; //ここでAPIにリクエストしてる
   
$charge = \Stripe\Charge::create([
    'amount' => 100,
    'currency' => 'jpy',  //usd(ドル)→jpy(円)に変更しました。
    'description' => 'Example charge',
    'source' => $token,
]);
    
//thanks.phpにリダイレクトさせる。
header("Location: ./thanks.php");

 

5.サンクスページをつくる。

$ cd stripe_practice_php/
$ vi thanks.php
...

<div class="content">
   <div class="title">「stripe DE おかいもの」<br>ご利用TEGEありがとうございました。</div>
   <div>利用金額:¥100</div>
  </form>
</div>

...

 

6.完成! →実際に動かしてみる「http://localhost:8080/index.php

$ cd stripe_practice_php/
$ php -S localhost:8080   //ビルドインサーバを立てる

※テスト用のカード番号の参考はこちら
https://stripe.com/docs/testing#cards

 

7.管理画面をみてみる。 →実際にみせちゃう
https://dashboard.stripe.com/test/dashboard

 

‘currency’ => jpy

に変更することにより、
円請求ができますが、管理画面ではドルに換算されていました。

 

まとめ

・簡単!早い!わかりやすい!

・ドキュメントは英語ですが、読みやすく充実してます。

・リンク型なので、面倒なトークン化(カード情報非保持)対応の必要なし!

・次は、PHP以外の言語でもしてみたいです!

簡単決済「stripe」を導入してみる。

 

どうも、
先週、#JP_Stripes in 宮崎 キックオフに行ってきました!

Stripe自体は聞いたことはありましたが、
使い方やできることは全く知らなかったので、
事例など交え、とてもいい話を聞くことができました。

もくじ

stirpeのいいところ

– 初期費用不要
– 申請は契約書いらず、ペーパレス。申請〜導入までが速い!
– Apple Pay / Google Pay / 他通貨決済も導入可
– cloud (AWS) →Saasだから保守が楽
APIリファレンスがある!PHP,Ruby,Node,Go,Python対応
– クレジットカード情報「非保持化」及び「PCI DSS(準拠)」してる
↑リンク型みたいな感じの認識です。

申請は、ほぼどんなものでも通るものの、
途中で止められることもあるとのこと。
物として実在するか形に残るもののほうがいいらしいです。

stripeのいろんな機能

– sigma …sqlでデータの検索ができる
– rader …機械学習を使って怪しい人を見つけてくれる。自分でカスタムパターンもいれることができる。
– billing…定期購入に対応。

stripeの導入をやってみる!

参考:
Stripe API Reference

<導入環境>
– PHP 5.6.30
– Laravel 5.2

PHP5.6.4以上だったら、Laravel5.4いけたんですが、、、
ローカルを更新するの諦めました^^;

localは非sslでもおkです!
テスト環境のアカウントは申請直後にできました。

Githubにソース置いてます。
[ kin29/stripe_practice_laravel ]
↑ここには、ほぼcomposer installだけでできるもの置いてます。

以下では、
どうやって最初作ったか、忘れないように、
Laravel/stripeの構築の仕方memoっときます。

 

1.プロジェクト作成

$ composer create-project laravel/laravel stripe_practice_laravel --prefer-dist "5.2.*"

–prefer-distなので、指定なしのデフォルトのgit clone でなく
zipで取ってくる(git clone より高速です)

 

2.stripe/stripe-phpの導入

// $composer require [package name]:[version]
$ composer require stripe/stripe-php:^6.17

 

3.フロント系いらんので消しました。

(package.json/gulpfile.jsとか)

 

4.envの調整
DBとか使わないので、stripeのAPIキーを環境変数として追記のみ

.env

STRIPE_PUBLIC_KEY=test
STRIPE_SECRET_KEY=test

 

5.カード情報入力フォームをつくる。
resources/views/welcome.blade.phpにthanksへのformを追記
参考:Card Payments Quickstart

 

6.バックエンドをつくる
app/Http/route.phpに以下を追記

Route::post('/thanks', function () {

    \Stripe\Stripe::setApiKey(getenv('STRIPE_SECRET_KEY'));

    try {
        $charge = \Stripe\Charge::create(array(
            "amount" => 100,
            "currency" => "jpy",
            "source" => $_POST['stripeToken'],
            "description" => "100yen pay"
        ));
    } catch(\Stripe\Error\Card $e) {

    }

    return view('thanks');
});

 

7.動かしてみる。→エラー調整

この時点でだいたい動きましたが、POSTすると以下のエラーが出てきました。

 

TokenMismatchException in VerifyCsrfToken.php line 67:

app/Http/Middleware/VerifyCsrfToken.php

に以下を追記することで、
CSRF保護の対象外にすることができます。
ただし、クロス・サイト・リクエスト・フォージェリ(CSRF)保護の対象外となりますので、吟味することも大事だと思います!

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'thanks' //追記
    ];

 

クロス・サイト・リクエスト・フォージェリ(CSRF)
… 脆弱性を利用して、悪意のある攻撃をすることだそうで、
信頼できるユーザーになり代わり、認められていないコマンドを実行するとのこと。

Laravelでは、セッションごとにCSRF「トークン」を自動的に生成していて、
リクエスト時に、このトークンを送信して、認証済みのユーザーかを確認するために利用しているとのこと。

なので、HTMLフォームを定義する場合はいつでも、隠しCSRFトークンフィールドをフォームに埋め込んで、
CSRF保護でのチェックできるようにしなければならないとのこと。

 

 

8.動かしてみる。(完成)
カード決済できたー!

Stripeの管理画面にも、疎通確認できました!

 

stripeとっても簡単!

ログもあるし、デバックしやすかったです!