Symfony

【Symfony2.3】でコマンドラインから実行可能なバッチを作成する。

下記公式ドキュメントがとてもわかりやすい。

http://docs.symfony.gr.jp/symfony2/cookbook/console.html

コンソール出力に装飾もできたりして、とても便利。

 

【Symfony2.3】取得したHTML要素を解析する。

SymfonyにはデフォルトでDOMのパーサーが組み込まれているのでこれを用いると便利。

詳細と使い方は下記公式ページを参照されたし。

http://symfony.com/doc/current/components/dom_crawler.html

個人的には「Simple HTML DOM Parser」のほうが使いやすくて好きかな。
jQueryと同様のセレクタで要素を辿れるしComposerでもインストールできるしまじ便利。

 

【Symfony2】のHTTPキャッシュを有効にする方法。

とても簡単。

まずはapp.phpの下記2行のコメントアウトを外す。

require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppCache($kernel);

んでコントローラーで下記のようにレスポンスを返す。

$response = new Response();
$response = $this->render('HogeFugaBundle:Default:index.html.twig');
$response->setPublic();
$response->setSharedMaxAge(300);

return $response;

以上、完了!
これだけで組み込みリバースプロキシの共有キャッシュが動作するなんて素敵過ぎる。

下記スライドにわかりやすく纏められてます。(感謝!)

http://www.slideshare.net/hidenorigoto/symfony2http-cache-reverse-proxy

 

【Symfony2/Doctrine2】Many-to-Manyのテーブルでリレーションテーブル内をカウントしたい場合。

例えば、記事とカテゴリがあって、カテゴリの数が多い順でカウント、ソートしたい場合のDQLは下記の通りになる。

$dql = "select
            c.id,
            c.name,
            count(c.id) as cnt
        from
            HogeFugaBundle:Categories as c
        join
            c.articles as a
        where
            c.status = 1
        group by
            c.id
        order by
            cnt desc
";

DQLでのjoinのやり方は面白いね。

 

【Symfony2.3】DoctrineのbindByでorderを指定する。

メモ。

$em->getRepository('HogeFugaBundle:Piyo')->findBy([
    'id' => 1
], [
    'createdAt' => 'desc'
]);

ようはfindByの第2引数に配列でオーダーを渡してやればOK。

 

【Symfony2.3】独自で作成したサービスにEntityManagerを注入する。

まずはservice.ymlで下記のように定義。

services:
    your.service:
        class: YourVendor\YourBundle\Service\YourService
        arguments: [ @doctrine.orm.entity_manager ]

そしてサービスはこんな感じ。

namespace ...\Service;

use Doctrine\ORM\EntityManager;

class YourService
{ 
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
}

完璧だね。

 

【Symfony2.3】entityManagerのgetResult()から得られる結果にlimitとoffsetを設定する。

下記のようにすればOK。

return $this->getEntityManager()
        ->createQuery('...')
        ->setMaxResults(5)
        ->setFirstResult(10)
        ->getResult();

setMaxResults()がlimit、setFirstResult()がoffsetを表す。

 

【Symfony2.3】Many-to-Manyのリレーションテーブルに追加情報を持たせたい。

時は下記のようにすればOK。

http://stackoverflow.com/questions/3542243/doctrine2-best-way-to-handle-many-to-many-with-extra-columns-in-reference-table

安定のstackさん。

One-to-ManyとMany-to-Oneを用いて自分でリレーションテーブルを定義してやればよい。