SlideShare a Scribd company logo
1 of 58
LaravelでAPI定義を管理する
Laravel/Vue勉強会#2@2017/11/24
KenjiroKubota
Pro le
Kenjiro Kubota
istyle.inc
自称テクノロジー本部銀髪担当
PHP, HHVM/Hack, Javascript
今日話すこと
ADR
REST API Level3
Swagger PHP
Vueの話はありません。ごめんなさい。
REST APIの定義管理ってどうしてます
Wiki?
Markdownファイル?
何かしらのAPIドキュメントツール?
API利用者(フロントエンジニア)にこんなこと言われない?
「実際に返ってくるパラメータと定義書違くない 」
(あ、ドキュメント更新してないっす)
理想は実装 = 定義書ですよね
実装から定義書を生成する話
踏まえて、今日話すこと
ADR = API実装の話
REST API Level3 = レスポンス形式の話
Swagger PHP = APIドキュメントの話
ADR
ADR
Action Domain Responder
の略です。Laralab vol.1という勉強会で紹介させていただきました。
Responsableを使ったADR実装
https://www.slideshare.net/KenjiroKubota/responsableadr
MVCから派生したUIアーキテクチャパターン
Model Domain
View Responder
Controller Action
MVCと違うところ
1つのEndpointに1つのActionClass
参考実装
今週発売のゲームソフトを返すエンドポイントを作ります。
(返すのはダミーデータです)
Github: kubotak-is/laravel-swagger-sample
<?php
namespace AppHttpActionApi;
final class GetThisWeeksGameSoftwareRelease
{
private $service;
public function __construct(ThisWeeksGameSoftwareRelease $service)
{
$this->service = $service;
}
public function __invoke(GetThisWeeksGameSoftwareReleaseRequest $request): Responder
{
$validated = $request->validated();
$limit = $validated['limit'] ?? 3;
$offset = $validated['offset'] ?? 0;
$collection = $this->service->getCollection((int) $limit, (int) $offset);
return new GetThisWeeksGameSoftwareReleaseResponder($collection);
}
}
class RouteServiceProvider extends ServiceProvider
{
public function register()
{
parent::register();
/** @var Router $router */
$router = $this->app['router'];
$router->group(['prefix' => 'api'], function (Router $router) {
$router->get(
'/game_software/release/week',
['uses' => GetThisWeeksGameSoftwareRelease::class]
);
});
}
}
RouterでDispatchされたClassは __invoke() が実行される
FatContollerにならない
(おまけ)FormRequest
<?php
namespace AppHttpRequestApi;
use IlluminateFoundationHttpFormRequest;
class GetThisWeeksGameSoftwareReleaseRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'limit' => 'integer|min:1',
'offset' => 'integer|min:0',
];
}
}
ActionClass
メソッドインジェクションしたFormRequestは既にバリデーション済
みのパラメータを取得できる。
Laraevl5.5からは ->validated(); でバリデーション定義されてかつ、バ
リデーションされた値のみ取得が可能
public function __invoke(GetThisWeeksGameSoftwareReleaseRequest $request): Responder
{
$validated = $request->validated();
$limit = $validated['limit'] ?? 3;
$offset = $validated['offset'] ?? 0;
$collection = $this->service->getCollection((int) $limit, (int) $offset);
return new Responder($collection);
}
Responder
<?php
namespace AppHttpResponderApi;
use AppHttpResponderHateoasResponder;
use IlluminateContractsSupportResponsable;
use AppDomainCollectionGameSoftwareCollection;
class GetThisWeeksGameSoftwareReleaseResponder implements Responsable
{
use HateoasResponder;
private $resource;
public function __construct(GameSoftwareCollection $collection)
{
$this->resource = $collection;
}
public function toResponse($request): IlluminateHttpResponse
{
return $this->hal($this->resource);
}
}
REST API Level3
RESTの4段階のModel
https://martinfowler.com/articles/richardsonMaturityModel.html
REST API Model
Level 0
HTTPを用いてXMLレスポンスを返却すること
Level 1
URLでリソースを表すこと
Level 2
HTTPメソッドを正しく使い分けること
Level 3
ハイパーメディアコントロール
ハイパーメディアコントロール
Webサイトの様にテキストのリンクを利用して利用者をナビゲートす
るように、
APIのレスポンスにも別のエンドポイントへのナビゲートを含めること
HATEOAS
Hypermedia As The Engine Of Application State
HATEOASとは
RestfullAPIを拡張するアーキテクチャパターン
状態遷移を表現する
レスポンス内にリンクを含める
そのリンクを辿ることで状態遷移を表現する
willdurand/hateoas
https://github.com/willdurand/Hateoas
アノテーションを追加することでレスポンスパラメータを拡張するライ
ブラリ
$ composer require willdurand/hateoas
Laravelでアノテーションを利用できるようにする
<?php
namespace AppProviders;
use DoctrineCommonAnnotationsAnnotationReader;
use DoctrineCommonAnnotationsAnnotationRegistry;
use IlluminateSupportServiceProvider;
class AnnotationRegisterServiceProvider extends ServiceProvider
{
public function register()
{
$loader = require base_path().'/vendor/autoload.php';
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
}
}
AppProvidersAnnotationRegisterServiceProvider::class,
Entity
<?php
namespace AppDomainEntity;
use AppHttpResponderHateoasResource;
use PHPMentorsDomainKataEntityEntityInterface;
class GameSoftware implements EntityInterface, HateoasResource
{
protected $id;
protected $title;
protected $description;
protected $releaseDate;
protected $price;
protected $retailPriceDesired;
protected $platform;
protected $thumbnail;
}
Add Annotation
/**
* Class GameSoftware
* @package AppDomainEntity
* @HateoasRelation(
* "self",
* href = "expr('/api/game_software/' ~ object.getId())"
* )
* @HateoasRelation(
* "page",
* href = "expr('/game_software/' ~ object.getId())"
* )
*/
class GameSoftware implements EntityInterface, HateoasResource
{
/**
* @var string
* @Accessor("getReleaseDate")
*/
protected $releaseDate;
/**
* @var int
* @Type("int")
*/
protected $price;
public function getId(): int
{
return $this->id;
}
public function getReleaseDate(string $format = "Y-m-d H:i:s"): string
{
return (new DateTime($this->releaseDate))->format($format);
}
<?php
namespace AppHttpResponder;
use HateoasHateoas;
use HateoasHateoasBuilder;
use IlluminateHttpResponse;
use HateoasUrlGeneratorCallableUrlGenerator;
trait HateoasResponder
{
protected function hal(
HateoasResource $resource,
int $status = 200,
array $headers = []
): Response
{
return new Response(
$this->builder()->serialize($resource, 'json'),
$status,
array_merge(['Content-Type' => 'application/hal+json'], $headers)
);
}
protected function builder(): Hateoas
{
return HateoasBuilder::create()
->setUrlGenerator(
null,
new CallableUrlGenerator(function ($route, array $parameters) {
return route($route, $parameters);
})
)
->build();
}
}
<?php
namespace AppHttpResponderApi;
use AppHttpResponderHateoasResponder;
use IlluminateContractsSupportResponsable;
use AppDomainCollectionGameSoftwareCollection;
class GetThisWeeksGameSoftwareReleaseResponder implements Responsable
{
use HateoasResponder;
private $resource;
public function __construct(GameSoftwareCollection $collection)
{
$this->resource = $collection;
}
public function toResponse($request): IlluminateHttpResponse
{
return $this->hal($this->resource);
}
}
こんな感じのレスポンスになります。
{
"id": 1,
"title": "スーパーマリオオデッセイ",
"description": "マリオ、世界の旅へ。Nintendo Switch向けソフトに新作3Dマリオが登場します。…",
"release_date": "2017-10-27 00:00:00",
"price": 5545,
"retail_price_desired": 6458,
"platform": "Nintendo Switch",
"thumbnail": "https://images-na.ssl-images-amazon.com/images/I/….jpg",
"_links": {
"self": {
"href": "/api/game_software/1"
},
"page": {
"href": "/game_software/1"
}
}
}
(おまけ)今回使ったHateoas以外のライブラリの紹介
zendframework/zend-hydrator
https://docs.zendframework.com/zend-hydrator/
public function findReleaseThisWeek(int $limit, int $offset): GameSoftwareCollection
{
$data = $this->criteria->getReleaseThisWeek($limit, $offset);
$collection = new GameSoftwareCollection();
foreach ($data as $item) {
$hydrator = new ReflectionHydrator();
$namingStrategy = new CompositeNamingStrategy([
'release_date' => new MapNamingStrategy([
'release_date' => 'releaseDate'
]),
'retail_price_desired' => new MapNamingStrategy([
'retail_price_desired' => 'retailPriceDesired'
]),
]);
$hydrator->setNamingStrategy($namingStrategy);
$gameSoft = $hydrator->hydrate(
$item,
new GameSoftware()
);
$collection->add($gameSoft);
}
return $collection;
}
protected, privateプロパティに対して
constructやsetterなしでオブジェクトマッピングしてくれます
Swagger PHP
Swaggerとは
https://swagger.io
THE WORLD'S MOST POPULAR API TOOLING
RESTful APIのドキュメントや、サーバ、クライアントコード、エディ
タ、またそれらを扱うための仕様などを提供するフレームワーク
Swagger Speci cationをSwagger UIに読み込ませることで定義書を生
成する
Swagger PHPではアノテーションを利用して
Swagger Speci cation(json)を生成
実装 = 定義書ができる!
DarkaOnLine/L5-Swagger
https://github.com/DarkaOnLine/L5-Swagger
LaravelでSwaggerPHPを使うライブラリ
ArtisanコマンドでSwagger Speci cationを生成してSwaggerUIに適用
したページが表示できる
$ composer require "darkaonline/l5-swagger:5.5.*"
L5SwaggerL5SwaggerServiceProvider::class,
開発環境のみ利用したいのでProviderでLocalとDevelop環境の場合の
み登録する
$env = $this->app->environment();
if ($env === 'develop' || $env === 'local') {
$this->app->register(L5SwaggerL5SwaggerServiceProvider::class);
}
$ php artisan l5-swagger:publish
con g/l5-swagger.php
public/vendor/l5-swagger
resources/views/vendor/l5-swagger
必要なファイルをpublishで移動
HATEOASで利用したアノテーション登録でSwagger PHPのアノテーシ
ョン @SWG のClassが見つからないエラーが発生するのでこのアノテーシ
ョンはIgnoreさせる
class AnnotationRegisterServiceProvider extends ServiceProvider
{
public function register()
{
$loader = require base_path().'/vendor/autoload.php';
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
AnnotationReader::addGlobalIgnoredNamespace('SWG'); // Add
}
}
Modelの定義
/**
* Class GameSoftware
* @package AppDomainEntity
* @HateoasRelation(
* "self",
* href = "expr('/api/game_software/' ~ object.getId())"
* )
* @HateoasRelation(
* "page",
* href = "expr('/game_software/' ~ object.getId())"
* )
* @SWGDefinition(
* type="object",
* @SWGXml(name="GameSoftware")
* )
*/
class GameSoftware implements EntityInterface, HateoasResource
プロパティのアノテーション
/**
* @var int
* @SWGProperty(format="int64")
*/
protected $id;
/**
* @var string
* @SWGProperty()
*/
protected $title;
/**
* @SWGProperty(
* property="_links",
* type="object",
* @SWGProperty(
* property="self",
* type="object",
* @SWGProperty(
* property="href",
* type="string"
* )
* ),
* @SWGProperty(
* property="page",
* type="object",
* @SWGProperty(
* property="href",
* type="string"
* )
* )
* )
*/
Collectionの定義
/**
* Class GameSoftwareCollection
* @package AppDomainCollection
* @SWGDefinition(
* type="object",
* @SWGXml(name="GameSoftwareCollection")
* )
*/
class GameSoftwareCollection implements EntityCollectionInterface, HateoasResource
{
/**
* @var GameSoftware[]
* @SerializedName("game_software")
* @SWGProperty(
* property="game_software",
* @SWGXml(name="GameSoftware", wrapped=true)
* )
*/
protected $entities = [];
Responseの定義
(ResponderClass)
/**
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
* @SWGResponse(
* response="GetThisWeeksGameSoftwareReleaseResponder",
* description="今週発売のゲームを返す",
* @SWGSchema(ref="#/definitions/GameSoftwareCollection")
* )
*/
public function toResponse($request): IlluminateHttpResponse
{
return $this->hal($this->resource);
}
RequestParameterの定義
/**
* @SWGParameter(
* parameter="GetThisWeeksGameSoftwareReleaseRequest_limit",
* name="limit",
* description="取得件数",
* in="query",
* required=false,
* type="integer",
* format="int32"
* )
* @SWGParameter(
* parameter="GetThisWeeksGameSoftwareReleaseRequest_offset",
* name="offset",
* description="取得位置",
* in="query",
* required=false,
* type="integer",
* format="int32"
* )
*/
public function rules(): array
Endpointの定義
/**
* Class GetThisWeeksGameSoftwareRelease
* @package AppHttpActionApi
* @SWGGet(
* path="/game_software/release/week",
* summary="今週発売のゲームソフト",
* description="",
* consumes={"application/json"},
* produces={"application/hal+json"},
* @SWGParameter(ref="#/parameters/GetThisWeeksGameSoftwareReleaseRequest_limit"),
* @SWGParameter(ref="#/parameters/GetThisWeeksGameSoftwareReleaseRequest_offset"),
* @SWGResponse(
* response="default",
* ref="#/responses/GetThisWeeksGameSoftwareReleaseResponder"
* )
* )
*/
final class GetThisWeeksGameSoftwareRelease
swagger.jsonの生成
$ php artisan l5-swagger:generate
開発環境にデプロイする際に実行
もしくは config/l5-swagger.php の 'generate_always' => true にすることで
SwaggerUIにアクセスするたびに生成されます。
/api/documentation にアクセスするとSwaggerUIが展開される。
エンドポイントを変更したい場合は config/l5-swagger.php の
'api' => 'api/documentation', の項目から変更できます。
まとめ
ADRで責務を明確に
REST API Level3はHAETOASで実現
Swagger-php(L5-Swagger)を利用して実装=定義書
ADRで実装することでアノテーションもModel,Response,Request
で分離できる
PRレビューを行っている場合はアノテーションと実装が一致して
いるかを確認事項にできる
フロントエンジニアに最新の状態の定義書を提供できる
thanks :)

More Related Content

What's hot

Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみたTakeo Noda
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjHisateru Tanaka
 
Laravelのパッケージのテストに便利なパッケージ
Laravelのパッケージのテストに便利なパッケージLaravelのパッケージのテストに便利なパッケージ
Laravelのパッケージのテストに便利なパッケージYuta Nagamiya
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4アシアル株式会社
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015ichikaway
 
flyingV Laravel & AWS 經驗分享
flyingV Laravel & AWS 經驗分享flyingV Laravel & AWS 經驗分享
flyingV Laravel & AWS 經驗分享Eugene Wang
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方Ryo Tomidokoro
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
プライベートAPIとの闘い
プライベートAPIとの闘いプライベートAPIとの闘い
プライベートAPIとの闘い107steps
 
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行Yasuo Ohgaki
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリMasaki Oshikawa
 
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4leverages_event
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証についてTakeo Noda
 
Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Yoshihisa Ozaki
 
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話Kenjiro Kubota
 

What's hot (20)

Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみた
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
 
Laravelのパッケージのテストに便利なパッケージ
Laravelのパッケージのテストに便利なパッケージLaravelのパッケージのテストに便利なパッケージ
Laravelのパッケージのテストに便利なパッケージ
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
 
flyingV Laravel & AWS 經驗分享
flyingV Laravel & AWS 經驗分享flyingV Laravel & AWS 經驗分享
flyingV Laravel & AWS 經驗分享
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
プライベートAPIとの闘い
プライベートAPIとの闘いプライベートAPIとの闘い
プライベートAPIとの闘い
 
Deep Dive C# 6.0
Deep Dive C# 6.0Deep Dive C# 6.0
Deep Dive C# 6.0
 
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリ
 
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証について
 
Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要
 
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
WordPress on HHVM + Hack
WordPress on HHVM + HackWordPress on HHVM + Hack
WordPress on HHVM + Hack
 

Similar to LaravelでAPI定義を管理する

最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)Rui Hirokawa
 
Garageを触ってみた
Garageを触ってみたGarageを触ってみた
Garageを触ってみたYoichi Toyota
 
<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー<第1回>Laravelハンズオンセミナー
<第1回>LaravelハンズオンセミナーTatsuyoshi Mashiko
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravelRisa Ohnishi
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTKenichi Tachibana
 
Php5 4勉強会
Php5 4勉強会Php5 4勉強会
Php5 4勉強会Yuji Otani
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門Hiroaki Murayama
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
はじめての FuelPHP
はじめての FuelPHPはじめての FuelPHP
はじめての FuelPHPSho A
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023Rui Hirokawa
 

Similar to LaravelでAPI定義を管理する (20)

最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
Garageを触ってみた
Garageを触ってみたGarageを触ってみた
Garageを触ってみた
 
<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Cakephp api
Cakephp apiCakephp api
Cakephp api
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
 
Php5 4勉強会
Php5 4勉強会Php5 4勉強会
Php5 4勉強会
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
はじめての FuelPHP
はじめての FuelPHPはじめての FuelPHP
はじめての FuelPHP
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023
 

More from Kenjiro Kubota

いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発Kenjiro Kubota
 
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演) アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演) Kenjiro Kubota
 
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例Kenjiro Kubota
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Kenjiro Kubota
 
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界Kenjiro Kubota
 
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組みPHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組みKenjiro Kubota
 
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話Kenjiro Kubota
 
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たFirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たKenjiro Kubota
 
introducing vue-wait-component
introducing vue-wait-componentintroducing vue-wait-component
introducing vue-wait-componentKenjiro Kubota
 
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話Kenjiro Kubota
 
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey2017: A CSS Design Odyssey
2017: A CSS Design OdysseyKenjiro Kubota
 
Introducing hhvm hack-async
Introducing hhvm hack-asyncIntroducing hhvm hack-async
Introducing hhvm hack-asyncKenjiro Kubota
 
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!Kenjiro Kubota
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦うKenjiro Kubota
 
Laravel aspectで関心の分離
Laravel aspectで関心の分離Laravel aspectで関心の分離
Laravel aspectで関心の分離Kenjiro Kubota
 

More from Kenjiro Kubota (16)

いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
 
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演) アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
 
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組みPHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
 
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
 
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たFirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
 
introducing vue-wait-component
introducing vue-wait-componentintroducing vue-wait-component
introducing vue-wait-component
 
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話
 
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
 
Introducing hhvm hack-async
Introducing hhvm hack-asyncIntroducing hhvm hack-async
Introducing hhvm hack-async
 
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
 
Laravel aspectで関心の分離
Laravel aspectで関心の分離Laravel aspectで関心の分離
Laravel aspectで関心の分離
 

LaravelでAPI定義を管理する