2012年12月3日 星期一

Composer簡介

什麼是Composer?

Composer是一個PHP的"dependency management"工具, 它能讓你指定你的Project裡需要用到的"dependent libraries", 並安娤這些libraries到你的project裡.

Dependency management

Composer不是"package manager", 雖然它是處理packages, 但它是在project的層面上管理, 通常是在project的根目錄下建立一個叫vendor的directory, 然後把packages安裝到這個directory裡. 一般情況下它不會安裝global的packages.

Composer解決的問題

  1. 你有一個project需要數個libraries.
  2. 在那些libraries當中, 有些需要依頼其他libraries.
  3. 你能自己定義你的project所依賴的libraries
  4. Composer找出所需安裝的packages及versions, 並安裝(事實上是下載)到project的vendor目錄

安裝

要安裝Composer, 在你的project的根目錄下執行
$ curl -s https://getcomposer.org/installer | php

以上指令會先檢查PHP的設定然後下載composer.phar到你的目錄下. 
要執行composer, 執行
php composer.phar

如果你想直接以composer執行, 可以把composer.phar 複制到/usr/local/bin中
$ sudo mv composer.phar /usr/local/bin/composer

定義dependencies

例如你需要在你的project裡用monolog, 先建立composer.json, 內容為
{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}

require傳入的物件格式為{ "vendor name/package name" : "version" }
version可以是:
  1. Exact version: 如1.0.2
  2. Range: 如>=1.0,<2.0
  3. Wildcard: 1.0.*
  4. Next Significant Release: 如 ~1.2(相當於>=1.2,<2.0)

使用

執行以下指定, Composer會自動安裝你所定義的dependencies
$ php composer.phar install

composer.lock及composer.json

Composer執行install後會把安裝過的packages寫入composer.lock中, 而Composer每次執行install時會先確認composer.lock是否存在, 如果存在則安裝composer.lock中的packages, 不會理會composer.json, 如不存在則以composer.json裡的packages內容建立composer.lock. 所以執行install不會自動升級packages, 要升級需執行
$php composer.phar update

2012年10月25日 星期四

Symfony2 console commands

# Generate Bundle.
php app/console generate:bundle --namespace="My/Bundle" --format=yml
Doctrine

# Create database.
php app/console doctrine:database:create
# Generate Entity.
php app/console doctrine:generate:entity --entity="MyBundle:MyEntity"
# Generate Entities getters and setters.
php app/console doctrine:generate:entities MyBundle
# Update schema.
php app/console doctrine:schema:update --force
# Generate CRUD.
php app/console doctrine:generate:crud --entity="MyBundle:MyEntity"
Asset
# Install assets into web folder with symlink.
php app/console assets:install web --symlink

2012年10月24日 星期三

Doctrine以Composite及Foreign Keys作主鍵(Primary Key)

Doctrine2 可以用composite keys作為primary key(例如用戶的姓加名字作為主鍵), 而Doctrine2.1更支援關聯的foreign key.

方法很簡單:
  1. Entity內不能有@GeneratedValue, 除非設定為"ASSIGNED".
  2. 在需要作為primary key的property加上@Id這個annotation.
  3. 需要__construct() 方法在建立物件時傳入作為primary key的property, 因為primary key不是自動生成, 沒有primary key呼叫EntityManager#persist()會有問題.
<?php
use Doctrine\Common\Collections\ArrayCollection;

/** @Entity */
class Order
{
    /** @Id @Column(type="integer") @GeneratedValue */
    private $id;

    /** @ManyToOne(targetEntity="Customer") */
    private $customer;
    /** @OneToMany(targetEntity="OrderItem", mappedBy="order") */
    private $items;

    /** @Column(type="boolean") */
    private $payed = false;
    /** @Column(type="boolean") */
    private $shipped = false;
    /** @Column(type="datetime") */
    private $created;

    public function __construct(Customer $customer)
    {
        $this->customer = $customer;
        $this->items = new ArrayCollection();
        $this->created = new \DateTime("now");
    }
}

/** @Entity */
class Product
{
    /** @Id @Column(type="integer") @GeneratedValue */
    private $id;

    /** @Column(type="string") */
    private $name;

    /** @Column(type="decimal") */
    private $currentPrice;

    public function getCurrentPrice()
    {
        return $this->currentPrice;
    }
}

/** @Entity */
class OrderItem
{
    /** @Id @ManyToOne(targetEntity="Order") */
    private $order;

    /** @Id @ManyToOne(targetEntity="Product") */
    private $product;

    /** @Column(type="integer") */
    private $amount = 1;

    /** @Column(type="decimal") */
    private $offeredPrice;

    public function __construct(Order $order, Product $product, $amount = 1)
    {
        $this->order = $order;
        $this->product = $product;
        $this->offeredPrice = $product->getCurrentPrice();
    }
}
參考資料: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/tutorials/composite-primary-keys.html