Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel5を使って開発してみた

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 Laravel5を使って開発してみた

Laravel5を使って開発した話を紹介します。開発導入の参考になれば幸いです。

Avatar for Takeo Noda

Takeo Noda

June 27, 2015
Tweet

More Decks by Takeo Noda

Other Decks in Programming

Transcript

  1. 5 今日お話しする内容 1. 作成したアプリケーション 2. Laravel5について 3. Laravel5を採用した理由 4. 環境構築手順

    5. 全体像(リクエストライフサイクル) 6. 開発フローについて 7. 各種開発TIPS 8. 速度改善について 9. まとめ
  2. 8 Laravel5を採用した理由 • 開発効率が上がりそう! • DIのコンストラクタ/メソッドインジェクションができる! • アノテーションでルーティングができる! • デバッガーが便利そう!

    • 公式サイトにドキュメントが一通りある! 懸念は… • 5.0という大きなバージョンアップの直後。4.0からいろいろ変わってる。。 • Laravelは処理が重たいというイメージ。
  3. 9 DIについて • DIは、Dependency Injectionの略で「依存性の注入」。 • マーティン・ファウラー氏によって提唱。 • 外部の設定ファイルなどでオブジェクトを定義し、注入することができ るソフトウェアパターン。

    • LaravelではProvidersの実装で登録することによって実現。 • フレームワークコア部分については、拡張できるようApplicationクラス でContractsというインターフェイスとFacadeという実装プロクシを使っ て登録。 L5では、コンストラクタ/メソッド を通じてオブジェクトを注入 Auth Laravel5 /** * お知らせ通知APIコントローラー * @Middleware("api.key.auth") */ class NoticeController extends Controller { /** * @return string */ public function __construct( ) { $this->auth = $auth; } Auth $auth
  4. 10 アノテーションについて プログラムにコメント/タグ付けといったメタ情報を付与することで機能や 属性を持たせる記述方法。 Laravel5では、routingやeventにアノテーションを使用可能。 /** * お知らせ通知APIコントローラー * @Middleware(“apikey.auth")

    */ class NoticeController extends Controller { /** * ユーザーのお知らせ内容を検索して取得する * @Get("notices") * @Middleware("user.auth") * @return string */ public function getNoticeSearch() { : } } Middleware: apikey.auth, user.auth URI: http://webapi.hogehoge.jp/notices アノテーションの内容が Routingに関連付けされる
  5. 11 Laravel5の環境構築手順 1. composerのインストール mkdir -p ~/bin cd ~/bin curl

    -sS https://getcomposer.org/installer | php ln -s composer.phar composer vi ~/.bash_profile PATH=$PATH:$HOME/bin:~/.composer/vendor/bin 2. Laravelのインストール yum -y install git composer global require "laravel/installer=~1.1" 3. Laravelのアプリを作成 cd /usr/local/apache2 laravel new (アプリ名) chmod 777 -R (アプリ名)/storage 4. 初期設定 cd /usr/local/apache2/(アプリ名) .env ファイルの編集(※環境に合わせて適宜) 環境構築はコマンドベースでOK ※ZipArchive not foundが表示される場合は、pecl install zipで追加。
  6. 12 Laravel5推奨パッケージ "require": { "laravel/framework": "5.0.*", "laravelcollective/annotations": "~5.0", "laravelcollective/html": "~5.0",

    "barryvdh/laravel-debugbar": "~2.0" }, Laravel Collective Annotations/Form&HTML Laravel Debugger composer.jsonの追加例 composer update ライブラリの環境構築も composerで楽々 インストール手順
  7. 13 Laravel5リクエストライフサイクル index.php (1)フロントコントローラー controller model view app providers request

    参考 http://laravel.com/docs/master/lifecycle response bootstrap (3)リクエスト⇒レスポンス処理 services (4) コンテナに登録し、 サービスを起動 (2)フレームワークを読み込み middleware router (5)リクエストをフィルター+ルーターへ auth (6) Controllerを呼び出し (7)レスポンス処理(テンプレートエンジン等) HttpKernel
  8. 14 Laravel5のフォルダ構成 ├─app (アプリケーションフォルダ) │ ├─Bootstrap │ ├─Commands │ ├─Console

    │ │ └─Commands (バッチ実装) │ ├─Events │ ├─Exceptions │ ├─Handlers │ │ ├─Commands │ │ └─Events │ ├─Http │ │ ├─Controllers (コントローラー) │ │ ├─Middleware (フィルター) │ │ └─Requests (フォーム系リクエスト) │ ├─Providers (サービスプロバイダー) │ └─Services : : ├─bootstrap ├─config (アプリケーション設定ファイル) ├─database │ ├─migrations (DBマイグレーション) │ └─seeds ├─public (ドキュメントルート) │ └─css ├─resources │ ├─assets │ │ └─less │ │ └─bootstrap │ │ └─mixins │ ├─lang │ │ └─en │ └─views (テンプレートファイル) ├─setting ├─storage │ ├─app │ ├─framework │ │ ├─cache │ │ ├─sessions │ │ └─views │ └─logs (ログ出力先) ├─tests └─vendor appフォルダ直下にデータアク セスオブジェクトを配置するの が、L5の流儀。
  9. 16 CLI: artisan Laravel3よりコマンドラインインターフェイス artisan 追加。 アプリケーションのルートディレクトリでコマンド実行することで開発をサポート。 php artisan make:model

    (モデル名) ⇒ app/(モデル名).php およびdatabase/migrations以下に マイグレーションファイルを作成 php artisan migrate:status ⇒ DBマイグレーションの状態チェック php artisan migrate ⇒ DBマイグレーションの反映 1. Model/Migration追加 アルチザン
  10. 17 CLI: artisan php artisan make:controller (コントローラー名) ⇒ app/Http/Controllers 以下にクラスファイルを作成

    php artisan route:scan ⇒ ルーティングの情報を再読み込みして更新 ⇒ storage/framework/route.scanned.phpにキャッシュを生成 2. Controller追加 3. Routing設定 1) コントローラーにルーティングのアノテーションを記述。 2) app/Providers/AnnotationsServiceProvider.phpの$scanRoutesにコントローラクラスパスを追記。 アルチザン
  11. 20 開発TIPS:ログについて Log::info(‘ログ内容’); Log::warn(‘ログ内容’); Log::debug(‘ログ内容’); Log::error(‘ログ内容’); などRFC5424で定義されている7レベルをサポート /storage/logs/laravel-YYYY-MM-DD.log に出力 すべて

    任意のファイルにログファイルを出力したいときは、同梱されているログライブラリ Monologを使って独自実装。 public static function writeLog($level, $message) { $log = new MonologLogger(MonologLogger::INFO); $log->pushHandler( $handler = new RotatingFileHandler( storage_path() . '/logs/'. $level. '.log', 365, MonologLogger::DEBUG ) ); $formatter = new LineFormatter("[%datetime%]¥t".$_SERVER['REMOTE_ADDR']."¥t%message%¥t%context%¥t%extra%¥n", null, true, true); $handler->setFormatter($formatter); $log->addInfo($message); } ※config/app.php の ‘log’=>’daily’の場合
  12. 21 開発TIPS:バリデーション(値検査)について use ValidatesRequests; 方法1: ValidatesRequestトレイトを差し込んでバリデーション $this->validate($request, $rules, $messages); 方法2:

    Validatorファサード(コンテナクラス)を使って明示的にバリデーション $validator = Validator::make(Input::all(), $rules, $messages); $validator->setAttributeNames($attributes); if ($validator->fails()) { return redirect(‘books/create’)->withErrors($validator)->withInput(); } // continue processing... ※前のページに戻る処理がValidatesRequestsトレイト内で実装されている。 日本語に対応させるためにはこれをベースに拡張することで可能。
  13. 22 開発TIPS:BLOB型のデータ操作について BLOB型は、フレームワークとしてはまだ未サポート。プリペアドステートメントを自分で 作ってbindValue(保存時)/bindColumn(取得時)することで、操作可能。 $conn = $this->getConnection(); $grammar = $conn->getQueryGrammar();

    $query = new QueryBuilder($conn, $grammar, $conn->getPostProcessor()); $query->from($this->getTable()); $attributes = $this->getAttributes(); $sql = $grammar->compileInsert($query, $attributes); $stmt = $conn->getPdo()->prepare($sql); $id = 1; foreach ($attributes as $key => $value) { if ($key == 'data') { $stmt->bindValue($id, fopen($value, 'rb'), PDO::PARAM_LOB); } else { $stmt->bindValue($id, $value); } $id++; } $stmt->execute(); 保存時の例:
  14. 23 開発TIPS:バッチについて Command追加 artisanでコマンドを追加。artisanからコマンドを実行。 php artisan make:console (コマンドクラス名) –-command=(コマンド名) 

    app/Console/Commands/(コマンドクラス名).phpを追加。  app/Console/Kernel.phpの$commandsプロパティにクラスパスを追加す ることでartisanから(コマンド名)を実行可能。 Command実行 php artisan (コマンド名) ⇒ コマンドクラスのfireメソッドの内容が実行されます。
  15. 27 速度改善(2):フレームワークキャッシュの適用 php artisan config:cache  設定ファイルのマージ。  vendor/config.php(権限がない場合はstorage/framework/config.php)を作成。 

    php artisan config:clearでクリア。 php artisan optimize  コアクラスのファイルをまとめる。  vendor/compiled.php(権限がない場合はstorage/framework/compiled.php)を作成。  bootstrap/autoload.phpから読み込んでいる。  php artisan clear-compiledでクリア。
  16. 28 速度改善(3):アプリケーションキャッシュの組み込み $top = Cache::remember('recentTop', Config::get('cache.span'), function () { return

    Top::findRecent(); }); $top = Top::findRecent(); ‘recentTop’というキーのキャッシュがなければ、クロージャの中身を実行。 その内容をCongif::get(‘cache.span’)分間キャッシュで保持。 簡単に既存実装のキャッシュ化ができる。 例:TopモデルからfindRecentというメソッドでデータを取得。 Cacheクラスを適用する場合…
  17. 29 まとめ  Laravel5の開発は楽しい!  DI  Trait  アノテーション

     フルスタックなフレームワーク。  composerにより外部の機能も取り込みやすい。  そのままでは遅い!…でも、opcacheやキャッシュ など組み合わせれば、使える、と思う!
  18. 32 補足: 開発環境(laravel/homestead) vagrant box add laravel/homestead git clone https://github.com/laravel/homestead.git

    Homestead bash init.sh Vagrantを使った開発環境も提供 • Ubuntu 14.04 • PHP 5.6 • HHVM • Nginx • MySQL • Postgres • Node (With Bower, Grunt, and Gulp) • Redis • Memcached • Beanstalkd • Laravel Envoy • Blackfire Profiler 参考 http://laravel.com/docs/5.0/homestead