10月 062013
 

SymfonyをさくらVPSでインストールしてたら以下のメッセージがでてエラーになった。。。

「Fatal error: Class 'DOMDocument' not found in /home/hogehoge/public_html/symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php on line 214 」

どうやら「php-xml」がインストールされてないと出るみたいなので、
インストールします。

インストール後、httpdを再起動します。

$ sudo yum install php-xml
Loaded plugins: fastestmirror, priorities, security
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.iij.ad.jp
 * rpmforge: ftp.kddilabs.jp
 * updates: ftp.iij.ad.jp
1973 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package php-xml.x86_64 0:5.3.3-23.el6_4 will be installed
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.24)(64bit) for package: php-xml-5.3.3-23.el6_4.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.22)(64bit) for package: php-xml-5.3.3-23.el6_4.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.18)(64bit) for package: php-xml-5.3.3-23.el6_4.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.13)(64bit) for package: php-xml-5.3.3-23.el6_4.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.11)(64bit) for package: php-xml-5.3.3-23.el6_4.x86_64
--> Processing Dependency: libxslt.so.1()(64bit) for package: php-xml-5.3.3-23.el6_4.x86_64
--> Processing Dependency: libexslt.so.0()(64bit) for package: php-xml-5.3.3-23.el6_4.x86_64
--> Running transaction check
---> Package libxslt.x86_64 0:1.1.26-2.el6_3.1 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================================================================================================================================================
 Package                                         Arch                                           Version                                                   Repository                                       Size
================================================================================================================================================================================================================
Installing:
 php-xml                                         x86_64                                         5.3.3-23.el6_4                                            updates                                         103 k
Installing for dependencies:
 libxslt                                         x86_64                                         1.1.26-2.el6_3.1                                          base                                            452 k
 
Transaction Summary
================================================================================================================================================================================================================
Install       2 Package(s)
 
Total download size: 555 k
Installed size: 2.4 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): libxslt-1.1.26-2.el6_3.1.x86_64.rpm                                                                                                                                               | 452 kB     00:00
(2/2): php-xml-5.3.3-23.el6_4.x86_64.rpm                                                                                                                                                 | 103 kB     00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                           2.7 MB/s | 555 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing : libxslt-1.1.26-2.el6_3.1.x86_64                                                                                                                                                              1/2
  Installing : php-xml-5.3.3-23.el6_4.x86_64                                                                                                                                                                2/2
  Verifying  : libxslt-1.1.26-2.el6_3.1.x86_64                                                                                                                                                              1/2
  Verifying  : php-xml-5.3.3-23.el6_4.x86_64                                                                                                                                                                2/2
 
Installed:
  php-xml.x86_64 0:5.3.3-23.el6_4
 
Dependency Installed:
  libxslt.x86_64 0:1.1.26-2.el6_3.1
 
Complete!
$ sudo /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
10月 062013
 

setfaclを実行すると、”Operation not supported”と出る場合がある。

これはどうもファイルシステムの設定の問題みたいです。

以下のサイトにしたがってやったらうまくできました。
http://tapioca7.blogspot.jp/2011/07/linuxsetfacl.html

$ sudo setfacl -R -m u:apache:rwx -m u:hoge:rwx app/cache app/logs
setfacl: app/cache: Operation not supported
setfacl: app/logs: Operation not supported
setfacl: app/logs/.gitkeep: Operation not supported
$ mount -o acl,remount /
mount: only root can do that
$ sudo mount -o acl,remount /
$ sudo setfacl -R -m u:apache:rwx -m u:hoge:rwx app/cache app/logs
8月 012013
 

以下のように、defaults={“hoge” = “hogeatai”}とする。
この時、右側は数値であれば「”(ダブルくおてーション)」はいらない。
左側の変数名は、「”」でなく「’」にするとエラーになるので、かならず「”」で
囲む。

    /**
     * @Route("/article_more/{page}", name="article_list_more", defaults={"page" = 1})
     * @Template()
     */
8月 012013
 

setMaxResults()を使用します。

        $articles   = $this->getDoctrine()
                        ->getRepository('MyMtmBundle:Article')
                        ->createQueryBuilder('p')
                        ->where("p.title NOT LIKE 'PR: %' AND p.title NOT LIKE 'AD: %'")
                        ->orderBy('p.allDaysCount', 'DESC')
                        ->setMaxResults(5)
                        ->getQuery()
                        ->getResult()

setFirstResult()っていうのもあるらしい。
これは、setMaxResults()と一緒に使わないといけないようだ。
オフセットを指定するものですね。

7月 312013
 

srcディレクトリの削除

$ rm -r src/Acme/

AppKernel.php内の定義削除

$ vi app/AppKernel.php
        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();  // この行を削除
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
        }

app/config/routing_dev.php内の定義削除

// ここから
_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }
 
_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation
 
_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo
// ここまでを削除
 
_assetic:
    resource: .
    type:     assetic
 
_wdt:
    resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
    prefix:   /_wdt
 
_profiler:
    resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
    prefix:   /_profiler
 
_configurator:
    resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml"
    prefix:   /_configurator
 
_main:
    resource: routing.yml
5月 082013
 

リポジトリを使う場合。

$this->getDoctrine()->getRepository()を使う

    $product = $this->getDoctrine()
        ->getRepository('AcmeStoreBundle:Product')
        ->find($id);

いろいろなfindメソッドが用意されている。

$repository = $this->getDoctrine()
    ->getRepository('AcmeStoreBundle:Product');
 
// プライマリーキー(通常は"id")でクエリ
$product = $repository->find($id);
 
// あるカラム値に基づいて find する、動的なメソッド名
$product = $repository->findOneById($id);
$product = $repository->findOneByName('foo');
 
//
// *すべて* の商品を find
$products = $repository->findAll();
 
// 任意のカラム値に基づく、商品群の find
$products = $repository->findByPrice(19.99);

複数条件もいけます。

// name と price の両方にマッチする1つの商品を取得するクエリ
$product = $repository->findOneBy(array('name' => 'foo', 'price' => 19.99));
 
// name にマッチするすべての商品を price 順で取得するクエリ
$product = $repository->findBy(
    array('name' => 'foo'),
    array('price' => 'ASC')
);

DQLを使う場合

$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
    'SELECT p FROM AcmeStoreBundle:Product p WHERE p.price > :price ORDER BY p.price ASC'
)->setParameter('price', '19.99');
 
$products = $query->getResult();

結果が1つと分かっていればgetResult()の代わりにgetSingleResult()が使える。

$product = $query->getSingleResult();

注意事項

getSingleResult() メソッドは、結果がない場合、一つより多くの結果が返ってきたときに、それぞれ、Doctrine\ORM\NoResultException、Doctrine\ORM\NonUniqueResultException をスローします。もしこのメソッドを使用する場合は(そして、1つより多くの結果を返すようなクエリを実行している場合は)、try-catch ブ ロックで囲って、ただひとつの結果が返ることを明確にしておかなければなりません。

$query = $em->createQuery('SELECT ....')
    ->setMaxResults(1);
 
try {
    $product = $query->getSingleResult();
} catch (\Doctrine\Orm\NoResultException $e) {
    $product = null;
}

パラメータのセット

setParameter() メソッドに注目してください。Doctrine を使用する際は、先の例のように、外部的な値は常に”プレースホルダ”として設定するのが良いでしょう。

... WHERE p.price > :price ...

プレースホルダ price に値をセットするには、setParameter() メソッドを呼びます。

->setParameter('price', '19.99')

値を直に置くのではなくパラメータを使用するのは、SQL インジェクションを防ぐためであり、常にそうすべきです。複数のパラメータがある時は、setParameters() メソッドを使用すれば一度に値をセット出来ます。

->setParameters(array(
    'price' => '19.99',
    'name'  => 'Foo',
))

3. QueryBuilderを使う

$repository = $this->getDoctrine()
    ->getRepository('AcmeStoreBundle:Product');
 
$query = $repository->createQueryBuilder('p')
    ->where('p.price > :price')
    ->setParameter('price', '19.99')
    ->orderBy('p.price', 'ASC')
    ->getQuery();
 
$products = $query->getResult();