18-09-2010, 11:57 AM
Bien sûr, c'est trop facile de dire qu'untel copie untel. C'est normal qu'il y ai des similitudes sans pour autant avoir à parler de plagiat.
Par exemple, Zend Framework ne copie absolument pas Rails, c'est l'opposé en terme de framework. En revanche, Symfony s'en inspire pas mal.
CakePHP s'en inspire énormément (enfin, dans la limite de ce que PHP peut faire pour ressembler à du Ruby), voici un modèle issu d'un projet Rails et son plus proche penchant avec CakePHP.
Le modèle le plus proche en PHP, avec CakePHP :
Alors Atra, convaincu des similitudes ? Le problème c'est qu'en PHP, on ne peut pas appeler des méthodes dans le corps des classes (comme je le fais en Ruby avec has_many, before_create, etc.), donc CakePHP utilise des attributs.
Un autre point qui n'est pas mis en avant mais qui est pourtant un gros avantage de Rails : la documentation. Elle est vraiment géniale, grâce aux guides et à l'API très documentée. Quand tu vois celle de Symfony, par exemple, c'est une autre paire de manche pour trouver l'information (exemple, trouver la documentation pour les vues partielles pour Symfony 1.4).
Sephi-Chan
Par exemple, Zend Framework ne copie absolument pas Rails, c'est l'opposé en terme de framework. En revanche, Symfony s'en inspire pas mal.
CakePHP s'en inspire énormément (enfin, dans la limite de ce que PHP peut faire pour ressembler à du Ruby), voici un modèle issu d'un projet Rails et son plus proche penchant avec CakePHP.
class HeaderPastie < ActiveRecord::Base
EXPIRATION_DELAYS = {
:never => nil,
:ten_minutes => 10.minutes,
:one_hour => 1.hour,
:one_day => 1.day,
:one_month => 1.month
}.with_indifferent_access
has_many :pasties, :class_name => 'Pastie' # By default, Pasty is inferred.
has_many :taggings
has_many :tags, :through => :taggings
before_create et_expiration_date
before_create et_private
def expiration_delay=(expiration_delay)
if EXPIRATION_DELAYS.has_key?(expiration_delay)
@expiration_delay = EXPIRATION_DELAYS[expiration_delay]
else
@expiration_delay = :never
end
end
def expired?
expire_at && expire_at.past?
end
private
def set_expiration_date
self.expire_at = @expiration_delay && @expiration_delay.from_now
self
end
def set_private
self.private = private? ? generate_private_key : nil
self
end
def generate_private_key
private_key_elements = [ Pasteque::Application.config.secret_token, Time.now.usec ]
Digest::MD5.hexdigest(private_key_elements.join('*'))
end
end
Le modèle le plus proche en PHP, avec CakePHP :
<?php
class HeaderPastie extends AppModel {
const EXPIRATION_DELAYS = array(
'never' => null,
'ten_minutes' => 10 * 60,
'one_hour' => 60 * 60,
'one_day' => 24 * 60 * 60,
'one_month' => 30 * 24 * 60 * 60
);
public $hasMany => array(
'Tagging' => array(
'ClassName' => 'Pastie'
)
);
public $hasAndBelongsToMany => array(
'Tag' => array(
'joinTable' => 'taggings'
)
);
public function expired(){
if($this->expireAt && $this->expireAt < time()){
return true;
}
return false;
}
public function setExpirationDelay(expirationDelay){
if(array_key_exists(expirationDelay, self::EXPIRATION_DELAYS){
$this->expirationDelay = self::EXPIRATION_DELAYS[expirationDelay];
}
else {
$this->expirationDelay = 'never';
}
}
// On ne peut pas définir plusieurs filtres, donc on fait tout dans le même filtre.
public function beforeSave(){
// Set expiration date.
if($this->expirationDelay){
$this->expireAt = time() + $this->expirationDelay;
}
else {
$this->expireAt = null;
}
// Set private.
$this->private = $this.private == true ? $this->generatePrivateKey() : null;
return true;
}
private function generatePrivateKey(){
$private_key_elements = array('a_secret_token', microtime());
return md5(implode('*', $private_key_elements);
}
}
Alors Atra, convaincu des similitudes ? Le problème c'est qu'en PHP, on ne peut pas appeler des méthodes dans le corps des classes (comme je le fais en Ruby avec has_many, before_create, etc.), donc CakePHP utilise des attributs.
Un autre point qui n'est pas mis en avant mais qui est pourtant un gros avantage de Rails : la documentation. Elle est vraiment géniale, grâce aux guides et à l'API très documentée. Quand tu vois celle de Symfony, par exemple, c'est une autre paire de manche pour trouver l'information (exemple, trouver la documentation pour les vues partielles pour Symfony 1.4).
Sephi-Chan