このエントリーをはてなブックマークに追加

カルテット開発部の澤井です。

久しぶりのブログに、何を書こうかと色々と考えました。
悩んだ結果、やはり仕事で使う機会の多いSymfonyについて書こうと思います。

具体的には、Symfonyのイベントを使って、機能を拡張する簡単な例について書きます。

イベントについては、Built-in Symfony Events (Symfony Docs)に詳しい解説があります。

概要

本記事では、以下のような要望について考えます。

  • 通常のページでは、コントローラから返された連想配列を、Twigテンプレートを使って、HTMLのテーブルとして出力
  • 特定のページでは、コントローラから返された連想配列を、CSVファイルとしてダウンロード

本記事の目標は、イベントを使うことで、CSVファイルをダウンロードするという機能を一箇所で管理して、変更がしやすく、再利用性の高いコードを実現することです。

ちなみに、HTTPレスポンスヘッダに、以下の内容を指定することで、CSVファイルをダウンロードさせることができます。

  • Content-Typeヘッダに、text/csvを指定
  • Content-Dispositionヘッダに、attachmentを指定

コントローラの実装

まずは、@Templateアノテーションを使って、コントローラが返す連想配列を、テンプレートを使って表示します。

次章で、CSVファイルとしてダウンロードする機能を、イベントを使って実現します。

/**
 * @Route("/some")
 */
class SomeController extends Controller
{
    /**
     * @Route("/")
     * @Template
     */
    public function indexAction(Request $request)
    {
        // ...
        // $dataへ出力内容を保存する処理
        // ...

        return [ 'data' => $data ]
    }
    
    // ...

}

イベントの実装

CSVファイルをダウンロードする機能を、Symfonyのビルトインイベントであるkernel.viewイベントを使って実装します。

今回はサンプルなので、出力するデータは一次元配列かつカンマや改行などを含まないものとします。

namespace AppBundle\Listener;

// ...

class DownloadListener
{
    /**
     * @param FilterControllerEvent $event
     */
    public function onKernelController(FilterControllerEvent $event)
    {
        $controller = $event->getController();
        if (!is_array($controller)) {
            return;
        }
        if ($controller[0] instanceof AssetController) {
            $event->getRequest()->attributes->set('is_download', true);
        }
    }

    /**
     * @param GetResponseForControllerResultEvent $event
     */
    public function onKernelView(GetResponseForControllerResultEvent $event)
    {
        if ($event->getRequest()->attributes->get('is_download')) {
            $controllerResult = $event->getControllerResult();
            $response         = new Response(
                implode(',', $controllerResult['data']),
                Response::HTTP_OK,
                [
                    'Content-Type' => 'text/csv',
                    'Content-Disposition' => 'attachment; filename=sample.csv',
                ]
            );
            $event->setResponse($response);
        }
    }
}

イベントを使うことで、CSVファイルをダウンロードする機能を、イベントリスナへ集約することができました。

その結果、他のページでCSVファイルをダウンロードする機能が必要になったときに、個別にコントローラへダウンロード機能を追加する必要はありません。

また、CSVファイルの文字コードを変換するといった、新たな要望が発生したときも、イベントリスナの修正だけで対応できます。

まとめ

今回は、イベントを使うことで、変更がしやすくて、再利用性の高いコードにすることができました。

Symfonyは、色々な場面でイベントを使います。 イベントに慣れて、上手に使うことが、Symfonyを使いこなすためのコツの1つかもしれません。

簡単な例でしたが、本記事でイベントの利点が伝われば嬉しいです。

以上、澤井でした。

カルテット開発部では、Symfonyを使いこなしたい仲間を募集しています!


このエントリーをはてなブックマークに追加

7月半ばに、株式会社カルテットコミュニケーションズの開発部メンバーとして入社しました、粟屋です。
初投稿ということで、入社の経緯や私の役割などについて書きたいと思います!

リスティング広告を見て会社を知りました

カルテットのことを初めて知ったのは、今年の2月ごろです。
EC-CUBE(EC向けのオープンソースCMS)の勉強会に参加した時にフレームワークSymfonyについて耳にし、
Googleで検索していた時に見かけたのが、カルテット開発部の求人広告でした。

「Symfonyにも自信のある会社が名古屋にあるのか〜」となんとなく気になってクリックしました。
(だいぶうろ覚えですが。。)

43503661-26d5bb6e-959b-11e8-80c5-9d9f8f1681c9

採用LPを読んで、なるほど、

リスティング広告の運用代行企業が、
リスティングの業務支援サービスを自社で開発、外部に提供し、
その開発求人もしっかりリスティングで行なっているのか!

…と、何か点と点がつながったような感動があったのをよく覚えています。
リスティング広告という分野の専門性の高さ、変化の速さを多少知っていたので、驚きが一層大きかったです。

採用LPだけでなくコーポレートサイトや開発ブログ、メンバーの公開SNSなどいろいろ見ていくうち、本当に優秀なエンジニアさんが集まって生き生きと活躍されているように感じました。

採用LPのメッセージ通り、開発者が「快適に働ける環境を作るということを、何よりも大切に考えて」いるのだろうな、そんな環境で一緒にサービス改善に携わってみたい!…そんな想いから応募を決めました。

開発部初のWebデザイナーとして入社しました

私はこれまで、少人数のWeb制作会社で中小企業向けのWebサイト・LP・印刷物のデザイン制作や簡単な更新業務などを担当していました。

情報が適切にターゲットに届くかどうか、UIが使いやすいかどうかといった視点に加え、
制作現場(ディレクション〜コーディング・実装)から構築後のWeb担当者のサイト運用フローまでのどこかに過剰な負担がないか注意し、全体をよりよくすることも大切な視点だと考え取り組んでいました。

仕事では受託が主でしたが、次第にアプリやサービスのデザイン・開発に強い興味を持つようになり、自主制作や学習をしていました。

もともとコードを書くことも好きです。Gulpやらnpmやら静的サイトジェネレータやらGitやらといった開発ツールも、Terminalをいじりながら個人的に活用してきました。

…そんな経験と好奇心を武器?に、この度Webデザイナーとして入社しました。
そして、カルテット開発部としては私が初のデザイナー職となります。

screenshot 2018-08-01 16 04 40

私たちが開発しているのは、リスティング広告の運用支援ツール「Lisket」です。
リスティング広告の運用に必要な、膨大な作業の効率化に役立つ様々なツールの集合体となっています。

どの機能もベースとなるフレームワークは共通ですが、細かなUIには今のところばらつきがあります。
UIガイドラインの策定とアップデート、そしてその実装をしながら、ユーザーはより使いやすく、開発もより一層スマートになるよう日々改善していきます。

当面はフロントエンドチームの一員としてお手伝いしながら、色々なことを吸収していきます。
最終的にはLisket全体のUIに関するディレクションを担い開発を引っ張っていきたいです。

最後に

もともと受託制作メインのデザイナーであり、自社開発のサービスのデザイン実務は初めてのチャレンジとなります。
開発部やコンサルティング部・営業部の皆さんにも助けていただき、協力しながらより良いプロダクト作りに貢献していきます。

どうぞ、今後ともよろしくお願いいたします!


このエントリーをはてなブックマークに追加

ご挨拶

はじめまして!
4月半ばにカルテット開発部にジョインしました下田と申します。
今後ともどうぞ宜しくお願いいたします!m(_ _)m

来歴

社会人になってすぐはPHPとかJavaとかインフラとかいろいろ経験した後、途中でRailsエンジニアに鞍替え。
1年ほどでまたPHPに戻り、SymfonyをメインにWebアプリケーションエンジニアとして働いています。

入社のきっかけ

転職を考え始めたときに、諸々の事情で地方への移住が決定しており、なかなか具体的な転職活動に踏み切れていなかったところ、
Symfony Meetupで弊社CTOのたつきちさんより

「そういう事情なら、完全リモートワークで弊社はいかがですか?」

とお声がけ頂いたのがきっかけでした。

もともとこの技術ブログの読者で会社については知っていたこと、
個人的にSymfony力や設計力を伸ばしていきたいと考えていたこともあり、
二つ返事で入社させていただく運びとなりました。笑

働き方について

そんな訳で、本社は名古屋ですが、現在は神奈川の自宅から毎日仕事をしています。
(この記事も現在進行系で自宅のリビングで書いています)

カルテット開発部では、遠方からの完全リモート形態での入社は僕が初でしたが、
もともと僕の入社前から半リモート形態(週に数回出社や時短出社+自宅作業など)の働き方をされているエンジニアさん達が既に数名いらっしゃったので、
場所に縛られずに開発を進めるための仕組みはほぼ揃っていました。

おかげさまで、入社から2ヶ月が経とうとしておりますが、何の問題もなく仕事を進めることができています :smiley:

以下、リモートで働く上での仕組みや工夫、実践していることをを幾つか紹介します。

定期MTGはSlackビデオで

毎朝9時に開発部の朝礼があるのと、週次で担当領域ごとのチームMTGが行われるのですが、
どちらもビデオ通話を駆使して実施されています。

互いに顔が見えた状態の通話なので、例えば同じ空間にいないと伝わらないような「温度感」とか「表情」などの非言語的なコミュニケーションについても共有できています。

画面越しでうんうん、とうなずくだけでも、話し手としては安心しますよね。

ビデオ会議の様子
ビデオ会議の様子

情報共有はドキュメントベースで柔軟に

開発上必要になってくる情報についてはesa上でドキュメント化が徹底されていたり、
また仕様の相談などもGitHubのプルリクエスト上で気軽に聞けたりなど、
「情報をできる限りオンライン上で残す」という文化が根付いています。

おかげで欲しい情報にすぐアクセスできるため、1人離れたところにいても情報難民になることがないような環境が整っています。

フォローアップMTG

フォローアップMTGという立て付けで、メンターと1on1で何を話しても良い時間を毎日5分程度設けてもらっています。(こちらもビデオ通話で行っています)
当初は入社直後の「困ってることないですか?」の声掛けタイムでいろいろ相談していたのですが、入社2ヶ月経った今も継続してもらっています。

最近だと思いっきり雑談で終わってしまったりもするのですがw
「気になることがあるが、わざわざ誰かに声をかけて時間を割いて聞くほどのことでもないし、どうしよう…」的なモヤモヤが発生しても、
毎日のフォローアップMTGで解消できるため頭の中で引きずることがなく、ストレスになりにくいです。

他愛のない話でも共有できていると、他の事に関してもまず相談することに対してのハードルが下がりますよね。
とかくリモートワーカーは疎外感を感じがちですが、カルテットでは全く陥ることなく毎日過ごすことが出来ています。

分報チャンネル

※分報とは?という方はこちらを参考に

開発メンバーはそれぞれ、自分専用のどのように利用しても良いチャンネルを1人1つずつ割り当てられています。
使い方は各々、作業進捗共有だったりbotの住処にしたり様々なのですが、
さながら社内用twitterのように、個人的なつぶやきを投稿する場のようにも働いています。

カレー記念日
ある日の分報チャンネルのひとコマ

なんでもないつぶやきでも、反応があるとつながりを感じますよねw
このあたりの仕掛けも、疎外感の解消に役立っている気がします。

最後に

以上ここまで、カルテットでのリモートワークの様子を一部ですが紹介させていただきました。
これ以外にも、エンジニアにとって働きやすい環境である理由はたくさんあるのですが、
またの機会に紹介させていただければ、と思います :smiley:

カルテットでは場所に縛られない働き方を求めるエンジニアを募集しています!