C'est très gentil de ta et je suis heureux te t'avoir permis à trouver une solution. Pour le reste, suis le cours attentivement (je te le conseille). Il est vrai que la dernière évaluation fait très peur mais (même si j'ai eu moi-même très peur au départ) mais au final j'ai fini par commencer (c(est cela le plus dur) et puis, de proche rn proche on arrive presque tous a concevoir un système qui marche. L'informatique, vois tu c'est avant de ka logique 1 ou 0 ! Après il faut un peu réfléchir et, je te l'assure, on arrive à faire un "truc" qui marche.
N'hésites pas à revenir voir nous, ce sera toujours un plaisir.
//A
private $_db;
//B
public function __construct($db)
{
$this->setDb($db);
}
//C
public function setDb(PDO $db)
{
$this->_db = $db;
}
A : $_db est un attribut contenant une instance PDO (question 1 : instance PDO préalablement créée ? où ?)
B : à chaque création d'une nouvelle instance Manager, on appelle la fonction setDb()
C : on déclare une fonction setDb() ayant pour paramètre "PDO $db". (question 2 : pourquoi "PDO $db" et pas juste "db" ? ça signifie quoi ?)
Cette fonction setDb() fait que l'attribut qui contient l'instance PDO (càd $_db) prend la valeur "$db". (question 3 : mais c'est quoi "$db" ??)
Voilà, j'ai réussi à me paumer avec ça. Si vous le pouvez, merci d'avance pour une explication avec des mots simples, pas de jargon, comme si vous deviez expliquer ça à un enfant de 6 ans ;-)
Edit : ça n'empêche rien de fonctionner. Mais je n'aime pas ne pas comprendre pourquoi ça marche !
A - L'objet $db doit effectivement être créer avant le manager. Dans cette partie du cours, elle est crée au tout début du fichier index
$db = new PDO('mysql:server='.$host.';dbname='.$database.';charset=utf8', root, '');
et dans ce cas, dans le manager $_db est une propriété privée de la classe manager et pour la lier à la l'objet PDO crée ci-dessus il faut passer par le setter :
public function set_db(PDO $db) : void
{
$this -> _db = $db;
}
C'est donc un objet PDO qui doit être passé en argument. PDO devant le paramètre est le type de donné du paramètre. Il est en effet possible dans tous les cas de préciser comme je l'ai fait sur la déclaration de la méthode les types des paramètres passés en argument ainsi que le type de données renvoyée (ici void). Les dernières normes de PHP impose d'ailleurs de donner ces précisions.
Et donc ta question B est oui, chaque instance du manager doit appeler cette méthode mais cela n'implique pas forcement que l'on doivent relire la base de données puisque elle est déjà présente dans l'objet $db.
Pour ta question C, les réponses figurer déjà dans mes réponses précédentes.
Est-ce que cette explication réponds à ta demande ? Merci de me le préciser.
J'ai bien l'appel à la db mais je ne sais pas quoi en faire.
Je ne vois pas comment créer mes fichiers, j'ai :
un fichier Personnage
un fichier PersonnagesManager
et ce bout de code dont je ne sais pas quoi faire où le placer
<?php
// On admet que $db est un objet PDO.
$request = $db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages');
while ($donnees = $request->fetch(PDO::FETCH_ASSOC)) // Chaque entrée sera récupérée et placée dans un array.
{
// On passe les données (stockées dans un tableau) concernant le personnage au constructeur de la classe.
// On admet que le constructeur de la classe appelle chaque setter pour assigner les valeurs qu'on lui a données aux attributs correspondants.
$perso = new Personnage($donnees);
echo $perso->nom(), ' a ', $perso->forcePerso(), ' de force, ', $perso->degats(), ' de dégâts, ', $perso->experience(), ' d\'expérience et est au niveau ', $perso->niveau();
}
Personnage :
<?php
class Personnage
{
private $_id;
private $_nom;
private $_forcePerso;
private $_degats;
private $_niveau;
private $_experience;
//Un tableau de données doit être passé à la fonction (d'où le préfixe "array").
public function hydrate(array $donnees)
{
foreach ($donnees as $key => $value)
{
$method = 'set'.ucfirst($key);
if (method_exists($this, $method))
{
$this->$method($value);
}
}
}
//liste des getters
public function id() { return $this->_id; }
public function nom() { return $this->_nom; }
public function forcePerso() { return $this->_forcePerso; }
public function degats() { return $this->_degats; }
public function niveau() { return $this->_niveau; }
public function experience() { return $this->_experience; }
// Liste des setters
public function setId($id)
{
// On convertit l'argument en nombre entier.
// Si c'en était déjà un, rien ne changera.
// Sinon, la conversion donnera le nombre 0 (à quelques exceptions près, mais rien d'important ici).
$id = (int) $id;
}
public function setNom($nom)
{
// On vérifie qu'il s'agit bien d'une chaîne de caractères.
if (is_string($nom))
{
$this->_nom = $nom;
}
}
public function setForcePerso($forcePerso)
{
$forcePerso = (int) $forcePerso;
if ($forcePerso >= 1 && $forcePerso <= 100)
{
$this->_forcePerso = $forcePerso;
}
}
public function setDegats($degats)
{
$degats = (int) $degats;
if ($degats >= 0 && $degats <= 100)
{
$this->_degats = $degats;
}
}
public function setNiveau($niveau)
{
$niveau = (int) $niveau;
if ($niveau >= 1 && $niveau <= 100)
{
$this->_niveau = $niveau;
}
}
public function setExperience($experience)
{
$experience = (int) $experience;
if ($experience >= 1 && $experience <= 100)
{
$this->_experience = $experience;
}
}
}
PersonnagesManager :
<?php
class PersonnagesManager
{
public function __construct($db)
{
$this->setDb($db);
}
public function add(Personnage $perso)
{
$q = $this->_db->prepare('INSERT INTO personnages(nom, forcePerso, degats, niveau, experience) VALUES (:nom, :forcePerso, :degats, :niveau, :experience)');
$q->bindValue(':nom', $perso->nom());
$q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT);
$q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
$q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT);
$q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT);
$q->execute();
}
public function delete(Personnage $perso)
{
$this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
}
public function get($id)
{
$id = (int) $id;
$q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages WHERE id = '.$id);
$donnees = $q->fetch(PDO::FETCH_ASSOC);
return new Personnage($donnees);
}
public function getList()
{
$persos = [];
$q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages ORDER BY nom');
while($donnees = $q->fetch(PDO::FETCH_ASSOC))
{
$persos[] = new Personnage($donnees);
}
return $persos;
}
public function update(Personnage $perso)
{
$q = $this->_db->prepare(UPDATE personnages SET forcePerso=:forcePerso, degats:=degats, niveau=:niveau, experience=:experience WHERE id=:id);
$q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT);
$q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
$q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT);
$q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT);
$q->bindValue(':id', $perso->id(), PDO::PARAM_INT);
$q->execute();
}
public function __construct($db)
{
$this->setDb($db);
}
}
$perso = new Personnage([
'nom' => 'Victor',
'forcePerso' => 5,
'degats' => 0,
'niveau' => 1,
'experience' => 0
]);
$db = new PDO('mysql:host=localhost;dbname=jeu_combat', 'root', '');
$manager = new PersonnagesManager($db);
$manager->add($perso);
Pour te répondre assez simplement, ton bout de code devrait te lister à l'écran la liste des personnages. Tout marcherait parfaitement si lors de la création du personnage (ou après) il existait un appel à tous les setters de Personnage. C'est l'objet, je crois, de ce chapitre du cours et de la méthode hydrate qui automatise l'appel de tous les setters.
public function hydrate(array $donnees): void
{
foreach ($donnees as $key => $value)
{
$method = 'set'.ucfirst($key);
if (method_exists($this, $method))
{
$this -> $method($value);
}
}
}
Après cela, soit tu crées ton personnage puis tu appelles la méthode hydrate :
$perso = new Personnage();
$perso -> hydrate($donnees);
Soit tu crées un constructeur qui, comme il est écrit dans un des commentaires du premier code que tu as envoyé, fait appel directement à la méthode hydrate. En effet, dans ton code on trouve $perso = new Personnage($donnees) où $donnees est un tableau (array) mais aucun constructeur correspondant, c'est à dire qui accepte un tableau en argument n'existe. Et, malheureusement, PHP, ne signale pas cette erreur lors de la surcharge d'un constructeur.
Plus simplement, il faudrait faire :
public function hydrate(array $donnees): void
{
foreach ($donnees as $key => $value)
{
$method = 'set'.ucfirst($key);
if (method_exists($this, $method))
{
$this -> $method($value);
}
}
}
public function __construct(array $donnees)
{
$this -> hydrate($donnees);
}
Et cette fois, cela marchera lorsque tu appelleras les getters du personnage par $perso -> nom() par exemple, qui pour l'instant ne te renvoyais rien.
Ce que je te propose c'est de mettre ton bout de code dans un fichier test.php et d'essayer. Cela devrait marcher.
Il y a aussi une petite erreur dans ta classe PersonnageManager() où la méthode __construct($db) est répétée 2 fois.
Afin de t'aider à mieux comprendre, j'ai reconstruit tout cela et créée un fichier index.php qui utilise ce principe et permet de créer autant de personnage que tu le souhaiteras.
Tout d'abord merci Patrick. Tout n'est pas encore limpide mais tes explications m'ont beaucoup aidé. Et j'ai reussi l'exercice. J'ai essayé de le mettre en MVC mais je crois que c'est un peu trop pour mon niveau encore...
J'aurai encore quelques questions :
A quoi sert la méthode:
public function setDb(PDO $db)
{
$this -> _db = $db;
}
et pourquoi faut-il également un constructor dans la méthode PersonnagesManager ?
C'est assez simple en fait, à chaque fois que le manager est appelé pour une quelconque requête, on trouve toujours :
$req = _dbd -> execute (ou prépare)
à ce moment là il faut que le manager sache ce que représente _db (d'où d'ailleurs ta question…)
Et, c'est UNIQUEMENT lors de la création du manager lorsque l'on fait :
$manager = new PersonnageManager($db);
que le constructeur (dont tu parles) s'exécute et crée une relation entre la base de données réelle et la variable $_db de la classe.
Ce constructeur est donc nécessaire pour établir cette relation. Ensuite, chaque requête, par l'intermédiaire de $_db permet d'interroger la base de données réelle.
Je ne sais pas si tu comprends mieux. Dis le moi, c'est important.
Bon courage, ce cours que j'ai fini avec succès, n'est vraiment pas facile.
J'ai compris, c'est beaucoup plus clair comme ça !
Ma réactivité est moins bonne que la votre, semaine trop chargée par ailleurs pour retourner avant sur Open Classrooms!
(A, B et C n'étaient pas des questions, mais les marqueurs pour indiquer les morceaux de code plus clairement ; mais vous avez bien répondu à mes interrogations !)
Je n'avais pas trouvé d'info qui me paraissait assez claire dans les commentaires précédents
Merci encore, j'avance dans mon apprentissage et ma compréhension !
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
The DATETIME type is used for values that contain both date and time parts. MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD hh:mm:ss' format. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
De plus, selon le mode dans lequel est votre configuration de MySQL, toujours la documentation officielle précise les cas où une date 0000-00-00 peut ou non être acceptée.
Dans tous les cas, la date "0000-00-00" n'est pas dans la plage correcte du type DATE ou DATETIME et ne peut donc être visiblement pas affectée à cette valeur. C'est la même chose si l'on tente d'imposer une date avec la valeur nulle. Il semble cependant que lorsque le mode sql ne précise pas "no zero in date", ce soit "0000-00-00" qui est enregistré s'il n'y a pas de date de précisé mais c'est uniquement MySQL qui peut placer cette valeur par défaut en l'absence de donnée pour ce champ.
Voilà, sauf mauvaise interprétation de la documentation de MySQL, ce que je peux te proposer comme réponse à tes interrogations. La première valeur que vous proposez passe normalement puisqu'elle est située dans la plage de date acceptée.
J'essaye désespéremment de gérer une liaison Doctrine ManyToOne entre une table UserApp et RoleApp, avec dans la table UserApp la clef étrangère role_id, mais j'ai des difficultés à faire marcher tout ça ; il y a un détail qui m'échappe mais je n'arrive pas à trouver. Merci par avance pour votre aide, je poste mon code ;
<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Validator\Constraints as Assert; use App\Repository\UserRoleRepository; /** * @ORM\Entity(repositoryClass="App\Repository\UserAppRepository") * @ORM\Table(name="user_app") * * Defines the properties of the User entity to represent the application users. * See https://symfony.com/doc/current/book/doctrine.html#creating-an-entity-class * * Tip: if you have an existing database, you can generate these entity class automatically. * See https://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html * * @author Ryan Weaver <weaverryan@gmail.com> * @author Javier Eguiluz <javier.eguiluz@gmail.com> */ class UserApp implements UserInterface, \Serializable { /** * @var int * * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @var string * * @ORM\Column(type="string", unique=true) * @Assert\NotBlank() * @Assert\Length(min=2, max=50) */ private $username; /** * @var string * * @ORM\Column(type="string", unique=true) * @Assert\Email() */ private $email; /** * @var string * * @ORM\Column(type="string") */ private $password; /** * @ORM\Column(type="integer") */ private $affectationUnitId; /** * @ORM\Column(type="datetime", nullable=true) */ private $createdAt; /** * @ORM\Column(type="datetime") */ private $updatedAt; /** * @ORM\Column(type="boolean") */ private $isActive; /** * @var UserRole * @ORM\ManyToOne(targetEntity="App\Entity\UserRole") * @ORM\JoinColumn(nullable=false) * */ private $role; /** * @ORM\Column(type="string", length=60) */ private $firstName; /** * @ORM\Column(type="string", length=60) */ private $lastName; public function getId(): ?int { return $this->id; } public function getFirstName(): ?string { return $this->firstName; } public function setFirstName(string $firstName): self { $this->firstName = $firstName; return $this; } public function getLastName(): ?string { return $this->lastName; } public function setLastName(string $lastName): self { $this->lastName = $lastName; return $this; } public function getFullName() { return "{$this->firstName} {$this->lastName}"; } public function getUsername(): ?string { return $this->username; } public function setUsername(string $username): void { $this->username = $username; } public function getEmail(): ?string { return $this->email; } public function setEmail(string $email): void { $this->email = $email; } public function getPassword(): ?string { return $this->password; } public function setPassword(string $password): void { $this->password = $password; } /** * Returns the roles or permissions granted to the user for security. */ public function getRoles(): array { $UserRoleRepository = new UserRoleRepository(); $roleObj = $UserRoleRepository->getUserRole($this); dump($roleObj); return []; //return array_unique($roleObj); } /* public function getRoles(): array { return ["ROLE_ADMIN"]; }*/ public function setUserRole(UserRole $role): void { $this->role = $role; } public function getUserRole(): string { return $this->role; } /** * Returns the salt that was originally used to encode the password. * * {@inheritdoc} */ public function getSalt(): ?string { // See "Do you need to use a Salt?" at https://symfony.com/doc/current/cookbook/security/entity_provider.html // we're using bcrypt in security.yml to encode the password, so // the salt value is built-in and you don't have to generate one return null; } public function getAffectationUnitId(): ?int { return $this->affectationUnitId; } public function setAffectationUnitId(int $affectationUnitId): self { $this->affectationUnitId = $affectationUnitId; return $this; } public function getCreatedAt(): ?\DateTimeInterface { return $this->createdAt; } public function setCreatedAt(?\DateTimeInterface $createdAt): self { $this->createdAt = $createdAt; return $this; } public function getUpdatedAt(): ?\DateTimeInterface { return $this->updatedAt; } public function setUpdatedAt(\DateTimeInterface $updatedAt): self { $this->updatedAt = $updatedAt; return $this; } public function getIsActive(): ?bool { return $this->isActive; } public function setIsActive(bool $isActive): self { $this->isActive = $isActive; return $this; } /** * Removes sensitive data from the user. * * {@inheritdoc} */ public function eraseCredentials(): void { // if you had a plainPassword property, you'd nullify it here // $this->plainPassword = null; } /** * {@inheritdoc} */ public function serialize(): string { // add $this->salt too if you don't use Bcrypt or Argon2i return serialize([$this->id, $this->username, $this->password]); } /** * {@inheritdoc} */ public function unserialize($serialized): void { // add $this->salt too if you don't use Bcrypt or Argon2i [$this->id, $this->username, $this->password] = unserialize($serialized, ['allowed_classes' => false]); } /** * Returns the roles in string format for eeasyadmin. */ public function getRoleValue(): string { return implode(" ", $this->getRoles()); } }
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRoleRepository")
*/
class UserRole
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $roleName;
/**
* @ORM\Column(type="json")
*/
private $appRole = [];
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $createdAt;
/**
* @ORM\Column(type="datetime")
*/
private $updatedAt;
/**
* @ORM\Column(type="boolean")
*/
private $isActive;
/**
* @ORM\Column(type="integer")
*/
private $parentRole;
/**
* @ORM\Column(type="integer")
*/
private $ordre;
public function __construct()
{
}
public function getId(): ?int
{
return $this->id;
}
public function getRoleName(): ?string
{
return $this->roleName;
}
public function setRoleName(string $roleName): self
{
$this->roleName = $roleName;
return $this;
}
public function getAppRole(): ?array
{
$roles = $this->appRole;
if (empty($roles)) {
$roles[] = 'ROLE_USER';
}
return array_unique($roles);
}
public function getThecrole() :?string
{
$roles = $this->getAppRole();
$oneRole = "";
foreach ($roles as $role){
$oneRole = $role;
}
return $oneRole;
}
public function setAppRole(array $appRole): void
{
$this->appRole = $appRole;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(?\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getIsActive(): ?bool
{
return $this->isActive;
}
public function setIsActive(bool $isActive): self
{
$this->isActive = $isActive;
return $this;
}
public function getOrdre(): ?int
{
return $this->ordre;
}
public function setOrdre(int $ordre): self
{
$this->ordre = $ordre;
return $this;
}
public function getParentRole(): ?int
{
return $this->parentRole;
}
public function setParentRole(int $parentRole): self
{
$this->parentRole = $parentRole;
return $this;
}
}
<?php
namespace App\Repository;
use App\Entity\UserRole;
use App\Entity\UserApp;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
/**
* @method UserRole|null find($id, $lockMode = null, $lockVersion = null)
* @method UserRole|null findOneBy(array $criteria, array $orderBy = null)
* @method UserRole[] findAll()
* @method UserRole[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class UserRoleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, UserRole::class);
}
public function getUserRole(UserApp $user)
{
return $this->find(1); // j'ai mis 1 en dur pour des raisons de Debug
}
// /**
// * @return UserRole[] Returns an array of UserRole objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('u')
->andWhere('u.exampleField = :val')
->setParameter('val', $value)
->orderBy('u.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?UserRole
{
return $this->createQueryBuilder('u')
->andWhere('u.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}
Je suis bloqué lorsque je finit le premier controleur du Frontend, car je devrais juste avoir une page vide (pas encore des News dans la base), et moi je vois des erreurs diverses
De suite la page bootstrap une fois que je l'ai chargée
Quelqu'un a eu le meme souci? Si oui, comment l'avez-vous résolu?
Merci d'avance pour toute réponse!
- Edité par MarcoBolloli 8 janvier 2020 à 11:05:16
Je suis arrivé à resoudre les erreurs, il s'agissait de :
1) problème tout bete de format de la ressource (pour le fichier routes.xml qui était pas trouvé);
2) finalement j'avais oublié (?!) une ligne de code dans la classe Page qui definissait la variable user à passer à la vue.
Par contre, je me rends compte que mon Wamp est toujours mal configuré, car ma racine n'est pas "/", mais "/<nomduprojet>/Web/"...j'ai pourtant suivi les indications du prof pour la redirection, et j'ai rajouté à mon fichier httpd.conf ces lignes:
<VirtualHost 127.0.0.1>
ServerAdmin webmaster@localhost
# Mettez ici le nom de domaine que vous avez utilisé dans le fichier hosts.
ServerName monsupersite
# Mettez ici le chemin vers lequel doit pointer le domaine.
# Je suis sous Linux. Si vous êtes sous Windows, le chemin sera de la forme C:\Wamp\www\monsupersite\Web
DocumentRoot C:\wamp64\www\POO_class_TP3_OCFram\Web
<Directory C:\wamp64\www\POO_class_TP3_OCFram\Web>
Options Indexes FollowSymLinks MultiViews
# Cette directive permet d'activer les .htaccess.
AllowOverride All
# Si le serveur est accessible via l'Internet mais que vous n'en faites qu'une utilisation personnelle
# pensez à interdire l'accès à tout le monde
# sauf au localhost, sinon vous ne pourrez pas y accéder !
Allow from all
</Directory>
</VirtualHost>
Je comprends pas ce que fais mal...as-tu des pistes à mes donner?
Merci!
- Edité par MarcoBolloli 9 janvier 2020 à 11:39:30
Je remarque que tu est sur un serveur en ligne. Mais tu me parle toujours de wamp en local. Je comprend plus. Finalement tu travail en ligne ou en local?
Salut à tous ! Moi c'est MGM777, j'ai une préoccupation avec la partie 3 de ce cours; précisément avec les l'application frontend lors de l'instanciation de la classe frontendApplication dans "Web/frontend.php" l'erreur ci-dessous a été généré. Juste avant la classe j'ai juste inclus l'autoload.php
Voici le code de "Library/autoload.php"
<?php
function ajoutClasse($classe)
{
include_once "../".str_replace("\\","/",$classe).".class.php";
}
spl_autoload_register("ajoutClasse");
?>
Voici le code de "Web/frontend.php"
<?php
include_once "../Library/autoload.php";
$frontend= new Application\Frontend\FrontendApplication();
$frontend->run();
?>
Voici le code de "frontendApplication.php"
<?php
namespace Application\Frontend;
class FrontendApplication extends \Library\Application
{
//Les attributs
// protected $;
//Les constructeurs et destructeurs
public function __Construct()
{
parent::__Construct();
$this->name='Frontend';
}
//Les getters et les setters
// public function (){}
//Les methodes d'instance
// public function (){}
public function run()
{
$controller=$this->getController(); //On recupère le controler du module.
$controller->execute();//On execute l'action
$this->httpReponse->setPage($controller->page());//On assigne une page a la reponse
$this->httpReponse->send();//On envoie la reponse a l'utilisateur
}
}
?>
Voila ce sont les fichiers concerné je pense par l'erreur. Merci d'avance Pour toutes les réactions.
@GeorgesMaximeMbassegue par contre dans ton dernier files, mettre autant de commentaire est inutile, ex la L22 on sais que c'est ca exécute tes pas obligé de réécrire la même choses en 'FR'
- Edité par FrançoisSchmitt1 24 janvier 2020 à 16:08:42
@FrançoisSchmitt1 Super, sa fonctionne, Merci! Par contre j'ai pas compris cette façon de passer des variables dans L’URL une explication ne serait pas de refus.
<?php
/*
En géneral on fait :
*/
?>
<a href="news.php?id=777&second_var=etc">Le lien</a>
<?php
/*
Mais ici je suis perdu :
*/
?>
<a href="news.php-id-second-var">Le lien</a>
Je suis arrivé à resoudre les erreurs, il s'agissait de :
1) problème tout bete de format de la ressource (pour le fichier routes.xml qui était pas trouvé);
2) finalement j'avais oublié (?!) une ligne de code dans la classe Page qui definissait la variable user à passer à la vue.
Par contre, je me rends compte que mon Wamp est toujours mal configuré, car ma racine n'est pas "/", mais "/<nomduprojet>/Web/"...j'ai pourtant suivi les indications du prof pour la redirection, et j'ai rajouté à mon fichier httpd.conf ces lignes:
<VirtualHost 127.0.0.1>
ServerAdmin webmaster@localhost
# Mettez ici le nom de domaine que vous avez utilisé dans le fichier hosts.
ServerName monsupersite
# Mettez ici le chemin vers lequel doit pointer le domaine.
# Je suis sous Linux. Si vous êtes sous Windows, le chemin sera de la forme C:\Wamp\www\monsupersite\Web
DocumentRoot C:\wamp64\www\POO_class_TP3_OCFram\Web
<Directory C:\wamp64\www\POO_class_TP3_OCFram\Web>
Options Indexes FollowSymLinks MultiViews
# Cette directive permet d'activer les .htaccess.
AllowOverride All
# Si le serveur est accessible via l'Internet mais que vous n'en faites qu'une utilisation personnelle
# pensez à interdire l'accès à tout le monde
# sauf au localhost, sinon vous ne pourrez pas y accéder !
Allow from all
</Directory>
</VirtualHost>
Je comprends pas ce que fais mal...as-tu des pistes à mes donner?
Merci!
- Edité par MarcoBolloli 9 janvier 2020 à 11:39:30
Salut Marco, je suis dans la même situation que toi, as-tu trouvé une solution j'y suis depuis 2 jours, bref
@FrançoisSchmitt1 Super, sa fonctionne, Merci! Par contre j'ai pas compris cette façon de passer des variables dans L’URL une explication ne serait pas de refus.
<?php
/*
En géneral on fait :
*/
?>
<a href="news.php?id=777&second_var=etc">Le lien</a>
<?php
/*
Mais ici je suis perdu :
*/
?>
<a href="news.php-id-second-var">Le lien</a>
Salut,
un exemple assez concret, tu as un formulaire de connexion.
avec ton premier lien, peu importe quel utilisateur va ce connecté, aura le lien, http://login?id=777
cependant si tu utilise une url avec une variable $id=? doit changé.
L'utilisateur avec L'ID 15 va ce connecté, le lien sera http://login?id=15
qui lui va chercher le genre de série qui est romantique, mais qui est l'ID 77 et te transmettre toute donnée que tu aura besoin (nom, date, genre, durée, saisons .... etc)
- Edité par FrançoisSchmitt1 12 février 2020 à 13:34:01
Déjà je salut cette volonté d'aider ! Mais j'ai comme l'impression qu'on s'est pas compris . Alors je vais reprendre, ma préoccupation est la suivante : Comment avec cette nouvelle façon de transmettre des variables dans l’URL ont parvient a récupérer les données dans la variables $_GET["nameIndex"] ?
<?php
news.php?firstVar=77&secondVar=7
//La normale je doit simplement doit recupérer les données
$1=$_GET["firstVar"; $v2=$_GET["secondVar;
/*
Cependant je comprends pas la nouvelle façon de faire, comment récupérer les données et surtout comment c'est possible d'écrire sa sans toute fois que le protocole HTTP ne renvoie une erreur
*/
news.php-firstVar-secondVar
?>
De plus j'ais vus nul par dans le cours une explication qui explique cette façon de programmer, je suis vraiment <<perdus>>!
Salut @djedjethai, ce que j'essaye de vous faire comprendre en faite c'est que dans la partie 3 du cours il y'a la a création de tout un nouveau system de des requette HTTP ; a travers les classe HTTP_REQUEST, HTTP_RESPONSE ceux qui est complètement différent de la manière classique de passe les variables par url.
//transmission classique de source.php a traitement.php
//source.php
<a href=traitement.php?variable=contenu;&var2=cont>vers traitetement.</a>
//traitement.php
//dans url du navigateur on a :http:traitement.php?variable=contenu;&var2=cont
//et ont peut faire ici
ECHO $_GET['variable'].''.$_GET['var2'];
//Maintenant avec le system !!!!! D'une requette source.php vers traitement.php
// le system genere l'url la requette source
href=traitement.php?variable=contenu-var2 vers il y'as plus de lien 'physique'
//traitement.php
//dans url du navigateur on a :http://traitement.php?variable-var2
//et ont peut toujours faire ici
ECHO $_GET['variable'].''.$_GET['var2'];
//Avec le systeme les fichiers source.php et traitement.php n'existe pas.
c'est un casse tete chinois , ceux que je souhaite comprendre en realite comment mon code interpete la dernier url (http:traitement.php?variable-var2) et ce n'est pas bien expliquer dans le cours Merci d'avance !!!!!!
public function getData($key)
{
return isset($_GET[$key]) ? $_GET[$key] : null;
}
cette derniere revient exaxtement au meme que ce que j'ai ecrit dans le dernier message: elle renvoie la valeur passer dans l'url
cette class est implemente des le depart dans le constructeur de la class Application.php
public function __construct()
{
$this->httpRequest = new HTTPRequest($this);
$this->httpResponse = new HTTPResponse($this);
$this->name = '';
$this->user = new User;
$this->config = new Config($this);
$this->cache = new CacheEngine($this);
}
class qui est injectee dans ApplicationComponent.php
public function __construct(Application $app)
{
$this->app = $app;
}
et tous les controller (ici y a que 2, la class NewsController.php du app/frontend et celle du app/backend)heritent du BackController.php, du coup on acces a cette HTTPRequest.php
class NewsController extends BackController
{
Dans ces fameux controller, on retrouve parfois une ligne de code tel que (ici du NewsController.php app/frontEnd)
public function executeShow(HTTPRequest $request)
{
$news = $this->managers->getManagerOf('News')->getUnique($request->getData('id'));
.........
cette ligne de code revient a faire (donc revient a mon precedent message)
@djedjethai Merci pour cette brillante explication qui aide a mieux comprendre cependant il reste quelques interrogation
notamment cette façon de passe des variables dans l’URL : Quand ont veux passe des variables dans l’URL de manière classique après le ? toutes variables sont séparer par & chaque est suivie par sa valeur
//dans source.php ont a un lien vers traitement.php, les parametre sont transmit de manniere classique dans l'url.
<a href='traitement.php?var1=7&var2=77'></a>
//Donc naturellement ont récupère ici dans traitement.php
echo $_GET['var1'];echo $_GET['var2'];
//La ya pas de soucis ont peut le comprendre
Cependant dans la partie trois du cours la forme de l'URL a changer ont transmet plus l'index suivie de la valeur mais directement les valeur et séparer par des tiret (valeurs-valeurs2). exemple fichier index.php et show.php (dans frontend/modules/) .
//dans show.php et index.php ont a un lien vers traitement.php, les paramètre sont transmit de maniere classique dans l'url.
<a href='news-7-77.html'>vers</a>
//Mais ici ont une forme d'url différente que dans traitement.php mais on accède de la même façon aux valeurs d'ou mon interrogation
echo $_GET['var1'];echo $_GET['var2'];
Il faudrait une fonction particulière dans HTTPRequest ou HTTPResponse pour traiter cela non !
Existe t'il un mécanisme qui rend cela possible ? Merci !!!
On appelle ça de la réécriture d'url, qui peut être géré de différentes manières, comme par exemple, soit via un fichier .htaccess ou via un système de Router qui lui va être au niveau PHP.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
@lartak oui mais il n y' as pas dans le cours de fonction qui se charge de récupérer ces paramètres. c.a.d qui assigne chaque valeur a un index, c'est de sa que je parle en faite.
@MGM777. Dans la version final du cours (dans le fichier show.php), cela n'apparait pas. Effectivement la question est interressante. Est ce que cela fonctionne (perso j'ai un doute...) ? Si cela ne fonctionne pas, il doit probablement s'agir d'une err.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.