ytake Hatena

Web Application Developer

PHPカンファレンス関西2016 登壇しました

PHPカンファレンス関西2016

去年参加できなかったPHPカンファレンス関西に参加してきました。

conference.kphpug.jp

その代わり今年は福岡に参加できませんでした。

今回は30分枠で設計寄りな[アスペクト指向によるアプリケーション拡張]で登壇しました。

日頃開発しているアプリケーションに、
アスペクト指向で取り上げられる関心毎を、
基盤的関心毎、ユースケースによる関心毎、
拡張の分離といった観点でお話しさせていただきました。

これらはアスペクト指向を取り入れるに当たって、大事なもの、
というわけではなく常につきまとう問題にどう立ち向かっていくか、というものです。

そして「サンプルを公開します!」の通り、
スライドの内容に合わせて、LaravelとLaravel-Aspectパッケージを利用した
サンプルコードを公開してあります。

github.com

アプリケーションの基本的な動作は、

  • POST: /product/purchase
  • POST: /product/reserve

で基本動作をするものになっています。

  • POST: /product/aspect/purchase
  • POST: /product/aspect/reserve

上記の二つは、基本動作をアスペクト指向を用いて拡張した例になっています。

たとえば、分離のためのモジュールはコインの表裏関係、という部分ですが、
具体的には下記の様になっています。

<?php

namespace App\Services\Aspect;

use App\Annotation\EarnPoint;
use App\Annotation\PaymentPoint;
use Ytake\LaravelAspect\Annotation\Loggable;

/**
 * Class ProductPayment
 * 商品購入拡張クラス
 */
class ProductPayment extends \App\Services\ProductPayment
{
    /**
     * @Loggable
     * @EarnPoint
     * @PaymentPoint
     *
     * @param int $id
     *
     * @return bool
     */
    public function purchase(int $id)
    {
        return $this->repository->createPurchase($id);
    }
}

まずはアスペクトを利用し、ほとんど手を加えていない状態に分割します。
モジュールは次の通りです

<?php

namespace App\Aspect\Interceptor;

use App\Services\PointBalance;
use Ray\Aop\MethodInterceptor;
use Ray\Aop\MethodInvocation;

class EarnPointInterceptor implements MethodInterceptor
{
    /** @var PointBalance  */
    protected $balance;

    // 付与ポイント
    const EARN_POINT = 1;

    /**
     * PaymentPointInterceptor constructor.
     *
     * @param PointBalance $balance
     */
    public function __construct(PointBalance $balance)
    {
        $this->balance = $balance;
    }

    /**
     * @param MethodInvocation $invocation
     *
     * @return mixed
     */
    public function invoke(MethodInvocation $invocation)
    {
        $result = $invocation->proceed();
        // ポイント付与
        $this->balance->point(self::EARN_POINT);
        return $result;
    }
}

動作拡張したいメソッドやクラスなどが動作する場合に、処理を追加しています。

内部のコードでだいたいの考え方等はすぐに理解できるとおもいます。
スライドを見ながら触ってみてください。

カンファレンスに参加して

今回の関西には初めて参加しました。
コーヒースペースでなかなか本編では聞けない様な話や、 世間話をしていたり、 web compoents周りの講演に参加したりしていました。

自分の講演後にはアスペクトに興味を持った方や、実際にどう使うかなど多義にわたる質問が廊下で繰り広げられていました。

懇親会終了技も2時過ぎまで呑みに・・・ f:id:ytakezawa:20160721021839j:plain

とても楽しかったのでまた参加したい!