LoginSignup
137
120

More than 5 years have passed since last update.

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

Posted at

ネットサーフィンをしていたら、とても興味深い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

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

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

.envが使える

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

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

ディレクトリ構成

公式サイトにも載っているのですが、こちらにも引用して載せておきます。

├── 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になっただけです。

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という名前になっている所です。

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が作成されています。

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関連が少しあるだけで数は少ないです。

コマンド一覧
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するだけです。
以下、使用例(公式ドキュメントから引用)

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と同じ記述で書くことができます。

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:

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

137
120
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
137
120