この記事はエイチームブライズアドベントカレンダー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

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

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

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

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

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

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

Rails

p hoge # hoge.inspectと同等

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

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

Laravel

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

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

おわりに

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

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

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

お知らせ

エイチームブライズでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひともエイチームグループ採用ページWebエンジニア詳細ページ)よりお問い合わせ下さい。

明日

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