Bonjour,
J'aurai besoin de votre aide, je débute des cours sur le framework php Symfony3. Je veux savoir les etape a suivre pour crier form par function buildForm(FormBuilderInterface $builder, array $options) et merci
how to create form with FormBuilder in symfony 3
Injection de dépendance dans les services
Bonjour,
J'ai une question concernant l'injection de dépendance dans les services.
Quand on créé un service dans Symfony, il faut le définir dans un fichier services.yml sous la forme suivante :
services:
mon.service:
class: MonBundle\chemin\vers\MonService
arguments: [@doctrine, @autre_service]
Dans cet exemple, j'indique que 2 services doivent être injectés dans le constructeur de MonService, ce qui me donne :
namespace MonBundle\chemin\vers;
class MonService {
private $doctrine;
private $autre_service;
public function __construct($doctrine, $autre_service)
{
$this->doctrine = $doctrine;
$this->autre_service = $autre_service;
// A partir d'ici, je peux utiliser librement les 2 services "doctrine" et "autre_service" au sein de cette class
}
}
Dans certains cas, je peux avoir jusqu'à 5 services à injecter. Ma question est donc la suivante :
Vaut'il mieux injecter ces 5 services comme l'exmple plus haut, ou injecter uniquement le service "service_container" qui me permettra ensuite d'accèder à autant de service que je souhaite ?
Exemple :
services:
mon.service:
class: MonBundle\chemin\vers\MonService
arguments: [@service_container]
namespace MonBundle\chemin\vers;
class MonService {
private $container;
private $doctrine;
private $autre_service;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
// A partir d'ici, je peux utiliser librement autant de service que je veux au sein de cette class
$this->doctrine = $this->container->get('doctrine');
$this->autre_service = $this->container->get('autre_service');
}
}
Quelle est la bonne pratique ?
Merci d'avance.
how to create custom menu with sonata admin
I've created a few entities and they all appear on the left of the dashboard, in the menu, and this is working fine. But what I want to do is add tabs without creating entity, and when you click on this menu tab, only the content of the right to be changed ! Is that possible?
upload fichier n'est pas fonctionne
Bonjour,
Je veux faire upload fichier mais j'ai un probléme .. move est fonctionne c'est à dire déplacement du fichier est fonctionne mais path en base de données est vide
code entity media:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Media
*
* @ORM\Table(name="medias")
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\MediaEntityRepository")
* @ORM\HasLifecycleCallbacks
*/
class Media
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\COlumn(name="updated_at",type="datetime", nullable=true)
*/
private $updateAt;
/**
* @ORM\PostLoad()
*/
public function postLoad()
{
$this->updateAt = new \DateTime();
}
/**
* @ORM\Column(type="string",length=255, nullable=true)
*/
public $path;
public $file;
public function getUploadRootDir()
{
return __dir__.'/../../../web/bundles/app/img';
}
public function getAbsolutePath()
{
return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
}
public function getAssetPath()
{
return 'uploads/'.$this->path;
}
/*
*@ORM\PrepPersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
$this->tempFile = $this->getAbsolutePath();
$this->oldFile = $this->getPath();
$this->updateAt = new \DateTime();
if (null !== $this->file)
$this->path = sha1(uniqid(mt_rand(),true)).'.'.$this->file->guessExtension();
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
// the file property can be empty if the field is not required
if (null === $this->getFile()) {
return;
}
// use the original file name here but you should
// sanitize it at least to avoid any security issues
// move takes the target directory and then the
// target filename to move to
$this->getFile()->move(
$this->getUploadRootDir(),
$this->getFile()->getClientOriginalName()
);
// set the path property to the filename where you've saved the file
$this->path = $this->getFile()->getClientOriginalName();
// clean up the file property as you won't need it anymore
$this->file = null;
}
/**
* @ORM\PreRemove()
*/
public function preRemoveUpload()
{
$this->tempFile = $this->getAbsolutePath();
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if (file_exists($this->tempFile)) unlink($this->tempFile);
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function setPath($path)
{
$this->path = $path;
return $this;
}
/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* Get name
*
* @return \string
*/
public function getName()
{
return $this->name;
}
/**
* Set updateAt
*
* @param \DateTime $updateAt
* @return Media
*/
public function setUpdateAt($updateAt)
{
$this->updateAt = $updateAt;
return $this;
}
/**
* Get updateAt
*
* @return \DateTime
*/
public function getUpdateAt()
{
return $this->updateAt;
}
/**
* Set name
*
* @param string $name
* @return Media
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Sets file.
*
* @param UploadedFile $file
*/
public function setFile(UploadedFile $file = null)
{
$this->file = $file;
}
/**
* Get file.
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}
}
Code entity User:
/**
*@ORM\OneToOne(targetEntity="Media",cascade={"persist"})
*/
private $image;
/**
* Set image
*
* @param \AppBundle\Entity\Media $image
* @return User
*/
public function setImage(\AppBundle\Entity\Media $image = null)
{
$this->image = $image;
return $this;
}
/**
* Get image
*
* @return \AppBundle\Entity\Media
*/
public function getImage()
{
return $this->image;
}
code mediaType:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FileType;
/**
* MediaType.
*/
class MediaType extends AbstractType
{
/**
* {@inheritdoc}
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('file',FileType::class,array('required'=>false));
}
/**
* {@inheritdoc}
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Media'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_media';
}
}
code user type:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Intl\Intl;
use Symfony\Component\Form\FormBuilderInterface;
use AppBundle\Form\MediaType;
/**
*Class DefaultController.
*/
class CondidatType extends AbstractType
{
/**
* function buildForm when I add many attributs added by entity User.
*
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options)
{
$countries = Intl::getRegionBundle()->getCountryNames();
$builder
->add('civility', ChoiceType::class, array('choices' => array('Mr' => 'MR', 'Mrs' => 'MRS'), 'expanded' => true, 'multiple' => false))
->add('image',MediaType::class)
->add('first_name', null)
->add('last_name', null)
->add('country', ChoiceType::class, array('choices' => array_flip($countries), 'label' => 'Country'))
->add('phone', null)
->add('birthday',null);
}
/**
* function get Parent Form.
*
* @return string
*/
public function getParent()
{
return 'FOS\UserBundle\Form\Type\RegistrationFormType';
}
/**
* name for this form.
*
* @return string
*/
public function getBlockPrefix()
{
return 'condidatuser_registration';
}
/**
* name for this form.
*
* @return string
*/
public function getName()
{
return $this->getBlockPrefix();
}
/**
* function setDefaultOptions.
*
*@param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User',
));
}
}
donc par exemple quand il j'upload image .. déplacement fonctionne avec move mais path en base de données est vide
[Symfony] Monolog Email OVH
Bonjour,
J'ai configuré monolog pour pourovir m'envoyer des emails en cas d'erreurs.
J'ai donc pour paramètre :
monolog:
handlers:
main:
type: fingers_crossed
action_level: critical
handler: grouped
grouped:
type: group
members: [streamed, deduplicated]
streamed:
type: stream
path: '%kernel.logs_dir%/%kernel.environment%.log'
level: debug
deduplicated:
type: deduplication
handler: swift
swift:
type: swift_mailer
from_email: 'xxxx@domaine.fr'
to_email: 'xxxx@gmail.com'
subject: '[BON SECOURS PAIEMENT ERREUR] %%message%%'
level: critical
formatter: monolog.formatter.html
content_type: text/html
console:
type: console
process_psr_3_messages: false
Un envoi de mail normal dans un controller fonctionne.
Par contre je ne recois pas de mail lorsqu'il y a une erreur.
Il y a un paramètre particulier à faire sur du OVH ?
problem installation uuid doctraine
Bonjour;
j'utilise la commande composer require ramsey/uuid-doctrine afin d'installer uuid, et le console afficher message ci-dessous.
j'ai trouvé plusieurs solution sur google toutes essayer mais j'ai toujours le problème.
The "https://packagist.org/packages.json" file could not be downloaded: failed to open stream: Une tentative de connexion a لcharoundouل car le parti connectل nْa pas rلpondu convenablement au-delض dْune certaine durلe ou une connexion لtablie a لchouل car lْharoundَte de connexion nْa pas rلpondu.aroundaroundhttps://packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of datearoundaroundaround [Composer\Downloader\TransportException]around The "http://packagist.org/p/ramsey/uuid-doctrine%24fa1c12b560ea0a9d238ceee125efa75e2252d59036a5b8c5d8728786eb3a3473.json"around file could not be downloaded: failed to open stream: Une tentative de connexion a لchouل car le parti connectل nْa pas rلparound ondu convenablement au-delض dْune certaine durلe ou une connexion لtablie a لchouل car lْhَte de connexion nْa pas rلpondu
MockFileSessionStorage avec symfony
Bonjour,
Voila je rencontre un petit problème avec mon code pour des tests fonctionnels.
Ce que je fais
Je ne met que la partie la plus importante ici. Cela fonctionne tres bien.
Je veut ici recuperer le session du client et verifier que le client est rediriger sur la bonne page en fonction de ce qu'il a en session.
Cependant dans la documentation de symfony, il est deconseiller d'utiliser le container dans des tests.
/** @var SessionInterface $session */
$session = $client->getContainer()->get('session');
$session->set('panier', [1 => 1]);
Ce que je veux
Donc j'ai trouver ceci : http://symfony.com/doc/2.3/components/http_foundation/session_testing.html.
qui dit que dans un test fonctionnel on doit utiliser le MockFileSessionStorage.
Donc je fais cela :
/** @var SessionInterface $session */
$session = new Session(new MockFileSessionStorage());
$session->set('panier', [1 => 1]);
Cependant le client se comporte comme s'il n'avait pas la session panier.
Donc je regarde la session du client avec :
dump($client->getRequest()->getSession()->all()); die();
Et n'y a rien a part l'utilisateur que j'initialise au debut de mon test.
Quelqu'un pourrait m'aider s'il vous plait.
Symfony 3 - Gestion datepicker
Bonjour,
Je débute en Symfony et je suis actuellement sur un projet : un site avec système de réservation de chambre.
J'ai mon site, avec mon formulaire de création de client + choix de la chambre, du mode de payement ,... Ci dessous :
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('client', ClientType::class)
->add('date', DateType::class)
->add('chambre', EntityType::class, array(
'class' => 'ClientBundle:Chambre',
'choice_label' => 'nomchambre',
))
->add('modepayement', EntityType::class, array(
'class' => 'ClientBundle:modepayement',
'choice_label' => 'libel',
))
->add('save', SubmitType::class);
}
Dans ce formulaire j'aimerais y intégrer un datepicker à la place du champs 'date'. Pour que le client puisse sélectionner sa date d'arriver ET sa date de départ.
Ensuite, j'aimerais récupérer les dates réservés et les afficher dans un calendrier sur l'interface administration ( cette étape ne me semble pas compliqué )
Et le point où j'aimerais être aidé :
Je souhaiterais que l'administrateur, avec un formulaire, puisse désigner des dates où il ne veut pas que le client puisse réserver. ( Que sur le datepicker du formulaire de réservation, les dates ne puissent pas être sélectionnées) ainsi que les dates qui ont été réservés précédemment par les clients.
Merci !
redirection si utilisateur connectée
Bonjour,
comment faire pour rederigé vers page index si je suis connecté ... j'utilise fosuserbundle ..quand il je suis connecte et quand il visite page /login j'accéde à cette page mais ligique dit que quand il est connecte cette page est invisible ... comment faire pour que je suis connecte je redirigé vers la page index .. normalment nous utilisons event listener mais je sais comment faire ca
merci d'avance
Attempted to load class "" from namespace ""
Bonjour,
Voila je rencontre un petit problème avec mon code.
J'ai donc mon controlleur Trajet :
namespace NGBundle\Controller;
use NG\NGBundle\Entity\Trajet;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class TrajetController extends Controller
{
public function indexAction() {
return $this->render('NGBundle:trajet:index.html.twig');
}
public function addAction(Request $request) {
if ($request->isMethod('POST')) {
// Création de l'entité
$advert = new Trajet();
Et mon Entité Trajet :
namespace NGBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Trajet
*
* @ORM\Table(name="trajet")
* @ORM\Entity(repositoryClass="NGBundle\Repository\TrajetRepository")
*/
class Trajet
{
/**
Tout ceci a été généré automatiquement avec la console de symfony 3. Mais lorsque je passe par la méthode POST sur Trajet AddAction je me retrouve avec cette erreur : Attempted to load class "Trajet" from namespace "NG\NGBundle\Entity".
Did you forget a "use" statement for another namespace?
Alors que la Class Trajet est bien chargée non ? :/
Custom export field in Sonata admin
i need to create custom export field in Sonata Admin. This field is not a part of the entity.
In entity, I have two dates. In config, I have defined maximum difference between these dates - for example: date1 has to be smaller than date2 + x days (x is defined in config). The export file should contain true, if condition is valid, false otherwise.
I'm not able to create custom method in entity class because parameters are defined in config file.
Is there any possibility to write custom query for export (I am able to write custom query for list or filter action)?
Tester sa route avec un ParamConverter
Bonjour tout le monde;
je suis en train d'écrire différent teste sur mon application pour vérifier que tout fonctionne correctement.
Et, je suis arrivée sur une petite complication sur un ParamConverter.
Tout simplement, il y a un paramètre id dans mon URL et il est automatiquement converti en objet actualité.
Je suis tombé sur ce topic qui me semble répondre à ma question, mais il ne décrit pas comment faire et étant débutant dans le test unitaire, j'ai un peu de mal ^^
Voici mon test actuellement
public function testShow()
{
$actuality = new Actuality();
$actuality->setId(1);
$actuality->setDescription("TEST");
$actuality->setContent("CONTENT");
$actuality->setTitle("Title");
$actualityRepository = $this->createMock(ObjectRepository::class);
$actualityRepository->expects($this->any())
->method('find')
->willReturn($actuality);
$objectManager = $this->createMock(ObjectManager::class);
$objectManager->expects($this->any())
->method('getRepository')
->willReturn($actualityRepository);
$client = static::createClient();
$url = $client->getContainer()->get("router")->generate("public_actuality_show.fr", ["id" => 1]);
$client->request("GET", $url);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
Ma route
public_actuality_show:
defaults: { _controller: PublicBundle:Actuality:show, slug: null }
path: '/{id}-{slug}'
requirements:
id: '\d+'
slug: '[a-zA-z0-9_-]*'
Mon action
/**
* @Template()
* @param Actuality $actuality
* @return array
*/
public function showAction(Actuality $actuality)
{
return ["actuality" => $actuality];
}
Ce que je demande, c'est qu'on m'aide à terminé ce test :)
Aussi, je refuse pas des conseils ;)
Merci pour votre aide.
EDIT
En fouillant dans les codes de test unitaire de paramConverter, j'ai écrit un code qui ressemble à ça :
public function testShow()
{
$actuality = new Actuality();
$actuality->setId(1);
$actuality->setDescription("TEST");
$actuality->setContent("CONTENT");
$actuality->setTitle("Title");
$client = static::createClient();
$converter = $this->createParamConverterMock();
$converter
->expects($this->never())
->method('supports')
;
$converter
->expects($this->never())
->method('apply')
;
$request = new Request();
$request->attributes->set('id', $actuality);
$configuration = new ParamConverter(array(
'name' => 'id',
'class' => Actuality::class,
));
$manager = new ParamConverterManager();
$manager->add($converter);
$manager->apply($request, array($configuration));
$url = $client->getContainer()->get("router")->generate("public_actuality_show.fr", ["id" => 1]);
$client->request("GET", $url);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
protected function createParamConverterMock()
{
return $this
->getMockBuilder('Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface')
->getMock();
}
Mais comme je vous demande de l'aide, c'est que le code ne fonctionne pas ^^
[SYMFONY 3] API REST
Bonjour,
Je réalise actuellement un API REST à l'aide de Symfony 3 avec Angular4 en Front qui communique avec l'API.
J'utilise actuellement ces bundle : FoSRest Bundle, lexik/jwt-authentication-bundle, lcobucci/jwtn, nelmio/cors-bundle.
Voici le Schéma Actuel de la base de donnée, elle est relativement simple j'ai une Entité Article, Catégorie-Article, Tag
Je rencontre un problème, l'orsque j'essaye de créer un Article.
Ce que je fais :
Dans mon Controller je fais quelque chose de basique.
/**
* @Rest\View(statusCode=Response::HTTP_CREATED, serializerGroups={"article"})
* @Rest\Post("/article")
*/
public function postArticleAction(Request $request)
{
$article = new Article();
$form = $this->createForm(ArticleType::class, $article);
$form->submit($request->request->all(), false);
if($form->isValid()){
$em = $this->get('doctrine.orm.entity_manager');
$article->setEvenementModified(false);
$article->setSlug($this->get('slugify')->slugify($request->request->get('titre')));
$em->persist($article);
$em->flush();
return $article;
} else {
return $form;
}
}
Voici le traitement de ma requête, maintenant je vais vous montrer le Payload qui est envoyé depuis Angular
{
"titre": "Je suis le titre de l'article",
"categorieArticle": {
"nom": "Article Catégorie.",
"id": 1
},
"content": "<p>Contenu</p>",
"evenementAt": "2017-12-05T23:00:00.000Z",
"publishFacebook": true,
"tag": [
{
"id": 14,
"nom": "Moellonlneur"
},
{
"id": 15,
"nom": "Maître de ballet"
}
]
}
Je pars du principe que l'orsque j'envoi ceci a symfony, il va mapper categorieArticle, tag avec ceux présent dans la base grâce au formulaire.
Voici mon ArticleType.php
$builder
->add('titre', TextType::class)
->add('slug', TextType::class)
->add('content', TextType::class)
->add('brouillon', CheckboxType::class)
->add('publishFacebook', CheckboxType::class)
->add('createdAt', DateTimeType::class, [
'required' => false
])
->add('updatedAt', DateTimeType::class, [
'required' => false
])
->add('evenementAt', DateType::class, [
'invalid_message' => 'DATE BAD.',
'widget'=>'single_text'
])
->add('evenementModified', CheckboxType::class, [
])
->add('categorieArticle',EntityType::class,[
'class' => CategorieArticle::class
])
->add('tag', CollectionType::class,[
'entry_type' => TagType::class
]);
Cela fait déjà plusieurs jours que j'essaye, différentes manières de pouvoir effectuer ce maudit POST. Je pense que je fais quelque chose de mal.
J'ai déjà essayé
->add('tag', CollectionType::class,[
'entry_type' => TagType::class,
'allow_add' => true
]);
->add('tag',EntityType::class,[
'class' => Tag::class,
'multiple' => true
])
/**
* @var Tag[]
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="article")
* @ORM\JoinTable(name="article_tag")
* @Assert\All(
* @Assert\Type(type="ApiBundle\Entity\Tag")
* )
*/
private $tag;
Mon Erreur est la suivante
Suivants les différents essaies que j'ai pu réaliser, je suis souvent tombé sur ces erreurs :
"This form should not contain extra fields." /
"This value is not valid."
A chaque fois, j'ai ces deux erreurs sur mes entités du formulaire qui sont en relation avec Article. Ces deux erreurs apparaissent sur le champ : categorieArticle et tag
Si quelqu'un à une éventuelle solution pour m'aider, je suis prenneur.
Merci d'avance
Symfony et webpack
Bonjour,
J'essaie desespérement d'utiliser du Sass dans mon projet symfony ... je commence avec ce framework ... donc c'est difficile car il y a plein de nouvelles choses a intégrer :'(
J'ai été sur la doc : http://symfony.com/doc/current/frontend.html
J'ai essayé de trouver des tutos vidéo... mais rien n'y fait, je n'arrive pas a l'intégrer a mon projet.
D'après ce que j'ai compris je dois installer webpack puis yarn pour pouvoir utiliser le sass.
J'ai essayé de l'installer via composer via la commande: composer require symfony/webpack-encore-pack
je retrouve viens "symfony/webpack-encore-pack": "^1.0" dans mon coposer.json mais rien dans vandor/symfony.
J'ai lu sur la doc officiel que je devais installer node.js puis yarn via ces deux sites:
https://nodejs.org/en/download/
https://yarnpkg.com/lang/en/
Mais null pars il est indiqué si je dois l'installer dans mon projet ou pas ... donc je l'ai installer avec les option par défaut (dans c:\programmes) j'essaie d'utiliser ensuite la commande yarn add @symfony/webpack-encore --dev mais il ne connait pas yarn ...
J'ai l'impression de faire n'importe quoi et je patoge complétement.
Merci de m'aider a inclure sass a mon projet, avant je l'avais installer via ruby (sur un projet qui n'utilisé pas symfony).
Methos
Upload d'image dans une API REST avec Symfony 3.2
Bonjour,
Voila je rencontre un petit problème avec mon code.
Ce que je fais
Je suis en train de developper une application permettant de faire des annonces. Pour cela j'utilise le Bundle FOSRestBundle de Symfony pour realiser L'API REST.
Pour créer une annonce, l'utilisateur doit saisir le titre, la description de l'annonce et une photo. J'ai utilisé le Bundle VichUploaderBundle pour réaliser l'upload de la photo au niveau de mon API Rest. Ce Bundle permet de ne persister que le nom de la photo et de sauvegarder l'image dans un répertoire du projet.
J'arrive à persister le titre et la description de l'annonce mais pas le nom de la photo. On dirait que la photo n'est pas envoyée au Contrôleur et le repertoire qui doit être créé dans le dossier web pour sauvegarder les photos n'est pas également créé. Lorsque j'effectue un test sur Postman, j'ai des erreurs.
Voici les différents fichiers:
L'entité:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* Annonce
*
* @ORM\Table(name="annonce")
* @ORM\Entity(repositoryClass="AppBundle\Repository\AnnonceRepository")
* @Vich\Uploadable
*/
class Annonce
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="titre", type="string", length=100)
*/
private $titre;
/**
* @var string
*
* @ORM\Column(name="description", type="string", length=255)
*/
private $description;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @var string
*/
private $image;
/**
* @Vich\UploadableField(mapping="annonce_images", fileNameProperty="image")
* @var File
*/
private $imageFile;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set titre
*
* @param string $titre
*
* @return Annonce
*/
public function setTitre($titre)
{
$this->titre = $titre;
return $this;
}
/**
* Get titre
*
* @return string
*/
public function getTitre()
{
return $this->titre;
}
/**
* Set description
*
* @param string $description
*
* @return Annonce
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
public function setImageFile(File $image = null)
{
$this->imageFile = $image;
}
public function getImageFile()
{
return $this->imageFile;
}
public function setImage($image)
{
$this->image = $image;
}
public function getImage()
{
return $this->image;
}
}
Voici le Formulaire:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Vich\UploaderBundle\Form\Type\VichFileType;
class AnnonceType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('titre')
->add('description')
->add('imageFile', VichFileType::class);
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Annonce',
'csrf_protection' => false
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_annonce';
}
}
Voici le Controleur:
<?php
namespace AppBundle\Controller;
use AppBundle\Entity\Annonce;
use AppBundle\Form\AnnonceType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations as Rest; // alias pour toutes les annotations
use Symfony\Component\HttpFoundation\Request;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
class AnnonceController extends Controller
{
/**
* @ApiDoc(
* description="Création d'une annonce ",
* input={"class"=AnnonceType::class, "name"=""}
* )
*
* @Rest\View
* @Rest\Post("/api/newAnnonce")
*/
public function postAnnonceAction(Request $request)
{
$annonce= new Annonce();
$form = $this->createForm(AnnonceType::class, $annonce);
$form->submit($request->request->all());
if ($form->isValid()) {
$em = $this->get('doctrine.orm.entity_manager');
$em->persist($annonce);
$em->flush();
return $annonce->getImageFile()->getFilename();
} else {
return $form;
}
}
}
Voici la configuration du bundle dans le fichier config.yml:
vich_uploader:
db_driver: orm
mappings:
annonce_images:
uri_prefix: '/uploads/images/annonce'
upload_destination: '%kernel.root_dir%/../web/uploads/images/exemple'
namer: vich_uploader.namer_origname
Ce que j'obtiens
Quand je fait un test avec postman, j'ai des erreurs. On dirait que le probleme c'est l'envoie de la photo.
voici les erreurs quand je effectue un test avec Postman:
{
"error": {
"code": 500,
"message": "Internal Server Error",
"exception": [
{
"message": "Call to a member function getFilename() on null",
"class": "Symfony\\Component\\Debug\\Exception\\FatalThrowableError",
"trace": [
{
"namespace": "",
"short_class": "",
"class": "",
"type": "",
"function": "",
"file": "/root/Bureau/mon_projet/SenAnnonce/src/AppBundle/Controller/AnnonceController.php",
"line": 36,
"args": []
},
{
"namespace": "AppBundle\\Controller",
"short_class": "AnnonceController",
"class": "AppBundle\\Controller\\AnnonceController",
"type": "->",
"function": "postAnnonceAction",
"file": null,
"line": null,
"args": [
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"
]
]
},
{
"namespace": "",
"short_class": "",
"class": "",
"type": "",
"function": "call_user_func_array",
"file": "/root/Bureau/mon_projet/SenAnnonce/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php",
"line": 153,
"args": [
[
"array",
[
[
"object",
"AppBundle\\Controller\\AnnonceController"
],
[
"string",
"postAnnonceAction"
]
]
],
[
"array",
[
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"
]
]
]
]
},
{
"namespace": "Symfony\\Component\\HttpKernel",
"short_class": "HttpKernel",
"class": "Symfony\\Component\\HttpKernel\\HttpKernel",
"type": "->",
"function": "handleRaw",
"file": "/root/Bureau/mon_projet/SenAnnonce/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php",
"line": 68,
"args": [
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"
],
[
"integer",
1
]
]
},
{
"namespace": "Symfony\\Component\\HttpKernel",
"short_class": "HttpKernel",
"class": "Symfony\\Component\\HttpKernel\\HttpKernel",
"type": "->",
"function": "handle",
"file": "/root/Bureau/mon_projet/SenAnnonce/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php",
"line": 171,
"args": [
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"
],
[
"integer",
1
],
[
"boolean",
true
]
]
},
{
"namespace": "Symfony\\Component\\HttpKernel",
"short_class": "Kernel",
"class": "Symfony\\Component\\HttpKernel\\Kernel",
"type": "->",
"function": "handle",
"file": "/root/Bureau/mon_projet/SenAnnonce/web/app_dev.php",
"line": 30,
"args": [
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"
]
]
},
{
"namespace": "",
"short_class": "",
"class": "",
"type": "",
"function": "require",
"file": "/root/Bureau/mon_projet/SenAnnonce/vendor/symfony/symfony/src/Symfony/Bundle/WebServerBundle/Resources/router.php",
"line": 42,
"args": [
[
"string",
"/root/Bureau/mon_projet/SenAnnonce/web/app_dev.php"
]
]
}
]
}
]
}
}
Quelqu'un peut m'aider svp?
Déconnexion intenpestif
Bonjour,
Depuis quelque jours j'ai un soucis sur un projet en production. Je précise que se problème ne se présente pas en localhost.
Donc le soucis est que je me fais déconnecter sans raison et que sur une partie de l'application. Je n'ai aucune erreur dans les logs. J'ai vraiment aucune piste sur le pourquoi du comment.
EDIT : En recherchant, j'ai le dossier sessions/%env% qui est tous le temps vide, je présume qu'il n'écrit donc pas les sessions, j'ai fait un chmod rien ne fais. Je ne comprends pas pourquoi alors que il y avais pas de soucis avant... je suis sur OVH
Cordialement.
comment utilisée ajax pour Knp Paginator
Bonjour;
je suis bloquée depuit deux jours et je n'arrive pas à fait une systeme pagination par ajax ,voila le documentation que je utilisée https://github.com/KnpLabs/KnpPaginatorBundle, ce documentation aidée moi à créer une système pagination simple sans utilisée l'ajax ,le souci c'est que leur de clicker sur le bouton suivant la page relouser et perdre beaucoup de temps leurs de passer d'une page à l'autre.
Intéragire avec des données Symfony via une application mobile
Bonjour,
J'ai crée une application en ligne qui contient des utilisateurs et des données.
Ça tourne sur Symfony 3, ça marche et c'est en production.
Je souhaiterai crée une application sur android pour intéragire avec ses données.
Gestion des users et intéragire avec les données.
Peut on faire cela en Json ?
Existe t'il des "framework" pour crée des application android avec du contenu web ?
Merci.
Formulaire imbriqué + entité
Bonjour,
Je rencontre un problème pour créer un formulaire imbriquée assez classique.
J'ai une entité Post qui va donc retenir des postes, ces postes pourront avoir plusieurs images/vidéos donc pour ce faire j'ai créé une deuxième entités Media pour la table qui va gérer les différents médias.
Entité Post :
<?php
/**
* Created by PhpStorm.
* User: jeremybarette
* Date: 11/12/2017
* Time: 17:38
*/
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity()
* @ORM\Table(name="posts")
* @ORM\HasLifecycleCallbacks()
*/
class Post
{
/**
* @var id
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Category")
* @ORM\JoinColumn(nullable=false)
*/
private $category;
/**
* @ORM\Column(type="string", unique=true)
*/
private $name;
/**
* @ORM\Column="string")
*/
private $slug;
/**
* @ORM\Column(type="text")
*/
private $content;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $publishedAt;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Assert\DateTime()
*/
private $updatedAt;
/**
* Post constructor.
*/
public function __construct()
{
$this->publishedAt = new \DateTime();
}
/**
* @return id
*/
public function getId(): id
{
return $this->id;
}
/**
* @param id $id
*/
public function setId(id $id)
{
$this->id = $id;
}
/**
* @return mixed
*/
public function getCategories()
{
return $this->categories;
}
/**
* @param mixed $categories
*/
public function setCategories($categories)
{
$this->categories = $categories;
}
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return mixed
*/
public function getSlug()
{
return $this->slug;
}
/**
* @param mixed $slug
*/
public function setSlug($slug)
{
$this->slug = $slug;
}
/**
* @return mixed
*/
public function getContent()
{
return $this->content;
}
/**
* @param mixed $content
*/
public function setContent($content)
{
$this->content = $content;
}
/**
* @return mixed
*/
public function getPublishedAt()
{
return $this->publishedAt;
}
/**
* @param mixed $publishedAt
*/
public function setPublishedAt($publishedAt)
{
$this->publishedAt = $publishedAt;
}
/**
* @return mixed
*/
public function getUpdatedAt()
{
return $this->updatedAt;
}
/**
* @param mixed $updatedAt
*/
public function setUpdatedAt($updatedAt)
{
$this->updatedAt = $updatedAt;
}
/**
* @ORM\PreUpdate
*/
public function updateDate()
{
$this->setUpdatedAt(new \DateTime());
}
/**
* @return mixed
*/
public function getCategory()
{
return $this->category;
}
/**
* @param mixed $category
*/
public function setCategory($category)
{
$this->category = $category;
}
}
Entité Media :
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="medias")
*/
class Media
{
/**
* @var int
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var int
*
* @ORM\ManyToOne(targetEntity="App\Entity\Post")
* @ORM\JoinColumn(nullable=false)
*/
private $post;
/**
* @ORM\Column(type="integer")
*/
private $type;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $path;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $alt;
private $file;
private $tmpFilename;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $embed;
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @param int $id
*/
public function setId(int $id)
{
$this->id = $id;
}
/**
* @return int
*/
public function getPost(): int
{
return $this->post;
}
/**
* @param int $post
*/
public function setPost(int $post)
{
$this->post = $post;
}
/**
* @return mixed
*/
public function getType()
{
return $this->type;
}
/**
* @param mixed $type
*/
public function setType($type)
{
$this->type = $type;
}
/**
* @return mixed
*/
public function getPath()
{
return $this->path;
}
/**
* @param mixed $path
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* @return mixed
*/
public function getAlt()
{
return $this->alt;
}
/**
* @param mixed $alt
*/
public function setAlt($alt)
{
$this->alt = $alt;
}
/**
* @return mixed
*/
public function getFile()
{
return $this->file;
}
/**
* @param mixed $file
*/
public function setFile($file)
{
$this->file = $file;
}
/**
* @return mixed
*/
public function getTmpFilename()
{
return $this->tmpFilename;
}
/**
* @param mixed $tmpFilename
*/
public function setTmpFilename($tmpFilename)
{
$this->tmpFilename = $tmpFilename;
}
/**
* @return mixed
*/
public function getEmbed()
{
return $this->embed;
}
/**
* @param mixed $embed
*/
public function setEmbed($embed)
{
$this->embed = $embed;
}
}
A côté j'ai deux formulaires, l'un pour gérer l'entité Post l'autre pour gérer l'entité Media.
Formulaire Post :
<?php
namespace App\Form;
use App\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TrickType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('content', TextareaType::class)
->add('media', MediaType::class)
->add('save', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Post::class
));
}
}
Formulaire Media:
<?php
namespace App\Form;
use App\Entity\Media;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class MediaType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class)
->add('embed', TextType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Media::class
));
}
}
Et pour finir j'ai évidemment un controller "BlogController" :
<?php
namespace App\Controller;
use App\Entity\Post;
use App\Form\TrickType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class BlogController extends Controller
{
/**
* @Route("/blog/add", name="blog_add")
* @Security("has_role('ROLE_USER')")
*
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function add(Request $request)
{
$post = new Post();
$form = $this->createForm(TrickType::class, $post);
$form->handleRequest($request);
return $this->render('blog/add.html.twig', [
'form' => $form->createView()
]);
}
}
Qui va juste se contenter pour le moment d'envoyer le formulaire à la vue.
Pour l'instant le résultat n'est pas au rendez-vous. Voici l'erreur obtenue :
Neither the property "media" nor one of the methods "getMedia()", "media()", "isMedia()", "hasMedia()", "__get()" exist and have public access in class "App\Entity\Post".
L'erreur est assez logique effectivement mais du coup je ne vois pas du tout comment faire mon formulaire imbriqué. Je trouve ça totalement illogique de mettre les getters/setters dans l'entité Post sachant que ce n'est pas elle qui gère les médias.
J'espère que j'ai été clair, je vous remercie de votre aide !
FOSUserBundle via composer
Bonjour tous le monde !
Jessaye d'installation FOSUserBundle avec la nouvel architecture de Symfony.
Je fais donc :
composer require friendsofsymfony/user-bundle
et là j'ai une erreur
The child node "db_driver" at path "fos_user"
en regardant la doc il faut que je mette dans le fichier config.yml
fos_user:
db_driver: orm # other valid values are 'mongodb' and 'couchdb'
firewall_name: main
user_class: AppBundle\Entity\User
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
le problèle est que peut importe où je met se code j'ai une erreur. C'est quoi qui remplace le fichier config ?
J'ai essayé service.yaml, framemork.yaml ....
Si quelqu'un à déjà essayé de l'intégré une petite aide s'il vous plait
:D