Ruby on Rails 5.1とLaravel 5.5の比較チートシート


この記事は[エイチームブライズアドベントカレンダー](https://qiita.com/advent-calendar/2017/a-t-brides)5日目の記事です。

# はじめに

最近Ruby on Rails 5.1(Ruby)とLaravel 5.5(PHP)を触る機会があった為、ざっくりとしたコマンドや言語仕様を比較します。（qiita初投稿です）

Railsは使えるけどLaravelが気になる、もしくはその逆の方向けです。

筆者はRailsもLaravelも初心者の為、この記事ではそれぞれのメリット・デメリットのような比較はしません（できません）。

一部、Symfony1.4(PHP)という化石のようなフレームワークも一緒に掲載しているのは個人的な事情によるものです:sweat:

# コマンド比較

似た用途のコマンドを並べています。
厳密に挙動が一致しない場合もあります。

## 依存パッケージ
|  | Rails 5.1 | Laravel 5.5 |
|:-----------------|:-----------------|:-----------------|
| インストール | bundle install | composer install |
| アップデート | bundle update  | composer update |

## 作成コマンド
|  | Rails 5.1 | Laravel 5.5 | symfony1.4 |
|:-----------------|:-----------------|:-----------------|:-----------------
| プロジェクトの作成 | rails new [ApplicationName] | laravel new [ApplicationName]                | symfony generate:app [ApplicationName] |
| コントローラーの作成 | rails generate controller [ControllerName] | php artisan make:controller [ControllerName] | symfony generate:module [ApplicationName] [ControllerName] |
| モデルの作成 | rails generate model [ModelName] | php artisan make:model [ModelName]           | ./symfony doctrine:build-model |

## マイグレーション
|  | Rails 5.1 | Laravel 5.5 | symfony1.4 |
|:-----------------|:-----------------|:-----------------|:-----------------
| マイグレーションファイルの作成 | rails generate migration [migration_name] | php artisan make:migration [migration_name] | ./symfony doctrine:generate-migration [migration_name] |
| マイグレーションの実行 | rails db:migrate | php artisan migrate | ./symfony doctrine:migrate |
| マイグレーションのロールバック | rails db:rollback | php artisan migrate:rollback | ./symfony doctrine:migrate --down |
| DBのリセット | rails db:migrate:reset | php artisan migrate:reset |  |
| 初期データの生成 | rails db:seed | php artisan db:seed |  |

## その他
|  | Rails 5.1 | Laravel 5.5 | symfony1.4 |
|:-----------------|:-----------------|:-----------------|:-----------------
| REPL（対話型実行環境） | rails console | php artisan tinker |  |
| Webサーバの起動 | rails server | php artisan serve |  |
| ルート確認 | rails routes | php artisan route:list |  |
| ユニットテストファイル作成 | rails generate integration_test [testName] | php artisan make:test [TestName] |  |
| テスト実行 | rails test | vendor/bin/phpunit | symfony test:unit [TestName] |

ちなみにrailsはコマンドを省略できます。

|通常|短縮|
|:-----------------|:-----------------
| rails server | rails s |
| rails console | rails c |
| rails generate | rails g |
| rails test | rails t |

# 標準のディレクトリ構造比較
|| rails | Laravel | symfony |
|:-----------------|:-----------------|:-----------------|:-----------------
| アプリケーション | app/ | app/ | apps/[applicationName] |
| controllerファイル | app/controllers/[ControllerName]_controller.rb | app/Http/Controllers/[ControllerName]Controller.php | apps/[applicationName]/modules/[ControllerName]/actions/actions.class.php |
| modelファイル | app/models/[ModelName].rb | app/[ModelName].php | lib/model/doctrine/[ModelName].class.php |
| アセット | app/assets/ | resources/assets/ |  |
| コンパイルが必要なcss（sass） | app/assets/stylesheets/ | resources/assets/sass/ |  |
| コンパイルが必要なjs（ES2015、react等） | app/assets/javascripts/ | resources/assets/js/ |  |
| viewファイル | app/views/ControllerName]/[TemplateName].html.erb | resources/views/ControllerName]/[TemplateName].blade.php | apps/[applicationName]/modules/[ControllerName]/templates/[TemplateName]Success.php |
| バイナリ | bin/ |  |  |
| 設定 | config/ | config/ | config/ |
| ルーティング設定ファイル | config/routes.rb | routes/web.php | apps/[applicationName]/config/routing.yml |
| データベース | db/ | database/ |  |
| migration | db/migrate/ | database/migrations/ |  |
| schema | db/schema.rb |  | condig/doctrine/schema.yml |
| seed | db/seeds.rb | database/seeds/ |  |
| ドキュメント | doc/ |  |  |
| ライブラリ | lib/ |  | lib/ |
| ログ | log/ | storage/logs/ | log/ |
|  | public/ | public/ | web/[applicationName]/ |
| 画像 | app/assets/images/ | public/images/ | web/[applicationName]/images/ |
| css | app/assets/stylesheets/ | public/css/ | web/[applicationName]/css/ |
| js | app/assets/javascripts/ | public/js/ | web/[applicationName]/js/ |
| テスト | test/ | tests/ | test/ |
|  | tmp/ |  |  |
| プラグイン系 | vendor/ | vendor/ | plugins/ |
|  | Rakefile |  |  |
| 依存パッケージ管理 | Gemfile | composer.json |  |
|  | Gemfile.lock | composer.lock |  |
|  | config.ru |  |  |

# 言語仕様(Ruby, PHP)の違い

PHPは関数・メソッドを使って処理をしていくことが多いです。
Rubyは文字列や数値といった変数も全てオブジェクトなので、インスタンスメソッドを呼び出して処理をしていくことが多いです。

```ruby:Ruby

# 文字列を置換
hoge = 'fuga'
hogehoge = hoge.sub('a', 'o')
puts hoge # fuga
puts hogehoge # fugo

# 最後に!を付けると自身を置き換える
hoge.sub!('a', 'o')
puts hoge # fugo

```

```php:PHP

$hoge = 'fuga';
$hogehoge = str_replace($hoge, 'a', 'o');
puts $hoge; // fuga
puts $hogehoge; // fugo

# 代入することで自身を置き換える
$hoge = str_replace($hoge, 'a', 'o');
puts $hoge; // fugo

```

基本的な考え方としては、他の変数やメソッドにおいてもほぼ同じ。

また、RubyとPHPでは式を評価した時の挙動が微妙に異なります。
**Rubyではnil, falseのみ**評価した時にfalseを返し
**PHPではnull, false(bool), 0(int), 0.0(float), ""(空文字), "0"(string), \[](空の配列)**等が評価した時にfalseを返します。

```ruby:Ruby

puts [] ? 'true' : 'false'    # true
puts 0 ? 'true' : 'false'     # true
puts '0' ? 'true' : 'false'   # true
puts false ? 'true' : 'false' # false
puts nil ? 'true' : 'false'   # false

```

```php:PHP

puts [] ? 'true' : 'false'    // false
puts 0 ? 'true' : 'false'     // false
puts '0' ? 'true' : 'false'   // false
puts false ? 'true' : 'false' // false
puts null ? 'true' : 'false'  // false

```

# 中身吐き出して処理中断させるデバッグをしたい時


```ruby:Rails

p hoge # hoge.inspectと同等

# もしくは、こっちの方が分かりやすいかも？
hoge.to_yaml

# こんな方法も （@sho0211 さんありがとうございます）
require 'pp'
pp hoge

```


```php:Laravel

// 素のPHP
$hoge = 'fuga';
var_dump($hoge); // "fuga" 
exit();

// Laravelではこっちでも同等
$hoge = 'fuga';
dd($hoge); // "fuga"

```

# おわりに

RailsもLaravelもモダンなWebフレームワークなので、たいがいのことはどちらでも実装可能です。

また、Railsはgem、Laravelはcomposerを使えば各種プラグインも簡単に導入できるので、よほど凝ったことでなければ、そこまで導入コストにも差が無いかなと思います。

いろいろな言語、FWを使うことでより知見が深まると思うので、是非触ってみてください。

# お知らせ

エイチームブライズでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](http://www.a-tm.co.jp/recruit/)（[Webエンジニア詳細ページ](http://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)）よりお問い合わせ下さい。

# 明日

エイチームブライズアドベントカレンダー5日目の記事は、いかがでしたでしょうか。
明日は @kakakaori830 が「クリスマスぽいこと」について書いてくれるようです。
きっとステキな記事を書いてくれるはずです。楽しみですね！