Laravelライクに書けるnode.jsのフレームワーク 「Adonis」の紹介

ネットサーフィンをしていたら、とても興味深いnode.jsのフレームワークを見つけたのでご紹介します。
その名は「Adonis」です。

以前からnode.jsには興味があったのですが、仕事では使用しておらず、
またjs自体に苦手意識があったので、躊躇していました。

そんな時に、こちらの記事を見つけました。

>Laravelライクなnode.jsのフレームワーク「adonis.js」
>http://co.bsnws.net/article/25

なんと、node.jsがLaravelの記述方式で書けるだと....
普段Laravelを使用して開発を行っているので、衝撃的でした。

そして、実際に触ってみた所、ほとんどlaravelと同じ感覚で書け、簡単にプログラムが出来たので、感動しました！


ということで、Laravelと比較しながら紹介してみます。

ただ、node.jsやjsについては素人なので、少しおかしな事を書いてる所があるかもしれません。
ご指摘あればコメント下さい。

今回使用するAdonisのバージョンは、最新版の2.0.9になります。

#インストール
npmからインストールします。

```
npm install -g adonis-cli
```

インストール完了後、adonisコマンドか使えるようになるので

```
adonis new プロジェクト名
```

これでプロジェクトが出来上がります。
とても簡単です。



#起動してブラウザから確認
プロジェクトルートに入った後、npm startをすると起動します。

初期設定ならlocalhost:3333でアクセスできます。
そして、最初の画面はこんな感じです。

![無題11.png](https://qiita-image-store.s3.amazonaws.com/0/105496/4ab28317-230c-b5a2-7b99-6c94f80330d0.png)

「Everything has beauty, but not everyone sees it.」
この文章を検索すると、結構ヒットするので、割と有名な言葉なのかな。

google翻訳によると、
「全てのものは美しさを持っている。しかし誰もが気づくわけではない。」
だそうです。

#.envが使える
最初に設定されている値はこんな感じです。
そして、dotenvって調べてみると色々な言語で使えるんですね。知らなかったです :sweat_smile: 

```lang:.env
APP_PORT=3333
APP_HOST=0.0.0.0
SESSION_DRIVER=cookie
NODE_ENV=development
CACHE_VIEWS=true
APP_KEY=個別に設定されるキー

```

#ディレクトリ構成
公式サイトにも載っているのですが、こちらにも引用して載せておきます。  

```lang:
├── app/
│ ├── Commands/
│ ├── Http/
│ │ ├── Controllers/
│ │ ├── Middleware/
│ │ ├── routes.js
│ │ ├── kernel.js
│ ├── Model/
│ ├── Services/
├── bootstrap/
│ ├── app.js
│ ├── http.js
│ ├── kernel.js
│ ├── start.js
├── config/
├── migrations/
├── public/
├── providers/
├── resources/
│ ├── views
├── storage/
│── .env
│── ace
│── server.js
│── package.json
```

Laravel5と同じような構成です。

#ルーティング
app/Http/routes.jsに記述していきます。
phpがjsになっただけです。

```js:app/Http/routes.js
'use strict'

/*
|--------------------------------------------------------------------------
| Routes
|--------------------------------------------------------------------------
|
| Routes helps you in defining http endpoints/urls which will be used
| by outside world to interact with your application. Adonis has a
| lean and rich router to support various options out of the box.
|
*/
const Route = use('Route')

Route.get('/', 'HomeController.index')

```

中身もほぼ同じで驚きました :flushed: 

そして、ミドルウェアやwhere絞り、名前付きルート等々、Laravelで出来ることは一通り出来ます。

#ミドルウェア
こちらもLaravelと同じようにグローバルと、名前付ミドルウェアの登録が出来ます。
新規で作成したミドルウェアはapp/Http/kernel.jsに登録します。

また、標準でグローバルに、csrfのミドルウェアが登録されている所も一緒です。
ただ少し違うのは、Shieldという名前になっている所です。

```js:app/Http/kernel.js
'use strict'

const Middleware = use('Middleware')

/*
|--------------------------------------------------------------------------
| Global Middleware
|--------------------------------------------------------------------------
|
| Global middleware are executed on every request and must be defined
| inside below array.
|
*/
const globalMiddleware = [
  'Adonis/Middleware/Cors',
  'Adonis/Middleware/BodyParser',
  'Adonis/Middleware/Shield',
  'Adonis/Middleware/Flash'
]

//省略
```

#コントローラー
app/Http/Controllers以下に作成していきます。
インストール直後は、サンプルとしてHomeController.jsが作成されています。

```js:app/Http/HomeController.js
'use strict'

class HomeController{
    * index (request, response){
        const index = yield response.view('index')
        response.send(index)
    }
}
```

yield response.view('index')でテンプレートを指定しています。

そして、一つ注意点ですが、ドット記法が使えないことです。
ディレクトリはスラッシュ区切りで指定します。



#aceコマンド
Laravelのartisanコマンドと同等のものです。
ただ、マイグレーションとmake関連が少しあるだけで数は少ないです。

```lang:コマンド一覧
Options
--help       Get help for all ace commands
--version    Get framework version

Available Commands
greet
 greet:user    I will greet a user

migration
 migration:make        Create a new migration file
 migration:run         Run latest migrations
 migration:rollback    Rollback migrations executed in last batch

make
 make:controller    Generate a new controller file by passing it's name
 make:model         Generate a new Database Model
 make:command       Generate a new ace command file by passing it's name
 make:middleware    Generate a new HTTP middleware

```

もちろん、独自のコマンドを作って登録することもできます。
greet:userというのはコマンドのサンプルなので、これが参考になるかと思います。

#Lucid ORM
Eloquent ORMと同等のもので、基本的に記述方法はEloquentと一緒です。
モデルも、aceコマンドで作ることができます。

モデルに関連するテーブルの仕様はLaravel準拠となっており
・名前は複数形
・カラムに、id,created_at,updated_atが必要
となっています。

また、ソフトデリートにも対応しています。

仕様通りにテーブルを作っていれば、aceコマンドでモデルを作成するだけで動くようになります。

使い方は簡単でuseするだけです。
以下、使用例（公式ドキュメントから引用）

```js:app/Http/Controllers/UserController.js
const User = use('App/Model/User')

class UserController{

  *index (request, response) {
    const users = yield User.all()
    response.json(users)
  }

}
```


#マイグレーション
マイグレーション、クエリービルダーはknex.jsというライブラリを使用しているようです。

```
./ace migration:make　ファイル名　
```

でmigrationsにファイルが作成されます。

こちらもLaravelと同じ記述で書くことができます。

```js:migrations/1455001855782_Users.js
'use strict'

const Schema = use('Schema')

class NewSchema extends Schema {

  up () {
    this.create('users', function (table) {
      table.increments('id')
      table.text('name')
      table.timestamps()
      table.timestamp('deleted_at')
    })
  }

  down () {
    this.drop('users')
  }

}

module.exports = NewSchema
```

後は、

```
./ace migration:run
```

で実行

```
./ace migration:rollback
```

で元に戻せます。


残念ながら、seed機能はまだ未実装です。

#Collection
lodashというライブラリのラッパーの様です。
lodashのAPI仕様を見た所、laravelのCollectionよりも、色々なことができそうな感じでした。

Lucidで取得した値もLaravel同様、Collectionで返ってきます。

#テンプレートエンジン
こちらは、Laravelと違います。
node.js初心者の為ソースが全然追えず、twigそのものなのか、twigベースなのか判断出来なかったのですが、記述方式はtwigです。（公式ドキュメントにはtwigの表記は無かった）

テンプレート用のヘルパーもあるようで
例えばcsrfトークンなら以下のように記述できます。
{{ csrfToken }}



#スタックトレース
紹介するほどの物では無いと思いますが、Laravel4では標準で入っていたのと同じ、filp/whoopsを使用しています。

#公式ドキュメント
>http://adonisjs.com/docs/2.0/installation

こちらです。初めてドキュメントを見た時に、思わず吹き出してしまいました。なんと、Laravelの公式ドキュメントと色以外は、スタイルが同じです :grin: 
でも、おかげでとても見やすく、分かりやすい内容となっています。

また、Laravelの概念を取り入れている旨も明記されています。

#その他、触ってみた感想とか
正直、node.js版Laravelと言っても良いぐらい、Laravelライクに記述できます。Laravel5を触っている方なら私の様に、node.jsを触ったことが無い方でも、すぐに馴染めると思います。
また、普段PHPしか触らない人にとっては、classが扱えるのと、ヘルパーによる疑似use？が使えるという点も大きいのではないでしょうか。

そして、adonisはおそらく2015年頃に出来たばかりの、新しいフレームワークです。
その為まだまだ、海外でも認知度が低く、未実装の機能も多いので、商用レベルでの導入は難しいかもしれません。しかし、開発は盛んの様で、その状況はTrelloやgithubから確認できます。

ちなみに、日本ではまだ全然認知されていないようで...
日本語の記事は、最初に挙げた記事しか見つかりませんでした。
AdonisもLaravelと同じように少しづつ、認知度が広がればいいなと思います。

以上、今後注目のフレームワークでした :laughing: 

少ししたら、個別に機能紹介をしてみたいと思います。