Я новичок в Symfony и у меня проблема с отправкой формы с данными в базу данных.Так что я сделал ссылку, но почему-то логика не ловит, что я отправил форму.Это мой контроллер, где я проверяю, отправил ли я и зашифровал ли мой пароль:
use AppBundle\Entity\UserLogin;
use AppBundle\Form\UserType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;//removed it because it says it is depricated in 3.4
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class SecurityController extends Controller
{
/**
* @Route("/login", name="sec_login")
* @Method("POST")//removed it, because I do not use the namespace anymore
* @return \Symfony\Component\HttpFoundation\Response
*/
public function loginAction(){
return $this->render("default/index.html.twig");
}
/**
* @Route("/register", name="sec_register")
* @Method("POST")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function registerAction(Request $request){
$user = new UserLogin();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$password = $this->get("security.password_encoder")
->encodePassword($user, $user->getPassword());
$user->setPassword($password);
print_r('here');
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->redirectToRoute("sec_login", array('form'=>$form->createView()));
}
var_dump($user);
return $this->render("default/index.html.twig");
}
/**
* @Route("/profile", name="user_profile")
*/
public function profileAction(){
return $this->render('default/profile.html.twig');
}
}
Моя сущность для базы данных:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Userlogin
*
* @ORM\Table(name="user_login")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserLoginRepository")
*/
class UserLogin implements UserInterface
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @Assert\NotBlank()
* @ORM\Column(name="username", type="string", length=20, unique=true)
*/
private $username;
/**
* @var string
* @Assert\NotBlank()
* @Assert\Type("\email")
* @ORM\Column(name="email", type="string", length=20, unique=true)
*/
private $email;
/**
* @var string
* @Assert\NotBlank()
* @Assert\Type("\password")
* @ORM\Column(name="password", type="string", length=25)
*/
private $password;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set username
*
* @param string $username
*
* @return UserLogin
*/
public function setUsername($username)
{
$this->username = $username;
return $this;
}
/**
* Get username
*
* @return string
*/
public function getUsername()
{
return $this->username;
}
/**
* Set email
*
* @param string $email
*
* @return UserLogin
*/
public function setEmail($email)
{
$this->email = $email;
return $this;
}
/**
* Get email
*
* @return string
*/
public function getEmail()
{
return $this->email;
}
/**
* Set password
*
* @param string $password
*
* @return UserLogin
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Returns the roles granted to the user.
*
* <code>
* public function getRoles()
* {
* return array('ROLE_USER');
* }
* </code>
*
* Alternatively, the roles might be stored on a ``roles`` property,
* and populated in any number of different ways when the user object
* is created.
*
* @return (Role|string)[] The user roles
*/
public function getRoles()
{
// TODO: Implement getRoles() method.
return [];
}
/**
* Returns the salt that was originally used to encode the password.
*
* This can return null if the password was not encoded using a salt.
*
* @return string|null The salt
*/
public function getSalt()
{
// TODO: Implement getSalt() method.
}
/**
* Removes sensitive data from the user.
*
* This is important if, at any given point, sensitive information like
* the plain-text password is stored on this object.
*/
public function eraseCredentials()
{
// TODO: Implement eraseCredentials() method.
}
}
И форма:
<?php
namespace AppBundle\Form;
use AppBundle\Entity\UserLogin;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add("username", TextType::class)
->add("email", EmailType::class)
->add("password", PasswordType::class)
->add("registered", SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array("data_class" => UserLogin::class));
}
public function getBlockPrefix()//removed that, because some people suggested that this might cause problems
{
return 'app_bundle_user_type';
}
}
Мой шаблон таков:
{% extends 'base.html.twig' %}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('/css/indexStyle.css') }}">
{% endblock %}
{% block body %}
<div class="navbar" id="heading">
<span id="wepart">We</span><span id="conpart">Connect</span>
<span ><a href="#" class="logger" onclick="expandFunc('login')">Login</a></span>
<span ><a href="#" class="logger" onclick="expandFunc('register')">Register</a></span>//replaced a href with button, because it was adding # after register in the url
</div>
<div id="main">
<div id="register">
<form action="{{ path('sec_register') }}" method="post" name="sec_register">
<input type="text" name="userlogin[username]" placeholder="Username..." /><br/>
<input type="password" name="userlogin[password]" placeholder="Password..." /><br/>
<!--<input type="text" name="passwordRe" /><br/>-->
<input type="email" name="userlogin[email]" placeholder="Email..." /><br/>
<input type="hidden" name="_crsf_token">
<input type="submit" name="userlogin[registered]" class="btn btn-light btn-block" value="Sign up" /><br/>
</form>
</div>
<div id="login">
<form action="{{ path('sec_login') }}" method="post">
<input type="text" name="_username" placeholder="Username..." onfocus="value='Type username here.'" value="" /><br/>
<input type="password" name="_password" placeholder="Password..." /><br/>
<input type="submit" name="logged" class="btn btn-light btn-block" value="Sign in" /><br/>
</form>
</div>
ha
</div>
{% endblock %}
{% block javascripts %}
<script rel="script" src="{{ asset('/js/indexJavascript.js') }}"></script>
{% endblock %}
Когда я отправляю форму, в базе данных нет данных, а когда я var_dump($user)
, я получаю NULL
в свойствах.Я не вхожу в if($form->isSubmitted() && $form->isValid())
вообще.Пожалуйста, помогите, я не нахожу никаких ошибок, и нет никаких ошибок или исключений.
РЕДАКТИРОВАТЬ: потому что вы просили security.yml.Вот оно:
# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
security:
encoders:
# Our user class and the algorithm we'll use to encode passwords
AppBundle\Entity\UserLogin: bcrypt
# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
database_users:
entity: { class: AppBundle:Userlogin, property: email }
in_memory:
memory: ~
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
#http_basic: ~
# https://symfony.com/doc/current/security/form_login_setup.html
#form_login: ~
form_login:
check_path: sec_login
login_path: sec_login
#access_control:
# - { path: ^\register, roles: IS_AUTHENTICATED_ANONIMOUSLY }
Но, честно говоря, проблема в форме регистрации.И я думаю, что это как-то связано с тем, что обе формы находятся на одной странице, как вы можете видеть, ребята.Форма не отправляется вообще, но я отправляю ее.Запустил проверку в операторе if, добавив if($form->isSubmitted() or 1)
, и он говорит, что я пытаюсь вставить нулевые значения в мои поля в базе данных, которые являются обязательными.Пожалуйста помоги.Некоторые из var_dump($form->getErrors());
(не удалось опубликовать все это, потому что даже pastebin говорит, что он слишком длинный и выдает ошибку по запросу):
https://pastebin.com/7YB9CicG