Contenu connexe Similaire à How kris-writes-symfony-apps-london (20) Plus de Kris Wallsmith (11) How kris-writes-symfony-apps-london20. /** @DIObserve(UserEvent::CREATE) */
public function onUserCreate(UserEvent $event)
{
$user = $event->getUser();
$activity = new Activity();
$activity->setActor($user);
$activity->setVerb('register');
$activity->setCreatedAt($user->getCreatedAt());
$this->dm->persist($activity);
}
21. /** @DIObserve(UserEvent::USERNAME_CHANGE) */
public function onUsernameChange(UserEvent $event)
{
$user = $event->getUser();
$dm = $event->getDocumentManager();
$dm->getRepository('Model:Widget')
->updateDenormalizedUsernames($user);
}
22. /** @DIObserve(UserEvent::FOLLOW) */
public function onFollow(UserUserEvent $event)
{
$event->getUser()
->getStats()
->incrementFollowedUsers(1);
$event->getOtherUser()
->getStats()
->incrementFollowers(1);
}
24. $event = new UserEvent($dm, $user);
$dispatcher->dispatch(UserEvent::CREATE, $event);
25. $event = new UserEvent($dm, $user);
$dispatcher->dispatch(UserEvent::UPDATE, $event);
26. $event = new UserUserEvent($dm, $user, $otherUser);
$dispatcher->dispatch(UserEvent::FOLLOW, $event);
28. public function preFlush(ManagerEventArgs $event)
{
$dm = $event->getObjectManager();
$uow = $dm->getUnitOfWork();
foreach ($uow->getIdentityMap() as $class => $docs) {
if (is_a($class, 'KrisModelUser')) {
foreach ($docs as $doc) {
$this->processUserFlush($dm, $doc);
}
} elseif (is_a($class, 'KrisModelWidget')) {
foreach ($docs as $doc) {
$this->processWidgetFlush($dm, $doc);
}
}
}
}
34. // repo for src/Kris/Model/User.php
$repo = $this->dm->getRepository('Model:User');
36. use KrisBundleMainBundleCanonicalizer;
public function setUsername($username)
{
$this->username = $username;
$canonicalizer = Canonicalizer::instance();
$this->usernameCanonical = $canonicalizer->canonicalize($username);
}
45. /** @DIService("widget_twiddler") */
class Twiddler
{
/** @DIInjectParams() */
public function __construct(
EventDispatcherInterface $dispatcher,
LoggerInterface $logger = null)
{
// ...
}
}
46. services:
# aliases for auto-wiring
container: @service_container
dm: @doctrine_mongodb.odm.document_manager
doctrine: @doctrine_mongodb
dispatcher: @event_dispatcher
security: @security.context
48. {% block head %}
<script>
require(
[ "view/user", "model/user" ],
function(UserView, User) {
var view = new UserView({
model: new User({{ user|serialize|raw }}),
el: document.getElementById("user")
})
}
)
</script>
{% endblock %}
50. {% block head %}
<script>
require(
[ "view/user", "model/user" ],
function(UserView, User) {
var view = new UserView({
model: new User({{ user|serialize|raw }}),
el: document.getElementById("user")
})
}
)
</script>
{% endblock %}
53. When to create a new bundle
• Anything reusable
• A new feature
• Lots of classes relating to one feature
• Integration with a third party
60. public function vote(TokenInterface $token, $widget, array $attributes)
{
$result = VoterInterface::ACCESS_ABSTAIN;
if (!$this->supportsClass(get_class($widget))) {
return $result;
}
foreach ($attributes as $attribute) {
if (!$this->supportsAttribute($attribute)) {
continue;
}
$result = VoterInterface::ACCESS_DENIED;
if ($token->getUser() === $widget->getUser()) {
return VoterInterface::ACCESS_GRANTED;
}
}
return $result;
}
65. class WidgetRepository extends DocumentRepository
{
public function findByUser(User $user)
{
return $this->createQueryBuilder()
->field('userId')->equals($user->getId())
->getQuery()
->execute();
}
public function updateDenormalizedUsernames(User $user)
{
$this->createQueryBuilder()
->update()
->multiple()
->field('userId')->equals($user->getId())
->field('userName')->set($user->getUsername())
->getQuery()
->execute();
}
}
68. public function __construct()
{
$this->id = (string) new MongoId();
$this->createdAt = new DateTime();
$this->widgets = new ArrayCollection();
}
71. public function __clone()
{
$this->id = (string) new MongoId();
$this->createdAt = new DateTime();
$this->widgets = new ArrayCollection(
$this->widgets->toArray()
);
}
72. public function __construct()
{
$this->id = (string) new MongoId();
$this->createdAt = new DateTime();
$this->widgets = new ArrayCollection();
}
public function __clone()
{
$this->id = (string) new MongoId();
$this->createdAt = new DateTime();
$this->widgets = new ArrayCollection(
$this->widgets->toArray()
);
}