2011年12月8日木曜日

consoleコマンドリスト

$ php app/console list
のコマンドで、コンソールのコマンドリストを見れます。
別にコンソール上で見ればいいけど、一応一覧をメモっておく。

Symfony version 2.0.6 - app/dev/debug

Usage:
  [options] command [arguments]

Options:
  --help                    -h Display this help message.
  --quiet                  -q Do not output any message.
  --verbose              -v Increase verbosity of messages.
  --version               -V Display this program version.
  --ansi                         Force ANSI output.
  --no-ansi                    Disable ANSI output.
  --no-interaction     -n Do not ask any interactive question.
  --shell                     -s Launch the shell.
  --env                      -e The Environment name.
  --no-debug                 Switches off debug mode.

Available commands:
  help                                  Displays help for a command
  list                                  Lists commands
assetic
  assetic:dump                          Dumps all assets to the filesystem
assets
  assets:install                        Install bundles web assets under a public web directory
cache
  cache:clear                           Clear the cache
  cache:warmup                          Warms up an empty cache
container
  container:debug                       Displays current services for an application
doctrine
  doctrine:cache:clear-metadata         Clear all metadata cache for a entity manager
  doctrine:cache:clear-query            Clear all query cache for a entity manager
  doctrine:cache:clear-result           Clear result cache for a entity manager
  doctrine:database:create              Create the configured databases
  doctrine:database:drop                Drop the configured databases
  doctrine:ensure-production-settings   Verify that Doctrine is properly configured for a production environment.
  doctrine:generate:crud                Generates a CRUD based on a Doctrine entity
  doctrine:generate:entities            Generate entity classes and method stubs from your mapping information
  doctrine:generate:entity              Generates a new Doctrine entity inside a bundle
  doctrine:generate:form                Generates a form type class based on a Doctrine entity
  doctrine:mapping:convert              Convert mapping information between supported formats.
  doctrine:mapping:import               Import mapping information from an existing database
  doctrine:mapping:info                 Show basic information about all mapped entities
  doctrine:query:dql                    Executes arbitrary DQL directly from the command line.
  doctrine:query:sql                    Executes arbitrary SQL directly from the command line.
  doctrine:schema:create                Executes (or dumps) the SQL needed to generate the database schema
  doctrine:schema:drop                  Executes (or dumps) the SQL needed to drop the current database schema
  doctrine:schema:update                Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata
generate
  generate:bundle                       Generates a bundle
  generate:doctrine:crud                Generates a CRUD based on a Doctrine entity
  generate:doctrine:entities            Generate entity classes and method stubs from your mapping information
  generate:doctrine:entity              Generates a new Doctrine entity inside a bundle
  generate:doctrine:form                Generates a form type class based on a Doctrine entity
init
  init:acl                              Mounts ACL tables in the database
router
  router:debug                          Displays current routes for an application
  router:dump-apache                    Dumps all routes as Apache rewrite rules
swiftmailer
  swiftmailer:spool:send                Send emails from the spool

既存のテーブルからEntityを作成!

タイトルのように、既存のテーブルからEntityを作成したい場合は、どうするのかなーと思ってた所、こんな記事がありました。→ How to generate Entities from an Existing Database

2011年12月6日火曜日

controllerに書くアノテーションについて

SensioFrameworkExtraBundle

Symfony2 では、アノテーションとして Routing の情報等を書くけど、そのアノテーションに関する情報がまとまってなくて、どっかにないかなーと思っていたら、ドキュメントにあったので、紹介 + 自分なりにまとめてみます。

とりあえず、アノテーションに以下の5つの機能があるっぽい
  • @Route and @Method : ルーティングの情報や、ルートに許可されるHTTPメソッドを指定
  • @ParamConverter : リクエストの内容をオブジェクトに変換する機能を使用することを指定
  • @Template : テンプレート名を指定する
  • @Cache : HTTPキャッシュを作成するためのアノテーション


@Route and @Method

ドキュメントはコチラ → @Route and @Method

/**
 * @Route("/{id}", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
  */
public function showAction($id)
{
}
  • @Route() では、第一引数で pattern 情報を指定
  • requirements には, 正規表現などで、Route 情報に制限をかけられる
  • defaults で、デフォルトで渡されるパラメータの値を設定可能
  • @Routeを複数指定することもできる

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

/**
 * @Route("/blog")
 */
class PostController extends Controller
{
    /**
     * @Route("/edit/{id}")
     * @Method({"GET", "POST"})
     */
    public function editAction($id)
    {
    }
}
  • クラスに対して @Route 情報を記述することで、全アクションに対して機能させることも可能
  • @Method({"GET", "POST"}) のように、@Method() を使用して、HTTPメソッドに制限をかけることができる。



@ParamConverter

ドキュメントはコチラ → @ParamConverter

リクエストの内容をオブジェクトに変換する機能を使用。

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/**
 * @Route("/blog/{id}")
 * @ParamConverter("post", class="SensioBlogBundle:Post")
 */
public function showAction(Post $post)
{
}

  • SensioBlogBundle:Post でPostオブジェクトがなかったら 404NotFoundが返される。
  • 全てのコンバーターはParamConverterInterfaceを実装してつくる

詳細はドキュメントを参照。


@Template

ドキュメントはコチラ → @Template

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

:

/**
 * @Template("SensioBlogBundle:Post:show")
 */
public function showAction1($id)
{
    // get the Post
    $post = ...;

    return array('post' => $post);
}

/**
 * @ParamConverter("post", class="SensioBlogBundle:Post")
 * @Template("SensioBlogBundle:Post:show", vars={"post"})
 */
public function showAction2(Post $post)
{
}
  • @Template("SensioBlogBundle:Post:show")のように、テンプレートを指定することが可能
  • vars を指定することで、テンプレートにデータを渡すことも可能


@Cache

ドキュメントはコチラ → @Cache

/**
 * @Cache(expires="tomorrow")
 */
class BlogController extends Controller
{
    /**
     * @Cache(expires="+2 days")
     */
    public function indexAction()
    {
    }
}

このようにして、expiresでキャッシュの有効期限を指定して、キャッシュを簡単に作成可能


詳しくは、ドキュメント参照でお願いします。
とりあえず、アノテーションに関してはこんな感じ!

アノテーションを使用するときはインポートすること!

@Route や @Template のアノテーションを利用するときは、

// these import the "@Route" and "@Template" annotations
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

のように、FrameworkExtraBundle の Configuration\Route と Configuration\Template をインポートすること!!

2011年12月5日月曜日

Actionの戻り値について

Symfony2.0 では、Controller の Action の戻り値は、Response オブジェクト。
ってのはまぁ、良いとして、Response オブジェクトの作成方法についてちょっと自分なりにメモしておく。
(間違ってたらコメントください(´・ω・`))

基本的に以下の3パターン。
( http://symfony.com/doc/current/book/controller.htmlより引用 )

① 自分でレスポンスオブジェクトを作成
use Symfony\Component\HttpFoundation\Response;

public function helloAction()
{
    return new Response('Hello world!');
}
リダイレクトする場合は、このパターン


②render関数を Action 内で使用
自分でテンプレートを指定して、レンダリングを行う。render() の戻り値が Response オブジェクトなので、これをそのまま Action の戻り値とする。
use Symfony\Component\HttpFoundation\Response;

public function helloAction()
{
    return $this->render('AcmeHelloBundle:Welcome:hello.html.twig', array('name' => $name));
}


③ テンプレートに渡すパラメータをActionの戻り値にして、Responce オブジェクト作成は フレームワークにやらせる
自分でテンプレートを指定して、レンダリングを行う。render() の戻り値が Response オブジェクトなので、これをそのまま Action の戻り値とする。
use Symfony\Component\HttpFoundation\Response;

public function helloAction()
{
// array('name' => $name) が 内部で AcmeHelloBundle:Welcome:hello.html.twig に渡され、Response オブジェクトが自動で作成される
    return array('name' => $name)
}


多分こんな感じ。

Custom Repository Class

Doctrineでは、Entityというものを使うけど、これは基本的にデータを保持するためだけのクラス。
で、実際に find などの様にデータベース上のデータをフェッチするには、Repository を使用する。

こんな感じ。(http://docs.symfony.gr.jp/symfony2/book/doctrine.htmlより引用)
$product = $this->getDoctrine()
       -$gt;getRepository('AcmeStoreBundle:Product')
       -$gt;find($id);


...で、このgetRepositoryを見てみると、

/**
 * Gets the repository for an entity class.
 *
 * @param string $entityName The name of the entity.
 * @return EntityRepository The repository class.
 */
public function getRepository($entityName)
{
    $entityName = ltrim($entityName, '\\');
    if (isset($this->repositories[$entityName])) {
        return $this->repositories[$entityName];
    }

    $metadata = $this->getClassMetadata($entityName);
    $customRepositoryClassName = $metadata->customRepositoryClassName;

    if ($customRepositoryClassName !== null) {
        $repository = new $customRepositoryClassName($this, $metadata);
    } else {
        $repository = new EntityRepository($this, $metadata);
    }

    $this->repositories[$entityName] = $repository;

    return $repository;
}

の様になっている。

で、ここで注目するのは

if ($customRepositoryClassName !== null) {
    $repository = new $customRepositoryClassName($this, $metadata);
} else {
    $repository = new EntityRepository($this, $metadata);
}

のとこ。つまりカスタムリポジトリクラスがあれば、それを使用するけど、そうじゃなきゃEntityRepositoryを使うよーってことですね。

ってことで、自分で Repositoryを作成するには、EntityRepositoryを継承して独自にカスタマイズすればOK。
データ取得とかはコントローラでなくてモデル側に書いたほうが良いので、そういうのは独自のリポジトリを用意してそこで処理をさせたほうが綺麗!

ってことらしいです。

Share

Twitter Delicious Facebook Digg Stumbleupon Favorites More