読者です 読者をやめる 読者になる 読者になる

筋肉とエンジニアリングで すべてを解決するブログ

筋トレ、JavaScript、Ruby で世界を変えてやります。

Laravel Meetup vol.4 に行ってきた!

f:id:ma3tk:20140721002501p:plain

概要

Laravel Meetup vol.4 に行ってきたのでそのレポートです。

数週間前の話なんですが、まとめたのをブログに公開しようと思ってたの忘れてたので公開します。

それと、レポートでわからなかった部分をいろんなスライドとかドキュメントからもってきてまとめてみました。 全体としては、 Laravel のハンズオンに始まり、その魅力 と 実用例って感じの流れでした。

詳細 : http://laravel.doorkeeper.jp/events/12367

ハンズオンしてみよう

ハンズオンのドキュメント

https://github.com/laravel-jp/meetup/blob/ytake-handson/vol-4.md

大体このドキュメント見れば実際に動くところまでが実行できるんですが、大体やったことあったので省略。 インストールから実際にページを表示するくらいの流れです。

Laravel とは

事前知識

Composer とは

  • http://www.ryuzee.com/contents/blog/5681
  • PHP 5.3 以上で利用可能なライブラリのバージョン管理ツール
  • 「アプリケーションによって必要とするバージョンが違う」といった環境の差異をなくし、問題となる箇所を減らすことができる

できること

Migration

  • migration とは 構造的なデータベースの変更のバージョン管理のようなもの
  • 直接 SQL を打たずに データベースの構造や内容を変更できる
  • rails にもあるやつ

IoC Container

  • Inversion Of Control (制御の逆転)
  • よしなにクラス作ってくれる
  • よしなに依存関係解決してくれる
  • テストもしやすくなる
  • DIコンテナのこと
  • クラスを間接的に呼び出すように書くことで呼び出しとクラスの内容に依存性をなくすことができる
  • 代わりにアプリケーション実行時に依存性を入れる
<?
$app = new Foo;

上記のように普通はかけるが、IoC使うと

<?
App::bind('foo' function() {
    return new Foo;
});
 
$app = App::make('foo');

上記のように間接的にクラスを呼び出す形になる。で、どういうふうにいいかというと、

<?
// 普通に書くとDB接続が発生
$orders = new OrderRepository();
new Foo($orders);
 
// IoC 使うと スタブで置き換えられる のでテストしやすい!!!
App::bind('Foo' 'MockOrders');
App::make('Foo');
 
class Foo extends BaseController {
    public function __construct(OrderRepository $orders)
    {
        $this->orders = $orders;
    }
    public function getIndex()
    {
        $all = $this->orders->all();
        return View::make('orders', compact('all')); 
    }
}

上記のようにかけるので、テストしやすい。

Router

Router も便利。いろんな書き方が簡単にできるので使いやすいです。

<?
// get リクエストで welcome が来たら、 home コントローラーの function index を実行する
Route::get('welcome', 'home@index');

// post リクエストで welcome/数字 が来たら、数字を $user_id として使う
Route::post('welcome/(:num)', function($user_id)
{
    // do something
});

Event

例えば…ユーザがログインしたら、 ログイン時間を save する

<?
Event::listen('auth.login', function($user)
{
    $user->last_login = new DateTime;

    $user->save();
});

Filter

フィルタリングももちろん簡単に。複数もいける。

<?
Route::filter('old', function()
{
    if (Input::get('age') < 20)
    {
        return Redirect::to('home');
    }
});

Route::get('user', array('before' => array('auth', 'old'), 'uses' => 'UserController@showProfile'));

Eloquent

http://laravel3.kore1server.com/docs/database/eloquent

ORM (オブジェクトリレーショナルマッパー) 、データベースオブジェクトをやりとりするのに非常に便利なもん。

一般的なORMという感じの印象。

<?
class Phone extends Eloquent {
 
     public function user()
     {
          return $this->belongs_to('User');
     }
 
     public function comments()
     {
          return $this->has_many('Comment');
     }
 
}
 
Phone::find(1)->comments()->get();

Phone::find(1)->comments()->order_by('votes', 'desc')->take(10)->get();

View

Blade というテンプレートエンジンをつかってます。

(composer で smarty インストールすることもできます。)

いいところ

継承できちゃう 独自実装も簡単にできる

<?
<!-- Stored in app/views/layouts/master.blade.php -->

<html>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>


@extends('layouts.master')

@section('sidebar')
    @parent

    <p>This is appended to the master sidebar.</p>
@stop

@section('content')
    <p>This is my body content.</p>
@stop

JS フレームワーク

  • angular.js
  • backbone.js
  • ember.js

などなど全部いける。

その他

  • HHVM利用可能
  • nginxをサーバーにするのも選べる
  • cache / session は memcached, redis がデフォルトで利用できる
  • MongoDB、Oracle 等にも対応

LT

3 Tips of Laravel

ページング

paginate ってのを使えば簡単にいけちゃうんだぜ。

<?
DB::table('users')->paginate(10);
User::where('age', '>', 40)->paginate(10);
// << 1 2 3 4 5 6 7 >>
<?php echo $users->appends(array('age' => $age))->links(); ?>

ガラケー対応

エンコード違うから before 使ってエンコード変える処理入れようね、って話。

<?
App::before(function($request)
{
    if(ガラケー) {
        $content = $response->getContent();
        $content = mb_convert_encoding($content, 'SJIS', 'UTF-8');
        $response->header('Content-Type', 'text/html;charset=Shift_JIS');
        $response->setContent($content);
 }
});

ツイッター投稿

  • パッケージを composer で読み込む
  • コンフィグ設定
<?
Twitter::postTweet(array('status' => $message, 'format' => 'json'));

グーグル oauth

https://github.com/edisonthk/google-oauth-laravel4

既存のであったんですが、実装クソだったので作りなおしてやりましたって話

Laravel Homestead

http://qiita.com/syossan27/items/0104615e5f9ae26f0720

LaravelにはLaravel Homesteadというvagrantを使った開発環境作成のサポートがあります。

これを使ってサクッと開発環境を作りましょう!って話。

話聞いてても資料見ても簡単そう。

Laravel開発カフェ〜Railsアプリ『かんばんりすと』の移植

タスク管理アプリを Rails から Laravel で移植しましたが、結構さくさく移植できました、って話。

参考

スライド系

ドキュメント系