Laravel 5.5 の妥協できる PHP-CS-Fixer 設定ファイルが完成した – oki2a24 を作る途中で、 https://styleci.readme.io/docs/presets#section-laravel の各ルールが、 PHP-CS-Fixer のどのルールと対応するのか、それは PHP-CS-Fixer の @PSR ルールや @PhpCsFixer ルールに含まれるか、の対応が知りたいと思い、一覧表にまとめました。
カテゴリー: Linux
VPS や Vitual Box で使用している Linux、CentOS について勉強したアプリ、設定、コマンドなどを紹介いたします!
妥協ライン
- Laravel 5.5 本体に PHP-CS-Fixer を適用しても何も修正されない。
- 作成直後の Laravel 5.5 に PHP-CS-Fixer を適用しても何も修正されない。
- https://laravel.com/docs/5.8/contributions#coding-style に従う。しかし、 PHP-CS-Fixer によって本体や作成直後のプロジェクトが修正されてしまう場合は、最低限修正されないように最低限の変更を加える。
- https://styleci.readme.io/docs/presets#section-laravel に従う。しかし、 PHP-CS-Fixer によって本体や作成直後のプロジェクトが修正されてしまう場合は、最低限修正されないように最低限の変更を加える。
Laravel 5.5 の StyleCI 設定を PHP-CS-Fixer で表現しようとしたもの
.php_cs.dist
<?php
/*
* This document has been generated with
* https://mlocati.github.io/php-cs-fixer-configurator/?version=2.15#configurator
* you can change this configuration by importing this file.
*/
return PhpCsFixer\Config::create()
->setRiskyAllowed(true)
->setRules([
'align_multiline_comment' => true,
'array_syntax' => ['syntax' => 'short'],
'binary_operator_spaces' => true,
'blank_line_after_namespace' => true,
'blank_line_after_opening_tag' => true,
'blank_line_before_statement' => ['statements' => ['return']],
'braces' => true,
'cast_spaces' => true,
'class_attributes_separation' => ['elements' => ['method']],
'class_definition' => true,
'concat_space' => true,
'declare_equal_normalize' => true,
'elseif' => true,
'encoding' => true,
'full_opening_tag' => true,
'function_declaration' => true,
'function_typehint_space' => true,
'hash_to_slash_comment' => true,
'heredoc_to_nowdoc' => true,
'include' => true,
'increment_style' => ['style' => 'post'],
'indentation_type' => true,
'lowercase_cast' => true,
'lowercase_constants' => true,
'lowercase_keywords' => true,
'magic_constant_casing' => true,
'method_argument_space' => true,
'multiline_whitespace_before_semicolons' => true,
'no_alias_functions' => true,
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_closing_tag' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => ['tokens' => ['extra', 'throw', 'use']],
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_mixed_echo_print' => true,
'no_multiline_whitespace_around_double_arrow' => true,
'no_short_bool_cast' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_spaces_after_function_name' => true,
'no_spaces_around_offset' => true,
'no_spaces_inside_parenthesis' => true,
'no_trailing_comma_in_list_call' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_trailing_whitespace' => true,
'no_trailing_whitespace_in_comment' => true,
'no_unneeded_control_parentheses' => true,
'no_unreachable_default_argument_value' => true,
'no_unused_imports' => true,
'no_useless_return' => true,
'no_whitespace_before_comma_in_array' => true,
'no_whitespace_in_blank_line' => true,
'normalize_index_brace' => true,
'not_operator_with_successor_space' => true,
'object_operator_without_whitespace' => true,
'ordered_imports' => ['sort_algorithm' => 'length'],
'phpdoc_indent' => true,
'phpdoc_inline_tag' => true,
'phpdoc_no_access' => true,
'phpdoc_no_package' => true,
'phpdoc_no_useless_inheritdoc' => true,
'phpdoc_scalar' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_summary' => true,
'phpdoc_to_comment' => true,
'phpdoc_trim' => true,
'phpdoc_types' => true,
'phpdoc_var_without_name' => true,
'psr4' => true,
'self_accessor' => true,
'short_scalar_cast' => true,
'simplified_null_return' => true,
'single_blank_line_at_eof' => true,
'single_blank_line_before_namespace' => true,
'single_class_element_per_statement' => true,
'single_import_per_statement' => true,
'single_line_after_imports' => true,
'single_quote' => true,
'space_after_semicolon' => true,
'standardize_not_equals' => true,
'switch_case_semicolon_to_colon' => true,
'switch_case_space' => true,
'ternary_operator_spaces' => true,
'trailing_comma_in_multiline_array' => true,
'trim_array_spaces' => true,
'unary_operator_spaces' => true,
'visibility_required' => true,
'whitespace_after_comma_in_array' => true,
])
->setFinder(PhpCsFixer\Finder::create()
->exclude('vendor')
->in(__DIR__)
)
;
まとめ
- Laravel 5.5 既存のデータベースからマイグレーションファイルを一発で生成した手順 – oki2a24 で生成されたファイルを修正する必要があった。
- Xethron/migrations-generator: Laravel Migrations Generator: Automatically generate your migrations from an existing database schema. で生成したマイグレーションファイルをそのまま使うと、エラーとなる場合がある。
- MEDIUMTEXT カラム、 LONGTEXT カラムに対応しておらず、
text
メソッドが使われてしまう。したがって、$table->text('column')
から$table->mediumText('column')
や$table->longText('column')
へと修正する必要がある。 text
メソッドに第 2 引数が設定されている場合があるので、この第 2 引数を取り除く。$table->text('column', 65535)
というように出力された。しかし、少なくとも Laravel 5.5 では第 2 引数を text メソッドは取らない。ちなみに、この第 2 引数はデータサイズを指定するものだと思われる。
まとめ
- STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE である MySQL の話
- カラムに挿入できる datetime の最小値は ‘0000-01-01 00:00:00’
- STR_TO_DATE 関数で扱える最小値は ‘0001-01-01 00:00:00’
- したがって、 NMySQL の datetime で実際に使うときに無難な最小値は ‘0001-01-01 00:00:00’
composer update –lock とは?
composer update --help
から抜粋です。
update
The update command reads the composer.json file from the current directory, processes it, and updates, removes or installs all the dependencies.
カレントディレクトリの composer.json を読み込み、その内容を実行し、依存パッケージのアップデート、インストールまたは削除を行う。
update –lock
--lock Only updates the lock file hash to suppress warning about the lock file being out of date.
無効となってしまった lock ファイルの警告を抑えるために、 lock ファイルの hash の更新を行う。
まとめ
- krlove/eloquent-model-generator: Eloquent Model Generator
- DB コネクションを指定できるため、MySQL や PostgreSQL などの複数の DB に対応することができる。
- データベーステーブルから、モデルファイルを生成することができる。
- 以前のような、データベースのテーブルやレコードを操作するものではない。
まとめ
- orangehill/iseed: Laravel 5 Inverse Seed Generator
- レコードをテーブルに挿入するシーダークラスファイルを生成する。 1 テーブルにつき 1 ファイルを生成することができる。
- Laravel 5.5 既存のデータベースからマイグレーションファイルを一発で生成した手順 – oki2a24 ではテーブル情報を生成するマイグレーションファイルを取り扱ったが、今回は、テーブル内のレコードをファイルに取り出す話。
バーション情報
- Laravel Framework 5.5.45
- Inverse seed generator (iSeed) v2.6.1
Inverse seed generator (iSeed) インストール
composer require orangehill/iseed --dev
実際は次のようになりました。注意点は前回と同じです。
$ docker-compose run --rm composer require orangehill/iseed --dev
Using version ^2.6 for orangehill/iseed
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing orangehill/iseed (v2.6.1): Downloading (100%)
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating optimized autoload files
*******************************************
/!\ Warning, you're using a deprecated
¨¨¨ version of Carbon, we will soon stop
providing support and update for 1.x
versions, please upgrade to Carbon 2.
*******************************************
Most features of Carbon 1 are still available in Carbon 2.
See how to migrate: https://carbon.nesbot.com/docs/#api-carbon-2
Please consider upgrading your Laravel dependencies to be compatible with Carbon 2:
- laravel/framework at least to version 5.8.0
If you can't update Laravel, check https://carbon.nesbot.com/ to see how to
install Carbon 2 using alias version and our adapter kylekatarnls/laravel-carbon-2
You can run './vendor/bin/upgrade-carbon' to get help in updating carbon and other frameworks and libraries that depend on it.
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: orangehill/iseed
Package manifest generated successfully.
Inverse seed generator (iSeed) の help
# php artisan help iseed
Usage:
iseed [options] [--] <tables>
Arguments:
tables comma separated string of table names
Options:
--clean clean iseed section
--force force overwrite of all existing seed classes
--database[=DATABASE] database connection [default: "mysql"]
--max[=MAX] max number of rows
--chunksize[=CHUNKSIZE] size of data chunks for each insert query
--exclude[=EXCLUDE] exclude columns
--prerun[=PRERUN] prerun event name
--postrun[=POSTRUN] postrun event name
--dumpauto[=DUMPAUTO] run composer dump-autoload [default: true]
--noindex no indexing in the seed
--orderby[=ORDERBY] orderby desc by column
--direction[=DIRECTION] orderby direction
--classnameprefix[=CLASSNAMEPREFIX] prefix for class and file name
--classnamesuffix[=CLASSNAMESUFFIX] suffix for class and file name
-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
--env[=ENV] The environment the command should run under
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
Generate seed file from table
#
Inverse seed generator (iSeed) を実際に動かす
必ずテーブル名を指定しなければならないのが少し面倒ですけれども、使い方自体は簡単でした。
# php artisan iseed wp_commentmeta,wp_comments,wp_links,wp_options,wp_postmeta,wp_posts,wp_term_relationships,wp_term_taxonomy,wp_termmeta,wp_terms,wp_usermeta,wp_users
Created a seed file from table wp_commentmeta
Created a seed file from table wp_comments
Created a seed file from table wp_links
Created a seed file from table wp_options
Created a seed file from table wp_postmeta
Created a seed file from table wp_posts
Created a seed file from table wp_term_relationships
Created a seed file from table wp_term_taxonomy
Created a seed file from table wp_termmeta
Created a seed file from table wp_terms
Created a seed file from table wp_usermeta
Created a seed file from table wp_users
#
結果、 database/seeds/ に上記のファイルが追加され、さらに、 database/seeds/DatabaseSeeder.php に上記ファイルを実行するように追記されていました。
生成されたシーダーファイルの中身
例えば database/seeds/WpCommentsTableSeeder.php は次のようになりました。
- まずレコードを全て削除してからデータを追加する流れ。
- ファイルの各行の行末に不要なスペースが高い頻度で混じっている。
<?php
use Illuminate\Database\Seeder;
class WpCommentsTableSeeder extends Seeder
{
/**
* Auto generated seed file
*
* @return void
*/
public function run()
{
\DB::table('wp_comments')->delete();
\DB::table('wp_comments')->insert(array (
0 =>
array (
'comment_ID' => 1,
'comment_post_ID' => 1,
'comment_author' => 'WordPress コメントの投稿者',
'comment_author_email' => 'wapuu@wordpress.example',
'comment_author_url' => 'https://wordpress.org/',
'comment_author_IP' => '',
'comment_date' => '2019-06-02 10:24:29',
'comment_date_gmt' => '2019-06-02 01:24:29',
'comment_content' => 'こんにちは、これはコメントです。
コメントの承認、編集、削除を始めるにはダッシュボードの「コメント画面」にアクセスしてください。
コメントのアバターは「<a href="https://gravatar.com">Gravatar</a>」から取得されます。',
'comment_karma' => 0,
'comment_approved' => '1',
'comment_agent' => '',
'comment_type' => '',
'comment_parent' => 0,
'user_id' => 0,
),
));
}
おわりに
Laravel 5.5 既存のデータベースからマイグレーションファイルを一発で生成した手順 – oki2a24 で疑問視したように、マイグレーションファイルで既存のデータベースの情報をマイグレーションファイルとして生成したとしても、データベースレコードも使いたい場合は意味がありません。レコードも抽出できれば良いのに、という問題がありました。
今回の投稿はそれを解決するものとなります。
ただ、シーダークラスファイルは、どちらかというとテスト用のデータを気軽に作るための用途が一般的なように感じます。
既存のデータベースのレコード数が非常に大きな場合、シーダークラスファイルに抽出して、というのはシーダークラスファイルの大きさが非常に大きくなり、また、DB へ入れる際にも非常に時間がかかると予想されるため、良い方法とは言えないと思います。
そうなると使いどころですけれども、アプリをリリースする準備段階として、余計なデータベースデータを削除して、残した設定系のマスタデータをシーダークラスファイルとして逆生成する、というのは、良い使い道ではないでしょうか。
既存のデータベースを使ったままのシステムリプレース業務の場合は、マイグレーションクラスやシーダークラスのファイルをデータベースから逆生成する意味は薄いように感じました。
最後に、参考ページです。このページのおかげで、 Inverse seed generator (iSeed) を見つけることができました。
以上です。
まとめ
- Xethron/migrations-generator: Laravel Migrations Generator: Automatically generate your migrations from an existing database schema.
- テーブルを作成する migration ファイルを 1 テーブルにつき 1 ファイルで出力することができる。
- なお、レコード情報を出力することはできない。よって、データベースのダンプファイルがあるならば、この作業は不要で価値のないものかもしれない。
- Xethron/migrations-generator で生成された内容で注意する点 – oki2a24
誤り
nmap <Leader>c [coc.nvim]
nnoremap [coc.nvim] <Nop>
" Remap keys for gotos
nmap <silent> [coc.nvim]d <Plug>(coc-definition)
let mapleader = "\<Space>"
上記のように書くと、次のようなキーマッピングとなってしまいました。
\c
-> [coc.nvim]\cd
-> coc-definition- それ以外での <leader> -> <Space>