MVCフレームワーク比較一覧（Rails, Laravel)

# フレームワーク別にCRUDをまとめています。
新しい言語を学習するに当たってまとめています。
なので、今はRailsとLaravelになります。


<br>
<br>
<br>

## 全体像

### Ruby/Ruby on Rails


### PHP/Laravel
![laravel構造.001_ut1537371684.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/92cbc530-ceec-cd74-629d-a597574599a6.jpeg)


## プロジェクトの作成

### Rails

```:ターミナル
# バージョン指定なし
$ rails new プロジェクト名 --database=mysql --skip-test --skip-turbolinks --skip-coffe

## デフォルトがsqliteのため、mysqlに変更する　     --database=mysql
## 何かと問題を起こすturbolinksを設定しない       --skip-turbolinks
## Ruby風にjsが記述できるcoffeファイルを利用しない  --skip-coffe



# バージョン指定あり
$ rails _5.2.2_ new プロジェクト名 --database=mysql --skip-test --skip-turbolinks  --skip-coffe
```
[参考リンク](https://qiita.com/jun_jun_jun/items/dd260c43387a8e17803d)
[参考リンク](https://qiita.com/shinkuFencer/items/e6b4e24a92f7b34e9f24)

### Laravel 

```:ターミナル
# バージョン指定なし (初期値でmysqlを利用する）
$ composer create-project --prefer-dist laravel/laravel プロジェクト名

# バージョン指定あり (初期値でmysqlを利用する）
$ composer create-project --prefer-dist "laravel/laravel=5.5.*" sampleproject

#書き方はいろいろ
$ composer create-project laravel/laravel sampleproject --prefer-dist "6.0.*"
```

[参考リンク](https://qiita.com/haxpig/items/ae9b89a6244d4b392bf9)

<br>
<br>
<br>
## ローカルサーバーの起動
###Rails
```：ターミナル
$ rails s
```

### Laravel
```:ターミナル
$ php artisan serve
```

<br>
<br>
<br>
# ルーティング

### Rails

```ruby:rutes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'users#index'

  resources :products do
    collection do
      get 'get_category_children', defaults: { format: 'json' }
      get 'get_category_grandchildren', defaults: { format: 'json' }
    end
    member do
      get 'get_category_children', defaults: { format: 'json' }
      get 'get_category_grandchildren', defaults: { format: 'json' }
    end
  end
end
```


### Laravel

```php:routes/web.php
Route::resource('photos', 'PhotoController');
// [GET](/photos)           ->index
// [GET](/photos/{id})      ->show($id)
// [GET](/photos/create)    ->create
// [POST](/photos)          ->store
// [GET](/photos/{id})      ->edit($id)
// [PUT/PATCH](/photos/{id})->update($id)
// [DELETE](/photos/{id})   ->destroy($id)

// ネストも出来る
Route::resource('photos.comments', 'PhotoCommentController');
// URLはこんな感じになる( photos/{photoId}/comments/{commentId} )

// only,except
Route::resource('photos', 'PhotoController', [
  'only' => ['index', 'show']
]);

// 5.4からはapi向けのresourceルーティングメソッドが追加
Route::apiResource('photos', 'PhotoController');
// resourceメソッドのcreate,editを省いただけのやつです
```
[参考リンク](https://qiita.com/fagai/items/a1bf55b6249aee03a624)
[超参考リンク](https://qiita.com/fagai/items/a1bf55b6249aee03a624)

<br>
<br>
<br>

## コントローラー

### Rails

#### コントローラーの生成

```:ターミナル
$ rails g controller users (コントローラー名複数系)
```
生成されたコントローラー

```ruby:Users_Controller.rb
class UsersController < ApplicationController

  def index # view/users/indexのページを自動表示
    @products = Product.order(created_at: "DESC").includes(:host).page(params[:page]).without_count.per(5)
  end

  def search
    @products = Product.order(created_at: "DESC").includes(:host).page(params[:page]).without_count.per(5)
  end

  def new
  end

  def registration
  end

  def create
  end

  def show
    @user = User.find(params[:id])
  end
end

```


### Laravel

#### コントローラーの生成
```:ターミナル
$ php artisan make:controller PostsController
```

```php:app/HTTP/Controllers/PostsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class PostsController extends Controller
{
    public function index() {
        $posts = Post::latest()->get();
        # $Posts = Post::orderBy('create_at', 'desc')->get();
        return view('posts.index', ['posts' => $posts]);
         # view/posts/index.blade.phpを読み込む
         # ['posts' => $posts]は変数の定義をしている。
    }
}

```


<br>
<br>
<br>
## モデル
バリデーション、アソシエーションを設定することが多い。あとは独自の処理をモデルで設定して、呼び出しやすくすることもある。


### Rails
モデルの作成

```:ターミナル
$ rails g model Post
```
作成されたモデル

```ruby:post.rb
class Post < ApplicationRecord
end
```

マイグレーションファイルを編集する。

```ruby:2020_03_02_create_post.rb
class CreatePost < ActiveRecord::Migration[5.2]
  def change
    create_table :products do |t|
      t.string     :name,         null: false, index: true
      t.text       :description,  null: false
      t.string     :period,       null: false
      t.integer    :price,        null: false
      t.references :host,         foreign_key: { to_table: :users }
      t.references :client,       foreign_key: { to_table: :users }
      t.timestamps
    end
  end
end
```

### Laravel

モデルとmigrationファイルの作成

```:ターミナル
$ php artisan make:model Post --migration
```
これでモデルとmigrationファイルが生成されます。

```php:app/Post.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
    // create()やfill()、update()で値が代入可能
    protected $fillable = [
        'title',
        'body'
    ];
    // create()やfill()、update()で値が代入不可
    protected $guarded = [
        'id',
    ];
}

```

カラムを更新させることが可能： $fillable (修理可能）
所謂ホワイトリストです。$fillableに指定したカラムのみ、create()やfill()、update()で値が代入されます。



カラムを更新させない指定：$guarded （ガード）
$guardedに指定したカラムのみ、create()やfill()、update()で値が代入されません。
[参考](https://qiita.com/toro_ponz/items/b33c757cb7ba5bb48ed4)

<br>
<br>
マイグレーションファイルを編集してカラムを追加しましょう

```php:database/migrations/2020_03_02_create_posts_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title'); # カタムの型(カラム名)を設定
            $table->text('body'); # カタムの型(カラム名)を設定
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

```
up()にマイグレーションを実行した際の処理を
down()にup()の処理を取り消す処理を実装します。

作成したマイグレーションファイルを実行して、カラムを作成します

```:ターミナル
$ php artisan migrate
```

<br>
<br>
<br>
## View

### Rails

```ruby:app/views/posts/index.html.haml


```

view上でモデルのカラムの値を表示する

```ruby:変数（モデル).＋カラム名

@post.title # タイトルが表示
@post.body  # 本文が表示
```

```ruby:each
<% @posts.each do |post| %>
 <li>post.title</li>
<% end %>
```



### Laravel

```php:resources/views/posts/index.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>myblog</title>
</head>
<body>
  <div class="container">
    <h1>Blog Posts</h1>
    <ul>
      @foreach ( $posts as $post )
      <li><a href="">{{ $post->title }}</a></li>
      @endforeach
    </ul>
  </div>
  
</body>
</html>

```


view上でモデルのカラムの値を表示する

```php:変数（モデル).＋カラム名

{{$post->title}} # タイトルが表示
{{$post->body}}  # 本文が表示
```

```php:each

@eachfor ($posts as $post)
<li>{{$post->title}}</li>
@endforeach
```



<br>
<br>
<br>
## 設定・環境設定

### Rails

### Laravel

.env → configの流れが読ませるので、.envを編集すればconfigにも反映される。

```php:.env
# mysqlが初期設定されている

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```

mysqlではなくて、sqliteで進めたい場合

```php:.env
DB_CONNECTION=sqlite
```

```config/app.php