Laravel 5.5 の妥協できる PHP-CS-Fixer 設定ファイルが完成した

スポンサードリンク


妥協ライン

  • 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 の妥協できる PHP-CS-Fixer 設定ファイルが完成した” の続きを読む

Laravel 5.5 のコーディング規約の StyleCI 設定を 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 のコーディング規約の StyleCI 設定を PHP-CS-Fixer 設定で表現しようとして後もう一息” の続きを読む

Xethron/migrations-generator で生成された内容で注意する点

まとめ

“Xethron/migrations-generator で生成された内容で注意する点” の続きを読む

MySQL の datetime の無難な最小値は ‘0001-01-01 00:00:00’ だった

まとめ

  • 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’
“MySQL の datetime の無難な最小値は ‘0001-01-01 00:00:00’ だった” の続きを読む

Composer.lock の content-hash が git merge でコンフリクトした時は composer update –lock して解決できる

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 の更新を行う。

“Composer.lock の content-hash が git merge でコンフリクトした時は composer update –lock して解決できる” の続きを読む

Laravel 5.5 既存のデータベースからモデルを一発で逆生成した手順

まとめ

“Laravel 5.5 既存のデータベースからモデルを一発で逆生成した手順” の続きを読む

Laravel 5.5 既存のデータベースからレコード情報のシーダーファイルを一発で生成した手順

まとめ

バーション情報

  • 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) を見つけることができました。

以上です。

Laravel 5.5 既存のデータベースからマイグレーションファイルを一発で生成した手順

まとめ

“Laravel 5.5 既存のデータベースからマイグレーションファイルを一発で生成した手順” の続きを読む

mapleader の定義は最初に行うこと! キーマップの Leader が変になった。

誤り

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>
“mapleader の定義は最初に行うこと! キーマップの Leader が変になった。” の続きを読む

ついに Vim のキーマッピングを始めるので覚書

まとめ

  • <Leader> を設定する。 <Space> にした。
  • 既存のマッピングを潰さない。
  • プラグイン固有のキーマッピングは次のようにする。
    1. nmap <Leader>x [xxx] (例えば xxx という名前のプラグイン。頭文字は x である) としてプラグイン固有のプレフィックスを定義する。
    2. nmap <silent> [x]d <Plug>(xxx-function) 、つまり <プラグイン固有のプレフィックス + キー> という形でマッピングを定義する。
“ついに Vim のキーマッピングを始めるので覚書” の続きを読む