major refactoring and cleanup

This commit is contained in:
Kevin Papst
2016-10-23 00:12:32 +02:00
parent 5a85b1d37e
commit c492d30be3
70 changed files with 1304 additions and 4027 deletions

View File

@@ -1,280 +0,0 @@
<?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 AppBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question;
use Doctrine\Common\Persistence\ObjectManager;
use AppBundle\Entity\User;
/**
* A command console that creates users and stores them in the database.
* To use this command, open a terminal window, enter into your project
* directory and execute the following:
*
* $ php bin/console app:add-user
*
* To output detailed information, increase the command verbosity:
*
* $ php bin/console app:add-user -vv
*
* See http://symfony.com/doc/current/cookbook/console/console_command.html
*
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class AddUserCommand extends ContainerAwareCommand
{
const MAX_ATTEMPTS = 5;
/**
* @var ObjectManager
*/
private $entityManager;
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
// a good practice is to use the 'app:' prefix to group all your custom application commands
->setName('app:add-user')
->setDescription('Creates users and stores them in the database')
->setHelp($this->getCommandHelp())
// commands can optionally define arguments and/or options (mandatory and optional)
// see http://symfony.com/doc/current/components/console/console_arguments.html
->addArgument('username', InputArgument::OPTIONAL, 'The username of the new user')
->addArgument('password', InputArgument::OPTIONAL, 'The plain password of the new user')
->addArgument('email', InputArgument::OPTIONAL, 'The email of the new user')
->addOption('is-admin', null, InputOption::VALUE_NONE, 'If set, the user is created as an administrator')
;
}
/**
* This method is executed before the interact() and the execute() methods.
* It's main purpose is to initialize the variables used in the rest of the
* command methods.
*
* Beware that the input options and arguments are validated after executing
* the interact() method, so you can't blindly trust their values in this method.
*/
protected function initialize(InputInterface $input, OutputInterface $output)
{
$this->entityManager = $this->getContainer()->get('doctrine')->getManager();
}
/**
* This method is executed after initialize() and before execute(). Its purpose
* is to check if some of the options/arguments are missing and interactively
* ask the user for those values.
*
* This method is completely optional. If you are developing an internal console
* command, you probably should not implement this method because it requires
* quite a lot of work. However, if the command is meant to be used by external
* users, this method is a nice way to fall back and prevent errors.
*/
protected function interact(InputInterface $input, OutputInterface $output)
{
if (null !== $input->getArgument('username') && null !== $input->getArgument('password') && null !== $input->getArgument('email')) {
return;
}
// multi-line messages can be displayed this way...
$output->writeln('');
$output->writeln('Add User Command Interactive Wizard');
$output->writeln('-----------------------------------');
// ...but you can also pass an array of strings to the writeln() method
$output->writeln([
'',
'If you prefer to not use this interactive wizard, provide the',
'arguments required by this command as follows:',
'',
' $ php bin/console app:add-user username password email@example.com',
'',
]);
$output->writeln([
'',
'Now we\'ll ask you for the value of all the missing command arguments.',
'',
]);
// See http://symfony.com/doc/current/components/console/helpers/questionhelper.html
$console = $this->getHelper('question');
// Ask for the username if it's not defined
$username = $input->getArgument('username');
if (null === $username) {
$question = new Question(' > <info>Username</info>: ');
$question->setValidator(function ($answer) {
if (empty($answer)) {
throw new \RuntimeException('The username cannot be empty');
}
return $answer;
});
$question->setMaxAttempts(self::MAX_ATTEMPTS);
$username = $console->ask($input, $output, $question);
$input->setArgument('username', $username);
} else {
$output->writeln(' > <info>Username</info>: '.$username);
}
// Ask for the password if it's not defined
$password = $input->getArgument('password');
if (null === $password) {
$question = new Question(' > <info>Password</info> (your type will be hidden): ');
$question->setValidator([$this, 'passwordValidator']);
$question->setHidden(true);
$question->setMaxAttempts(self::MAX_ATTEMPTS);
$password = $console->ask($input, $output, $question);
$input->setArgument('password', $password);
} else {
$output->writeln(' > <info>Password</info>: '.str_repeat('*', strlen($password)));
}
// Ask for the email if it's not defined
$email = $input->getArgument('email');
if (null === $email) {
$question = new Question(' > <info>Email</info>: ');
$question->setValidator([$this, 'emailValidator']);
$question->setMaxAttempts(self::MAX_ATTEMPTS);
$email = $console->ask($input, $output, $question);
$input->setArgument('email', $email);
} else {
$output->writeln(' > <info>Email</info>: '.$email);
}
}
/**
* This method is executed after interact() and initialize(). It usually
* contains the logic to execute to complete this command task.
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$startTime = microtime(true);
$username = $input->getArgument('username');
$plainPassword = $input->getArgument('password');
$email = $input->getArgument('email');
$isAdmin = $input->getOption('is-admin');
// first check if a user with the same username already exists
$existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $username]);
if (null !== $existingUser) {
throw new \RuntimeException(sprintf('There is already a user registered with the "%s" username.', $username));
}
// create the user and encode its password
$user = new User();
$user->setUsername($username);
$user->setEmail($email);
$user->setRoles([$isAdmin ? 'ROLE_ADMIN' : 'ROLE_USER']);
// See http://symfony.com/doc/current/book/security.html#security-encoding-password
$encoder = $this->getContainer()->get('security.password_encoder');
$encodedPassword = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encodedPassword);
$this->entityManager->persist($user);
$this->entityManager->flush();
$output->writeln('');
$output->writeln(sprintf('[OK] %s was successfully created: %s (%s)', $isAdmin ? 'Administrator user' : 'User', $user->getUsername(), $user->getEmail()));
if ($output->isVerbose()) {
$finishTime = microtime(true);
$elapsedTime = $finishTime - $startTime;
$output->writeln(sprintf('[INFO] New user database id: %d / Elapsed time: %.2f ms', $user->getId(), $elapsedTime*1000));
}
}
/**
* This internal method should be private, but it's declared as public to
* maintain PHP 5.3 compatibility when using it in a callback.
*
* @internal
*/
public function passwordValidator($plainPassword)
{
if (empty($plainPassword)) {
throw new \Exception('The password can not be empty');
}
if (strlen(trim($plainPassword)) < 6) {
throw new \Exception('The password must be at least 6 characters long');
}
return $plainPassword;
}
/**
* This internal method should be private, but it's declared as public to
* maintain PHP 5.3 compatibility when using it in a callback.
*
* @internal
*/
public function emailValidator($email)
{
if (empty($email)) {
throw new \Exception('The email can not be empty');
}
if (false === strpos($email, '@')) {
throw new \Exception('The email should look like a real email');
}
return $email;
}
/**
* The command help is usually included in the configure() method, but when
* it's too long, it's better to define a separate method to maintain the
* code readability.
*/
private function getCommandHelp()
{
return <<<HELP
The <info>%command.name%</info> command creates new users and saves them in the database:
<info>php %command.full_name%</info> <comment>username password email</comment>
By default the command creates regular users. To create administrator users,
add the <comment>--is-admin</comment> option:
<info>php %command.full_name%</info> username password email <comment>--is-admin</comment>
If you omit any of the three required arguments, the command will ask you to
provide the missing values:
# command will ask you for the email
<info>php %command.full_name%</info> <comment>username password</comment>
# command will ask you for the email and password
<info>php %command.full_name%</info> <comment>username</comment>
# command will ask you for all arguments
<info>php %command.full_name%</info>
HELP;
}
}

View File

@@ -1,149 +0,0 @@
<?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 AppBundle\Command;
use AppBundle\Entity\User;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question;
use Doctrine\Common\Persistence\ObjectManager;
/**
* A command console that deletes users from the database.
* To use this command, open a terminal window, enter into your project
* directory and execute the following:
*
* $ php bin/console app:delete-user
*
* Check out the code of the src/AppBundle/Command/AddUserCommand.php file for
* the full explanation about Symfony commands.
* See http://symfony.com/doc/current/cookbook/console/console_command.html
*
* @author Oleg Voronkovich <oleg-voronkovich@yandex.ru>
*/
class DeleteUserCommand extends ContainerAwareCommand
{
const MAX_ATTEMPTS = 5;
/**
* @var ObjectManager
*/
private $entityManager;
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
->setName('app:delete-user')
->setDescription('Deletes users from the database')
->addArgument('username', InputArgument::REQUIRED, 'The username of an existing user')
->setHelp(<<<HELP
The <info>%command.name%</info> command deletes users from the database:
<info>php %command.full_name%</info> <comment>username</comment>
If you omit the argument, the command will ask you to
provide the missing value:
<info>php %command.full_name%</info>
HELP
);
}
protected function initialize(InputInterface $input, OutputInterface $output)
{
$this->entityManager = $this->getContainer()->get('doctrine')->getManager();
}
protected function interact(InputInterface $input, OutputInterface $output)
{
if (null !== $input->getArgument('username')) {
return;
}
$output->writeln('');
$output->writeln('Delete User Command Interactive Wizard');
$output->writeln('-----------------------------------');
$output->writeln([
'',
'If you prefer to not use this interactive wizard, provide the',
'arguments required by this command as follows:',
'',
' $ php bin/console app:delete-user username',
'',
]);
$output->writeln([
'',
'Now we\'ll ask you for the value of all the missing command arguments.',
'',
]);
$helper = $this->getHelper('question');
$question = new Question(' > <info>Username</info>: ');
$question->setValidator([$this, 'usernameValidator']);
$question->setMaxAttempts(self::MAX_ATTEMPTS);
$username = $helper->ask($input, $output, $question);
$input->setArgument('username', $username);
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$username = $input->getArgument('username');
$this->usernameValidator($username);
$repository = $this->entityManager->getRepository(User::class);
/** @var User $user */
$user = $repository->findOneByUsername($username);
if (null === $user) {
throw new \RuntimeException(sprintf('User with username "%s" not found.', $username));
}
// After an entity has been removed its in-memory state is the same
// as before the removal, except for generated identifiers.
// See http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#removing-entities
$userId = $user->getId();
$this->entityManager->remove($user);
$this->entityManager->flush();
$output->writeln('');
$output->writeln(sprintf('[OK] User "%s" (ID: %d, email: %s) was successfully deleted.', $user->getUsername(), $userId, $user->getEmail()));
}
/**
* This internal method should be private, but it's declared public to
* maintain PHP 5.3 compatibility when using it in a callback.
*
* @internal
*/
public function usernameValidator($username)
{
if (empty($username)) {
throw new \Exception('The username can not be empty.');
}
if (1 !== preg_match('/^[a-z_]+$/', $username)) {
throw new \Exception('The username must contain only lowercase latin characters and underscores.');
}
return $username;
}
}

View File

@@ -1,143 +0,0 @@
<?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 AppBundle\Command;
use AppBundle\Entity\User;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\BufferedOutput;
/**
* A command console that lists all the existing users. To use this command, open
* a terminal window, enter into your project directory and execute the following:
*
* $ php bin/console app:list-users
*
* See http://symfony.com/doc/current/cookbook/console/console_command.html
*
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class ListUsersCommand extends ContainerAwareCommand
{
/**
* @var ObjectManager
*/
private $entityManager;
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
// a good practice is to use the 'app:' prefix to group all your custom application commands
->setName('app:list-users')
->setDescription('Lists all the existing users')
->setHelp(<<<HELP
The <info>%command.name%</info> command lists all the users registered in the application:
<info>php %command.full_name%</info>
By default the command only displays the 50 most recent users. Set the number of
results to display with the <comment>--max-results</comment> option:
<info>php %command.full_name%</info> <comment>--max-results=2000</comment>
In addition to displaying the user list, you can also send this information to
the email address specified in the <comment>--send-to</comment> option:
<info>php %command.full_name%</info> <comment>--send-to=fabien@symfony.com</comment>
HELP
)
// commands can optionally define arguments and/or options (mandatory and optional)
// see http://symfony.com/doc/current/components/console/console_arguments.html
->addOption('max-results', null, InputOption::VALUE_OPTIONAL, 'Limits the number of users listed', 50)
->addOption('send-to', null, InputOption::VALUE_OPTIONAL, 'If set, the result is sent to the given email address')
;
}
/**
* This method is executed before the the execute() method. It's main purpose
* is to initialize the variables used in the rest of the command methods.
*/
protected function initialize(InputInterface $input, OutputInterface $output)
{
$this->entityManager = $this->getContainer()->get('doctrine')->getManager();
}
/**
* This method is executed after initialize(). It usually contains the logic
* to execute to complete this command task.
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$maxResults = $input->getOption('max-results');
// Use ->findBy() instead of ->findAll() to allow result sorting and limiting
$users = $this->entityManager->getRepository(User::class)->findBy([], ['id' => 'DESC'], $maxResults);
// Doctrine query returns an array of objects and we need an array of plain arrays
$usersAsPlainArrays = array_map(function (User $user) {
return [$user->getId(), $user->getUsername(), $user->getEmail(), implode(', ', $user->getRoles())];
}, $users);
// In your console commands you should always use the regular output type,
// which outputs contents directly in the console window. However, this
// particular command uses the BufferedOutput type instead.
// The reason is that the table displaying the list of users can be sent
// via email if the '--send-to' option is provided. Instead of complicating
// things, the BufferedOutput allows to get the command output and store
// it in a variable before displaying it.
$bufferedOutput = new BufferedOutput();
$table = new Table($bufferedOutput);
$table
->setHeaders(['ID', 'Username', 'Email', 'Roles'])
->setRows($usersAsPlainArrays)
;
$table->render();
// instead of displaying the table of users, store it in a variable
$tableContents = $bufferedOutput->fetch();
if (null !== $email = $input->getOption('send-to')) {
$this->sendReport($tableContents, $email);
}
$output->writeln($tableContents);
}
/**
* Sends the given $contents to the $recipient email address.
*
* @param string $contents
* @param string $recipient
*/
private function sendReport($contents, $recipient)
{
// See http://symfony.com/doc/current/cookbook/email/email.html
$mailer = $this->getContainer()->get('mailer');
$message = $mailer->createMessage()
->setSubject(sprintf('app:list-users report (%s)', date('Y-m-d H:i:s')))
->setFrom($this->getContainer()->getParameter('app.notifications.email_sender'))
->setTo($recipient)
->setBody($contents, 'text/plain')
;
$mailer->send($message);
}
}

View File

@@ -1,222 +0,0 @@
<?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 AppBundle\Controller\Admin;
use AppBundle\Entity\Post;
use AppBundle\Form\PostType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
/**
* FIXME CAN BE REMOVED
*
* Controller used to manage blog contents in the backend.
*
* Please note that the application backend is developed manually for learning
* purposes. However, in your real Symfony application you should use any of the
* existing bundles that let you generate ready-to-use backends without effort.
* See http://knpbundles.com/keyword/admin
*
* @Route("/admin/post")
* @Security("has_role('ROLE_ADMIN')")
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class BlogController extends Controller
{
/**
* Lists all Post entities.
*
* This controller responds to two different routes with the same URL:
* * 'admin_post_index' is the route with a name that follows the same
* structure as the rest of the controllers of this class.
* * 'admin_index' is a nice shortcut to the backend homepage. This allows
* to create simpler links in the templates. Moreover, in the future we
* could move this annotation to any other controller while maintaining
* the route name and therefore, without breaking any existing link.
*
* @Route("/", name="admin_index")
* @Route("/", name="admin_post_index")
* @Method("GET")
*/
public function indexAction()
{
$entityManager = $this->getDoctrine()->getManager();
$posts = $entityManager->getRepository(Post::class)->findAll();
return $this->render('admin/blog/index.html.twig', ['posts' => $posts]);
}
/**
* Creates a new Post entity.
*
* @Route("/new", name="admin_post_new")
* @Method({"GET", "POST"})
*
* NOTE: the Method annotation is optional, but it's a recommended practice
* to constraint the HTTP methods each controller responds to (by default
* it responds to all methods).
*/
public function newAction(Request $request)
{
$post = new Post();
$post->setAuthorEmail($this->getUser()->getEmail());
// See http://symfony.com/doc/current/book/forms.html#submitting-forms-with-multiple-buttons
$form = $this->createForm(PostType::class, $post)
->add('saveAndCreateNew', SubmitType::class);
$form->handleRequest($request);
// the isSubmitted() method is completely optional because the other
// isValid() method already checks whether the form is submitted.
// However, we explicitly add it to improve code readability.
// See http://symfony.com/doc/current/best_practices/forms.html#handling-form-submits
if ($form->isSubmitted() && $form->isValid()) {
$post->setSlug($this->get('slugger')->slugify($post->getTitle()));
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($post);
$entityManager->flush();
// Flash messages are used to notify the user about the result of the
// actions. They are deleted automatically from the session as soon
// as they are accessed.
// See http://symfony.com/doc/current/book/controller.html#flash-messages
$this->addFlash('success', 'post.created_successfully');
if ($form->get('saveAndCreateNew')->isClicked()) {
return $this->redirectToRoute('admin_post_new');
}
return $this->redirectToRoute('admin_post_index');
}
return $this->render('admin/blog/new.html.twig', [
'post' => $post,
'form' => $form->createView(),
]);
}
/**
* Finds and displays a Post entity.
*
* @Route("/{id}", requirements={"id": "\d+"}, name="admin_post_show")
* @Method("GET")
*/
public function showAction(Post $post)
{
// This security check can also be performed:
// 1. Using an annotation: @Security("post.isAuthor(user)")
// 2. Using a "voter" (see http://symfony.com/doc/current/cookbook/security/voters_data_permission.html)
if (null === $this->getUser() || !$post->isAuthor($this->getUser())) {
throw $this->createAccessDeniedException('Posts can only be shown to their authors.');
}
$deleteForm = $this->createDeleteForm($post);
return $this->render('admin/blog/show.html.twig', [
'post' => $post,
'delete_form' => $deleteForm->createView(),
]);
}
/**
* Displays a form to edit an existing Post entity.
*
* @Route("/{id}/edit", requirements={"id": "\d+"}, name="admin_post_edit")
* @Method({"GET", "POST"})
*/
public function editAction(Post $post, Request $request)
{
if (null === $this->getUser() || !$post->isAuthor($this->getUser())) {
throw $this->createAccessDeniedException('Posts can only be edited by their authors.');
}
$entityManager = $this->getDoctrine()->getManager();
$editForm = $this->createForm(PostType::class, $post);
$deleteForm = $this->createDeleteForm($post);
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
$post->setSlug($this->get('slugger')->slugify($post->getTitle()));
$entityManager->flush();
$this->addFlash('success', 'post.updated_successfully');
return $this->redirectToRoute('admin_post_edit', ['id' => $post->getId()]);
}
return $this->render('admin/blog/edit.html.twig', [
'post' => $post,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
]);
}
/**
* Deletes a Post entity.
*
* @Route("/{id}", name="admin_post_delete")
* @Method("DELETE")
* @Security("post.isAuthor(user)")
*
* The Security annotation value is an expression (if it evaluates to false,
* the authorization mechanism will prevent the user accessing this resource).
* The isAuthor() method is defined in the AppBundle\Entity\Post entity.
*/
public function deleteAction(Request $request, Post $post)
{
$form = $this->createDeleteForm($post);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($post);
$entityManager->flush();
$this->addFlash('success', 'post.deleted_successfully');
}
return $this->redirectToRoute('admin_post_index');
}
/**
* Creates a form to delete a Post entity by id.
*
* This is necessary because browsers don't support HTTP methods different
* from GET and POST. Since the controller that removes the blog posts expects
* a DELETE method, the trick is to create a simple form that *fakes* the
* HTTP DELETE method.
* See http://symfony.com/doc/current/cookbook/routing/method_parameters.html.
*
* @param Post $post The post object
*
* @return \Symfony\Component\Form\Form The form
*/
private function createDeleteForm(Post $post)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('admin_post_delete', ['id' => $post->getId()]))
->setMethod('DELETE')
->getForm()
;
}
}

View File

@@ -1,132 +0,0 @@
<?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 AppBundle\Controller;
use AppBundle\Entity\Comment;
use AppBundle\Entity\Post;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Form\CommentType;
/**
* FIXME CAN BE REMOVED
*
* Controller used to manage blog contents in the public part of the site.
*
* @Route("/blog")
* @Security("has_role('ROLE_USER')")
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class BlogController extends Controller
{
/**
* @Route("/", defaults={"page": 1}, name="blog_index")
* @Route("/page/{page}", requirements={"page": "[1-9]\d*"}, name="blog_index_paginated")
* @Method("GET")
* @Cache(smaxage="10")
*/
public function indexAction($page)
{
$posts = $this->getDoctrine()->getRepository(Post::class)->findLatest($page);
return $this->render('blog/index.html.twig', ['posts' => $posts]);
}
/**
* @Route("/posts/{slug}", name="blog_post")
* @Method("GET")
*
* NOTE: The $post controller argument is automatically injected by Symfony
* after performing a database query looking for a Post with the 'slug'
* value given in the route.
* See http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
*/
public function postShowAction(Post $post)
{
// Symfony provides a function called 'dump()' which is an improved version
// of the 'var_dump()' function. It's useful to quickly debug the contents
// of any variable, but it's not available in the 'prod' environment to
// prevent any leak of sensitive information.
// This function can be used both in PHP files and Twig templates. The only
// requirement is to have enabled the DebugBundle.
if ('dev' === $this->getParameter('kernel.environment')) {
dump($post, $this->get('security.token_storage')->getToken()->getUser(), new \DateTime());
}
return $this->render('blog/post_show.html.twig', ['post' => $post]);
}
/**
* @Route("/comment/{postSlug}/new", name="comment_new")
* @Method("POST")
* @Security("is_granted('IS_AUTHENTICATED_FULLY')")
* @ParamConverter("post", options={"mapping": {"postSlug": "slug"}})
*
* NOTE: The ParamConverter mapping is required because the route parameter
* (postSlug) doesn't match any of the Doctrine entity properties (slug).
* See http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html#doctrine-converter
*/
public function commentNewAction(Request $request, Post $post)
{
$form = $this->createForm(CommentType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var Comment $comment */
$comment = $form->getData();
$comment->setAuthorEmail($this->getUser()->getEmail());
$comment->setPost($post);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($comment);
$entityManager->flush();
return $this->redirectToRoute('blog_post', ['slug' => $post->getSlug()]);
}
return $this->render('blog/comment_form_error.html.twig', [
'post' => $post,
'form' => $form->createView(),
]);
}
/**
* This controller is called directly via the render() function in the
* blog/post_show.html.twig template. That's why it's not needed to define
* a route name for it.
*
* The "id" of the Post is passed in and then turned into a Post object
* automatically by the ParamConverter.
*
* @param Post $post
*
* @return Response
*/
public function commentFormAction(Post $post)
{
$form = $this->createForm(CommentType::class);
return $this->render('blog/_comment_form.html.twig', [
'post' => $post,
'form' => $form->createView(),
]);
}
}

View File

@@ -0,0 +1,39 @@
<?php
/*
* This file is part of the Kimai package.
*
* (c) Kevin Papst <kevin@kevinpapst.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace AppBundle\Controller;
use TimesheetBundle\Entity\Timesheet;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
/**
* Dashboard controller for the admin area.
*
* @Route("/dashboard")
* @Security("has_role('ROLE_USER')")
*
* @author Kevin Papst <kevin@kevinpapst.de>
*/
class DashboardController extends Controller
{
/**
* @Route("/", defaults={}, name="dashboard")
* @Method("GET")
*/
public function indexAction()
{
return $this->render('dashboard/index.html.twig', []);
}
}

View File

@@ -1,9 +1,9 @@
<?php
/*
* This file is part of the Symfony package.
* This file is part of the Kimai package.
*
* (c) Fabien Potencier <fabien@symfony.com>
* (c) Kevin Papst <kevin@kevinpapst.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
@@ -12,23 +12,15 @@
namespace AppBundle\DataFixtures\ORM;
use AppBundle\Entity\User;
use AppBundle\Entity\Post;
use AppBundle\Entity\Comment;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines the sample data to load in the database when running the unit and
* functional tests. Execute this command to load the data:
* Sample data to load in the database when running tests or for development
*
* $ php bin/console doctrine:fixtures:load
*
* See http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
* @author Kevin Papst <kevin@kevinpapst.de>
*/
class LoadFixtures implements FixtureInterface, ContainerAwareInterface
{
@@ -40,9 +32,8 @@ class LoadFixtures implements FixtureInterface, ContainerAwareInterface
*/
public function load(ObjectManager $manager)
{
// FIXME CAN BE REMOVED
$this->loadUsers($manager);
$this->loadPosts($manager);
//$this->loadPosts($manager);
}
private function loadUsers(ObjectManager $manager)
@@ -84,8 +75,19 @@ class LoadFixtures implements FixtureInterface, ContainerAwareInterface
$manager->flush();
}
/**
* FIXME CAN BE REMOVED
*
* @param ObjectManager $manager
*/
private function loadPosts(ObjectManager $manager)
{
$authors = [
'anna_admin@example.com',
'tony_teamlead@example.com',
'clara_customer@example.com',
'john_user@example.com'
];
foreach (range(1, 30) as $i) {
$post = new Post();
@@ -93,13 +95,13 @@ class LoadFixtures implements FixtureInterface, ContainerAwareInterface
$post->setSummary($this->getRandomPostSummary());
$post->setSlug($this->container->get('slugger')->slugify($post->getTitle()));
$post->setContent($this->getPostContent());
$post->setAuthorEmail(array_rand(['anna_admin@example.com', 'tony_teamlead@example.com'], 1));
$post->setAuthorEmail($authors[array_rand($authors, 1)]);
$post->setPublishedAt(new \DateTime('now - '.$i.'days'));
foreach (range(1, 5) as $j) {
$comment = new Comment();
$comment->setAuthorEmail(array_rand(['clara_customer@example.com', 'john_user@example.com'], 1));
$comment->setAuthorEmail($authors[array_rand($authors, 1)]);
$comment->setPublishedAt(new \DateTime('now + '.($i + $j).'seconds'));
$comment->setContent($this->getRandomCommentContent());
$comment->setPost($post);

View File

@@ -1,126 +0,0 @@
<?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 AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* FIXME CAN BE REMOVED
*
* @ORM\Entity
* @ORM\Table(name="demo_comment")
*
* Defines the properties of the Comment entity to represent the blog comments.
* See http://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 http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class Comment
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Post", inversedBy="comments")
* @ORM\JoinColumn(nullable=false)
*/
private $post;
/**
* @ORM\Column(type="text")
* @Assert\NotBlank(message="comment.blank")
* @Assert\Length(
* min = "5",
* minMessage = "comment.too_short",
* max = "10000",
* maxMessage = "comment.too_long"
* )
*/
private $content;
/**
* @ORM\Column(type="string")
* @Assert\Email()
*/
private $authorEmail;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $publishedAt;
public function __construct()
{
$this->publishedAt = new \DateTime();
}
/**
* @Assert\IsTrue(message = "comment.is_spam")
*/
public function isLegitComment()
{
$containsInvalidCharacters = false !== strpos($this->content, '@');
return !$containsInvalidCharacters;
}
public function getId()
{
return $this->id;
}
public function getContent()
{
return $this->content;
}
public function setContent($content)
{
$this->content = $content;
}
public function getAuthorEmail()
{
return $this->authorEmail;
}
public function setAuthorEmail($authorEmail)
{
$this->authorEmail = $authorEmail;
}
public function getPublishedAt()
{
return $this->publishedAt;
}
public function setPublishedAt(\DateTime $publishedAt)
{
$this->publishedAt = $publishedAt;
}
public function getPost()
{
return $this->post;
}
public function setPost(Post $post)
{
$this->post = $post;
}
}

View File

@@ -5,19 +5,13 @@ namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiConfiguration
* Configuration
*
* @ORM\Table(name="configuration")
* @ORM\Entity
*/
class KimaiConfiguration
class Configuration
{
/**
* @var string
*
* @ORM\Column(name="value", type="string", length=255, nullable=false)
*/
private $value;
/**
* @var string
@@ -28,14 +22,19 @@ class KimaiConfiguration
*/
private $option;
/**
* @var string
*
* @ORM\Column(name="value", type="string", length=255, nullable=false)
*/
private $value;
/**
* Set value
*
* @param string $value
*
* @return KimaiConfiguration
* @return Configuration
*/
public function setValue($value)
{

View File

@@ -1,190 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiActivities
*
* @ORM\Table(name="activities")
* @ORM\Entity
*/
class KimaiActivities
{
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="comment", type="text", length=65535, nullable=true)
*/
private $comment;
/**
* @var boolean
*
* @ORM\Column(name="visible", type="boolean", nullable=false)
*/
private $visible = '1';
/**
* @var boolean
*
* @ORM\Column(name="filter", type="boolean", nullable=false)
*/
private $filter = '0';
/**
* @var boolean
*
* @ORM\Column(name="trash", type="boolean", nullable=false)
*/
private $trash = '0';
/**
* @var integer
*
* @ORM\Column(name="activityID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $activityid;
/**
* Set name
*
* @param string $name
*
* @return KimaiActivities
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set comment
*
* @param string $comment
*
* @return KimaiActivities
*/
public function setComment($comment)
{
$this->comment = $comment;
return $this;
}
/**
* Get comment
*
* @return string
*/
public function getComment()
{
return $this->comment;
}
/**
* Set visible
*
* @param boolean $visible
*
* @return KimaiActivities
*/
public function setVisible($visible)
{
$this->visible = $visible;
return $this;
}
/**
* Get visible
*
* @return boolean
*/
public function getVisible()
{
return $this->visible;
}
/**
* Set filter
*
* @param boolean $filter
*
* @return KimaiActivities
*/
public function setFilter($filter)
{
$this->filter = $filter;
return $this;
}
/**
* Get filter
*
* @return boolean
*/
public function getFilter()
{
return $this->filter;
}
/**
* Set trash
*
* @param boolean $trash
*
* @return KimaiActivities
*/
public function setTrash($trash)
{
$this->trash = $trash;
return $this;
}
/**
* Get trash
*
* @return boolean
*/
public function getTrash()
{
return $this->trash;
}
/**
* Get activityid
*
* @return integer
*/
public function getActivityid()
{
return $this->activityid;
}
}

View File

@@ -1,686 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiCustomers
*
* @ORM\Table(name="customers")
* @ORM\Entity
*/
class KimaiCustomers
{
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=255, nullable=true)
*/
private $password;
/**
* @var string
*
* @ORM\Column(name="passwordResetHash", type="string", length=32, nullable=true)
*/
private $passwordresethash;
/**
* @var string
*
* @ORM\Column(name="secure", type="string", length=60, nullable=false)
*/
private $secure = '0';
/**
* @var string
*
* @ORM\Column(name="comment", type="text", length=65535, nullable=true)
*/
private $comment;
/**
* @var boolean
*
* @ORM\Column(name="visible", type="boolean", nullable=false)
*/
private $visible = '1';
/**
* @var boolean
*
* @ORM\Column(name="filter", type="boolean", nullable=false)
*/
private $filter = '0';
/**
* @var string
*
* @ORM\Column(name="company", type="string", length=255, nullable=true)
*/
private $company;
/**
* @var string
*
* @ORM\Column(name="vat", type="string", length=255, nullable=true)
*/
private $vat;
/**
* @var string
*
* @ORM\Column(name="contact", type="string", length=255, nullable=true)
*/
private $contact;
/**
* @var string
*
* @ORM\Column(name="street", type="string", length=255, nullable=true)
*/
private $street;
/**
* @var string
*
* @ORM\Column(name="zipcode", type="string", length=255, nullable=true)
*/
private $zipcode;
/**
* @var string
*
* @ORM\Column(name="city", type="string", length=255, nullable=true)
*/
private $city;
/**
* @var string
*
* @ORM\Column(name="country", type="string", length=2, nullable=true)
*/
private $country;
/**
* @var string
*
* @ORM\Column(name="phone", type="string", length=255, nullable=true)
*/
private $phone;
/**
* @var string
*
* @ORM\Column(name="fax", type="string", length=255, nullable=true)
*/
private $fax;
/**
* @var string
*
* @ORM\Column(name="mobile", type="string", length=255, nullable=true)
*/
private $mobile;
/**
* @var string
*
* @ORM\Column(name="mail", type="string", length=255, nullable=true)
*/
private $mail;
/**
* @var string
*
* @ORM\Column(name="homepage", type="string", length=255, nullable=true)
*/
private $homepage;
/**
* @var string
*
* @ORM\Column(name="timezone", type="string", length=255, nullable=false)
*/
private $timezone;
/**
* @var boolean
*
* @ORM\Column(name="trash", type="boolean", nullable=false)
*/
private $trash = '0';
/**
* @var integer
*
* @ORM\Column(name="customerID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $customerid;
/**
* Set name
*
* @param string $name
*
* @return KimaiCustomers
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set password
*
* @param string $password
*
* @return KimaiCustomers
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Set passwordresethash
*
* @param string $passwordresethash
*
* @return KimaiCustomers
*/
public function setPasswordresethash($passwordresethash)
{
$this->passwordresethash = $passwordresethash;
return $this;
}
/**
* Get passwordresethash
*
* @return string
*/
public function getPasswordresethash()
{
return $this->passwordresethash;
}
/**
* Set secure
*
* @param string $secure
*
* @return KimaiCustomers
*/
public function setSecure($secure)
{
$this->secure = $secure;
return $this;
}
/**
* Get secure
*
* @return string
*/
public function getSecure()
{
return $this->secure;
}
/**
* Set comment
*
* @param string $comment
*
* @return KimaiCustomers
*/
public function setComment($comment)
{
$this->comment = $comment;
return $this;
}
/**
* Get comment
*
* @return string
*/
public function getComment()
{
return $this->comment;
}
/**
* Set visible
*
* @param boolean $visible
*
* @return KimaiCustomers
*/
public function setVisible($visible)
{
$this->visible = $visible;
return $this;
}
/**
* Get visible
*
* @return boolean
*/
public function getVisible()
{
return $this->visible;
}
/**
* Set filter
*
* @param boolean $filter
*
* @return KimaiCustomers
*/
public function setFilter($filter)
{
$this->filter = $filter;
return $this;
}
/**
* Get filter
*
* @return boolean
*/
public function getFilter()
{
return $this->filter;
}
/**
* Set company
*
* @param string $company
*
* @return KimaiCustomers
*/
public function setCompany($company)
{
$this->company = $company;
return $this;
}
/**
* Get company
*
* @return string
*/
public function getCompany()
{
return $this->company;
}
/**
* Set vat
*
* @param string $vat
*
* @return KimaiCustomers
*/
public function setVat($vat)
{
$this->vat = $vat;
return $this;
}
/**
* Get vat
*
* @return string
*/
public function getVat()
{
return $this->vat;
}
/**
* Set contact
*
* @param string $contact
*
* @return KimaiCustomers
*/
public function setContact($contact)
{
$this->contact = $contact;
return $this;
}
/**
* Get contact
*
* @return string
*/
public function getContact()
{
return $this->contact;
}
/**
* Set street
*
* @param string $street
*
* @return KimaiCustomers
*/
public function setStreet($street)
{
$this->street = $street;
return $this;
}
/**
* Get street
*
* @return string
*/
public function getStreet()
{
return $this->street;
}
/**
* Set zipcode
*
* @param string $zipcode
*
* @return KimaiCustomers
*/
public function setZipcode($zipcode)
{
$this->zipcode = $zipcode;
return $this;
}
/**
* Get zipcode
*
* @return string
*/
public function getZipcode()
{
return $this->zipcode;
}
/**
* Set city
*
* @param string $city
*
* @return KimaiCustomers
*/
public function setCity($city)
{
$this->city = $city;
return $this;
}
/**
* Get city
*
* @return string
*/
public function getCity()
{
return $this->city;
}
/**
* Set country
*
* @param string $country
*
* @return KimaiCustomers
*/
public function setCountry($country)
{
$this->country = $country;
return $this;
}
/**
* Get country
*
* @return string
*/
public function getCountry()
{
return $this->country;
}
/**
* Set phone
*
* @param string $phone
*
* @return KimaiCustomers
*/
public function setPhone($phone)
{
$this->phone = $phone;
return $this;
}
/**
* Get phone
*
* @return string
*/
public function getPhone()
{
return $this->phone;
}
/**
* Set fax
*
* @param string $fax
*
* @return KimaiCustomers
*/
public function setFax($fax)
{
$this->fax = $fax;
return $this;
}
/**
* Get fax
*
* @return string
*/
public function getFax()
{
return $this->fax;
}
/**
* Set mobile
*
* @param string $mobile
*
* @return KimaiCustomers
*/
public function setMobile($mobile)
{
$this->mobile = $mobile;
return $this;
}
/**
* Get mobile
*
* @return string
*/
public function getMobile()
{
return $this->mobile;
}
/**
* Set mail
*
* @param string $mail
*
* @return KimaiCustomers
*/
public function setMail($mail)
{
$this->mail = $mail;
return $this;
}
/**
* Get mail
*
* @return string
*/
public function getMail()
{
return $this->mail;
}
/**
* Set homepage
*
* @param string $homepage
*
* @return KimaiCustomers
*/
public function setHomepage($homepage)
{
$this->homepage = $homepage;
return $this;
}
/**
* Get homepage
*
* @return string
*/
public function getHomepage()
{
return $this->homepage;
}
/**
* Set timezone
*
* @param string $timezone
*
* @return KimaiCustomers
*/
public function setTimezone($timezone)
{
$this->timezone = $timezone;
return $this;
}
/**
* Get timezone
*
* @return string
*/
public function getTimezone()
{
return $this->timezone;
}
/**
* Set trash
*
* @param boolean $trash
*
* @return KimaiCustomers
*/
public function setTrash($trash)
{
$this->trash = $trash;
return $this;
}
/**
* Get trash
*
* @return boolean
*/
public function getTrash()
{
return $this->trash;
}
/**
* Get customerid
*
* @return integer
*/
public function getCustomerid()
{
return $this->customerid;
}
}

View File

@@ -1,345 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiExpenses
*
* @ORM\Table(name="expenses", indexes={@ORM\Index(name="userID", columns={"userID"}), @ORM\Index(name="projectID", columns={"projectID"})})
* @ORM\Entity
*/
class KimaiExpenses
{
/**
* @var integer
*
* @ORM\Column(name="timestamp", type="integer", nullable=false)
*/
private $timestamp = '0';
/**
* @var integer
*
* @ORM\Column(name="userID", type="integer", nullable=false)
*/
private $userid;
/**
* @var integer
*
* @ORM\Column(name="projectID", type="integer", nullable=false)
*/
private $projectid;
/**
* @var string
*
* @ORM\Column(name="designation", type="text", length=65535, nullable=false)
*/
private $designation;
/**
* @var string
*
* @ORM\Column(name="comment", type="text", length=65535, nullable=true)
*/
private $comment;
/**
* @var boolean
*
* @ORM\Column(name="commentType", type="boolean", nullable=false)
*/
private $commenttype = '0';
/**
* @var boolean
*
* @ORM\Column(name="refundable", type="boolean", nullable=false)
*/
private $refundable = '0';
/**
* @var boolean
*
* @ORM\Column(name="cleared", type="boolean", nullable=false)
*/
private $cleared = '0';
/**
* @var string
*
* @ORM\Column(name="multiplier", type="decimal", precision=10, scale=2, nullable=false)
*/
private $multiplier = '1.00';
/**
* @var string
*
* @ORM\Column(name="value", type="decimal", precision=10, scale=2, nullable=false)
*/
private $value = '0.00';
/**
* @var integer
*
* @ORM\Column(name="expenseID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $expenseid;
/**
* Set timestamp
*
* @param integer $timestamp
*
* @return KimaiExpenses
*/
public function setTimestamp($timestamp)
{
$this->timestamp = $timestamp;
return $this;
}
/**
* Get timestamp
*
* @return integer
*/
public function getTimestamp()
{
return $this->timestamp;
}
/**
* Set userid
*
* @param integer $userid
*
* @return KimaiExpenses
*/
public function setUserid($userid)
{
$this->userid = $userid;
return $this;
}
/**
* Get userid
*
* @return integer
*/
public function getUserid()
{
return $this->userid;
}
/**
* Set projectid
*
* @param integer $projectid
*
* @return KimaiExpenses
*/
public function setProjectid($projectid)
{
$this->projectid = $projectid;
return $this;
}
/**
* Get projectid
*
* @return integer
*/
public function getProjectid()
{
return $this->projectid;
}
/**
* Set designation
*
* @param string $designation
*
* @return KimaiExpenses
*/
public function setDesignation($designation)
{
$this->designation = $designation;
return $this;
}
/**
* Get designation
*
* @return string
*/
public function getDesignation()
{
return $this->designation;
}
/**
* Set comment
*
* @param string $comment
*
* @return KimaiExpenses
*/
public function setComment($comment)
{
$this->comment = $comment;
return $this;
}
/**
* Get comment
*
* @return string
*/
public function getComment()
{
return $this->comment;
}
/**
* Set commenttype
*
* @param boolean $commenttype
*
* @return KimaiExpenses
*/
public function setCommenttype($commenttype)
{
$this->commenttype = $commenttype;
return $this;
}
/**
* Get commenttype
*
* @return boolean
*/
public function getCommenttype()
{
return $this->commenttype;
}
/**
* Set refundable
*
* @param boolean $refundable
*
* @return KimaiExpenses
*/
public function setRefundable($refundable)
{
$this->refundable = $refundable;
return $this;
}
/**
* Get refundable
*
* @return boolean
*/
public function getRefundable()
{
return $this->refundable;
}
/**
* Set cleared
*
* @param boolean $cleared
*
* @return KimaiExpenses
*/
public function setCleared($cleared)
{
$this->cleared = $cleared;
return $this;
}
/**
* Get cleared
*
* @return boolean
*/
public function getCleared()
{
return $this->cleared;
}
/**
* Set multiplier
*
* @param string $multiplier
*
* @return KimaiExpenses
*/
public function setMultiplier($multiplier)
{
$this->multiplier = $multiplier;
return $this;
}
/**
* Get multiplier
*
* @return string
*/
public function getMultiplier()
{
return $this->multiplier;
}
/**
* Set value
*
* @param string $value
*
* @return KimaiExpenses
*/
public function setValue($value)
{
$this->value = $value;
return $this;
}
/**
* Get value
*
* @return string
*/
public function getValue()
{
return $this->value;
}
/**
* Get expenseid
*
* @return integer
*/
public function getExpenseid()
{
return $this->expenseid;
}
}

View File

@@ -1,113 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiFixedrates
*
* @ORM\Table(name="fixedRates")
* @ORM\Entity
*/
class KimaiFixedrates
{
/**
* @var string
*
* @ORM\Column(name="rate", type="decimal", precision=10, scale=2, nullable=false)
*/
private $rate;
/**
* @var integer
*
* @ORM\Column(name="projectID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $projectid;
/**
* @var integer
*
* @ORM\Column(name="activityID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $activityid;
/**
* Set rate
*
* @param string $rate
*
* @return KimaiFixedrates
*/
public function setRate($rate)
{
$this->rate = $rate;
return $this;
}
/**
* Get rate
*
* @return string
*/
public function getRate()
{
return $this->rate;
}
/**
* Set projectid
*
* @param integer $projectid
*
* @return KimaiFixedrates
*/
public function setProjectid($projectid)
{
$this->projectid = $projectid;
return $this;
}
/**
* Get projectid
*
* @return integer
*/
public function getProjectid()
{
return $this->projectid;
}
/**
* Set activityid
*
* @param integer $activityid
*
* @return KimaiFixedrates
*/
public function setActivityid($activityid)
{
$this->activityid = $activityid;
return $this;
}
/**
* Get activityid
*
* @return integer
*/
public function getActivityid()
{
return $this->activityid;
}
}

View File

@@ -1,345 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiProjects
*
* @ORM\Table(name="projects", indexes={@ORM\Index(name="customerID", columns={"customerID"})})
* @ORM\Entity
*/
class KimaiProjects
{
/**
* @var integer
*
* @ORM\Column(name="customerID", type="integer", nullable=false)
*/
private $customerid;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="comment", type="text", length=65535, nullable=true)
*/
private $comment;
/**
* @var boolean
*
* @ORM\Column(name="visible", type="boolean", nullable=false)
*/
private $visible = '1';
/**
* @var boolean
*
* @ORM\Column(name="filter", type="boolean", nullable=false)
*/
private $filter = '0';
/**
* @var boolean
*
* @ORM\Column(name="trash", type="boolean", nullable=false)
*/
private $trash = '0';
/**
* @var string
*
* @ORM\Column(name="budget", type="decimal", precision=10, scale=2, nullable=true)
*/
private $budget = '0.00';
/**
* @var string
*
* @ORM\Column(name="effort", type="decimal", precision=10, scale=2, nullable=true)
*/
private $effort;
/**
* @var string
*
* @ORM\Column(name="approved", type="decimal", precision=10, scale=2, nullable=true)
*/
private $approved;
/**
* @var boolean
*
* @ORM\Column(name="internal", type="boolean", nullable=false)
*/
private $internal = '0';
/**
* @var integer
*
* @ORM\Column(name="projectID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $projectid;
/**
* Set customerid
*
* @param integer $customerid
*
* @return KimaiProjects
*/
public function setCustomerid($customerid)
{
$this->customerid = $customerid;
return $this;
}
/**
* Get customerid
*
* @return integer
*/
public function getCustomerid()
{
return $this->customerid;
}
/**
* Set name
*
* @param string $name
*
* @return KimaiProjects
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set comment
*
* @param string $comment
*
* @return KimaiProjects
*/
public function setComment($comment)
{
$this->comment = $comment;
return $this;
}
/**
* Get comment
*
* @return string
*/
public function getComment()
{
return $this->comment;
}
/**
* Set visible
*
* @param boolean $visible
*
* @return KimaiProjects
*/
public function setVisible($visible)
{
$this->visible = $visible;
return $this;
}
/**
* Get visible
*
* @return boolean
*/
public function getVisible()
{
return $this->visible;
}
/**
* Set filter
*
* @param boolean $filter
*
* @return KimaiProjects
*/
public function setFilter($filter)
{
$this->filter = $filter;
return $this;
}
/**
* Get filter
*
* @return boolean
*/
public function getFilter()
{
return $this->filter;
}
/**
* Set trash
*
* @param boolean $trash
*
* @return KimaiProjects
*/
public function setTrash($trash)
{
$this->trash = $trash;
return $this;
}
/**
* Get trash
*
* @return boolean
*/
public function getTrash()
{
return $this->trash;
}
/**
* Set budget
*
* @param string $budget
*
* @return KimaiProjects
*/
public function setBudget($budget)
{
$this->budget = $budget;
return $this;
}
/**
* Get budget
*
* @return string
*/
public function getBudget()
{
return $this->budget;
}
/**
* Set effort
*
* @param string $effort
*
* @return KimaiProjects
*/
public function setEffort($effort)
{
$this->effort = $effort;
return $this;
}
/**
* Get effort
*
* @return string
*/
public function getEffort()
{
return $this->effort;
}
/**
* Set approved
*
* @param string $approved
*
* @return KimaiProjects
*/
public function setApproved($approved)
{
$this->approved = $approved;
return $this;
}
/**
* Get approved
*
* @return string
*/
public function getApproved()
{
return $this->approved;
}
/**
* Set internal
*
* @param boolean $internal
*
* @return KimaiProjects
*/
public function setInternal($internal)
{
$this->internal = $internal;
return $this;
}
/**
* Get internal
*
* @return boolean
*/
public function getInternal()
{
return $this->internal;
}
/**
* Get projectid
*
* @return integer
*/
public function getProjectid()
{
return $this->projectid;
}
}

View File

@@ -1,175 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiProjectsActivities
*
* @ORM\Table(name="projects_activities")
* @ORM\Entity
*/
class KimaiProjectsActivities
{
/**
* @var string
*
* @ORM\Column(name="budget", type="decimal", precision=10, scale=2, nullable=true)
*/
private $budget = '0.00';
/**
* @var string
*
* @ORM\Column(name="effort", type="decimal", precision=10, scale=2, nullable=true)
*/
private $effort;
/**
* @var string
*
* @ORM\Column(name="approved", type="decimal", precision=10, scale=2, nullable=true)
*/
private $approved;
/**
* @var integer
*
* @ORM\Column(name="projectID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $projectid;
/**
* @var integer
*
* @ORM\Column(name="activityID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $activityid;
/**
* Set budget
*
* @param string $budget
*
* @return KimaiProjectsActivities
*/
public function setBudget($budget)
{
$this->budget = $budget;
return $this;
}
/**
* Get budget
*
* @return string
*/
public function getBudget()
{
return $this->budget;
}
/**
* Set effort
*
* @param string $effort
*
* @return KimaiProjectsActivities
*/
public function setEffort($effort)
{
$this->effort = $effort;
return $this;
}
/**
* Get effort
*
* @return string
*/
public function getEffort()
{
return $this->effort;
}
/**
* Set approved
*
* @param string $approved
*
* @return KimaiProjectsActivities
*/
public function setApproved($approved)
{
$this->approved = $approved;
return $this;
}
/**
* Get approved
*
* @return string
*/
public function getApproved()
{
return $this->approved;
}
/**
* Set projectid
*
* @param integer $projectid
*
* @return KimaiProjectsActivities
*/
public function setProjectid($projectid)
{
$this->projectid = $projectid;
return $this;
}
/**
* Get projectid
*
* @return integer
*/
public function getProjectid()
{
return $this->projectid;
}
/**
* Set activityid
*
* @param integer $activityid
*
* @return KimaiProjectsActivities
*/
public function setActivityid($activityid)
{
$this->activityid = $activityid;
return $this;
}
/**
* Get activityid
*
* @return integer
*/
public function getActivityid()
{
return $this->activityid;
}
}

View File

@@ -1,146 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiRates
*
* @ORM\Table(name="rates")
* @ORM\Entity
*/
class KimaiRates
{
/**
* @var string
*
* @ORM\Column(name="rate", type="decimal", precision=10, scale=2, nullable=false)
*/
private $rate;
/**
* @var integer
*
* @ORM\Column(name="userID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $userid;
/**
* @var integer
*
* @ORM\Column(name="projectID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $projectid;
/**
* @var integer
*
* @ORM\Column(name="activityID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $activityid;
/**
* Set rate
*
* @param string $rate
*
* @return KimaiRates
*/
public function setRate($rate)
{
$this->rate = $rate;
return $this;
}
/**
* Get rate
*
* @return string
*/
public function getRate()
{
return $this->rate;
}
/**
* Set userid
*
* @param integer $userid
*
* @return KimaiRates
*/
public function setUserid($userid)
{
$this->userid = $userid;
return $this;
}
/**
* Get userid
*
* @return integer
*/
public function getUserid()
{
return $this->userid;
}
/**
* Set projectid
*
* @param integer $projectid
*
* @return KimaiRates
*/
public function setProjectid($projectid)
{
$this->projectid = $projectid;
return $this;
}
/**
* Get projectid
*
* @return integer
*/
public function getProjectid()
{
return $this->projectid;
}
/**
* Set activityid
*
* @param integer $activityid
*
* @return KimaiRates
*/
public function setActivityid($activityid)
{
$this->activityid = $activityid;
return $this;
}
/**
* Get activityid
*
* @return integer
*/
public function getActivityid()
{
return $this->activityid;
}
}

View File

@@ -1,66 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiStatuses
*
* @ORM\Table(name="statuses")
* @ORM\Entity
*/
class KimaiStatuses
{
/**
* @var string
*
* @ORM\Column(name="status", type="string", length=200, nullable=false)
*/
private $status;
/**
* @var boolean
*
* @ORM\Column(name="statusID", type="boolean")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $statusid;
/**
* Set status
*
* @param string $status
*
* @return KimaiStatuses
*/
public function setStatus($status)
{
$this->status = $status;
return $this;
}
/**
* Get status
*
* @return string
*/
public function getStatus()
{
return $this->status;
}
/**
* Get statusid
*
* @return boolean
*/
public function getStatusid()
{
return $this->statusid;
}
}

View File

@@ -1,562 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiUsers
*
* @ORM\Table(name="users", uniqueConstraints={@ORM\UniqueConstraint(name="name", columns={"name"}), @ORM\UniqueConstraint(name="apikey", columns={"apikey"})})
* @ORM\Entity
*/
class KimaiUsers
{
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=160, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="alias", type="string", length=160, nullable=true)
*/
private $alias;
/**
* @var boolean
*
* @ORM\Column(name="trash", type="boolean", nullable=false)
*/
private $trash = '0';
/**
* @var boolean
*
* @ORM\Column(name="active", type="boolean", nullable=false)
*/
private $active = '1';
/**
* @var string
*
* @ORM\Column(name="mail", type="string", length=160, nullable=false)
*/
private $mail = '';
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=254, nullable=true)
*/
private $password;
/**
* @var string
*
* @ORM\Column(name="passwordResetHash", type="string", length=32, nullable=true)
*/
private $passwordresethash;
/**
* @var integer
*
* @ORM\Column(name="ban", type="integer", nullable=false)
*/
private $ban = '0';
/**
* @var integer
*
* @ORM\Column(name="banTime", type="integer", nullable=false)
*/
private $bantime = '0';
/**
* @var string
*
* @ORM\Column(name="secure", type="string", length=60, nullable=false)
*/
private $secure = '0';
/**
* @var integer
*
* @ORM\Column(name="lastProject", type="integer", nullable=false)
*/
private $lastproject = '1';
/**
* @var integer
*
* @ORM\Column(name="lastActivity", type="integer", nullable=false)
*/
private $lastactivity = '1';
/**
* @var integer
*
* @ORM\Column(name="lastRecord", type="integer", nullable=false)
*/
private $lastrecord = '0';
/**
* @var string
*
* @ORM\Column(name="timeframeBegin", type="string", length=60, nullable=false)
*/
private $timeframebegin = '0';
/**
* @var string
*
* @ORM\Column(name="timeframeEnd", type="string", length=60, nullable=false)
*/
private $timeframeend = '0';
/**
* @var string
*
* @ORM\Column(name="apikey", type="string", length=30, nullable=true)
*/
private $apikey;
/**
* @var integer
*
* @ORM\Column(name="globalRoleID", type="integer", nullable=false)
*/
private $globalroleid;
/**
* @var integer
*
* @ORM\Column(name="userID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $userid;
/**
* Set name
*
* @param string $name
*
* @return KimaiUsers
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set alias
*
* @param string $alias
*
* @return KimaiUsers
*/
public function setAlias($alias)
{
$this->alias = $alias;
return $this;
}
/**
* Get alias
*
* @return string
*/
public function getAlias()
{
return $this->alias;
}
/**
* Set trash
*
* @param boolean $trash
*
* @return KimaiUsers
*/
public function setTrash($trash)
{
$this->trash = $trash;
return $this;
}
/**
* Get trash
*
* @return boolean
*/
public function getTrash()
{
return $this->trash;
}
/**
* Set active
*
* @param boolean $active
*
* @return KimaiUsers
*/
public function setActive($active)
{
$this->active = $active;
return $this;
}
/**
* Get active
*
* @return boolean
*/
public function getActive()
{
return $this->active;
}
/**
* Set mail
*
* @param string $mail
*
* @return KimaiUsers
*/
public function setMail($mail)
{
$this->mail = $mail;
return $this;
}
/**
* Get mail
*
* @return string
*/
public function getMail()
{
return $this->mail;
}
/**
* Set password
*
* @param string $password
*
* @return KimaiUsers
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Set passwordresethash
*
* @param string $passwordresethash
*
* @return KimaiUsers
*/
public function setPasswordresethash($passwordresethash)
{
$this->passwordresethash = $passwordresethash;
return $this;
}
/**
* Get passwordresethash
*
* @return string
*/
public function getPasswordresethash()
{
return $this->passwordresethash;
}
/**
* Set ban
*
* @param integer $ban
*
* @return KimaiUsers
*/
public function setBan($ban)
{
$this->ban = $ban;
return $this;
}
/**
* Get ban
*
* @return integer
*/
public function getBan()
{
return $this->ban;
}
/**
* Set bantime
*
* @param integer $bantime
*
* @return KimaiUsers
*/
public function setBantime($bantime)
{
$this->bantime = $bantime;
return $this;
}
/**
* Get bantime
*
* @return integer
*/
public function getBantime()
{
return $this->bantime;
}
/**
* Set secure
*
* @param string $secure
*
* @return KimaiUsers
*/
public function setSecure($secure)
{
$this->secure = $secure;
return $this;
}
/**
* Get secure
*
* @return string
*/
public function getSecure()
{
return $this->secure;
}
/**
* Set lastproject
*
* @param integer $lastproject
*
* @return KimaiUsers
*/
public function setLastproject($lastproject)
{
$this->lastproject = $lastproject;
return $this;
}
/**
* Get lastproject
*
* @return integer
*/
public function getLastproject()
{
return $this->lastproject;
}
/**
* Set lastactivity
*
* @param integer $lastactivity
*
* @return KimaiUsers
*/
public function setLastactivity($lastactivity)
{
$this->lastactivity = $lastactivity;
return $this;
}
/**
* Get lastactivity
*
* @return integer
*/
public function getLastactivity()
{
return $this->lastactivity;
}
/**
* Set lastrecord
*
* @param integer $lastrecord
*
* @return KimaiUsers
*/
public function setLastrecord($lastrecord)
{
$this->lastrecord = $lastrecord;
return $this;
}
/**
* Get lastrecord
*
* @return integer
*/
public function getLastrecord()
{
return $this->lastrecord;
}
/**
* Set timeframebegin
*
* @param string $timeframebegin
*
* @return KimaiUsers
*/
public function setTimeframebegin($timeframebegin)
{
$this->timeframebegin = $timeframebegin;
return $this;
}
/**
* Get timeframebegin
*
* @return string
*/
public function getTimeframebegin()
{
return $this->timeframebegin;
}
/**
* Set timeframeend
*
* @param string $timeframeend
*
* @return KimaiUsers
*/
public function setTimeframeend($timeframeend)
{
$this->timeframeend = $timeframeend;
return $this;
}
/**
* Get timeframeend
*
* @return string
*/
public function getTimeframeend()
{
return $this->timeframeend;
}
/**
* Set apikey
*
* @param string $apikey
*
* @return KimaiUsers
*/
public function setApikey($apikey)
{
$this->apikey = $apikey;
return $this;
}
/**
* Get apikey
*
* @return string
*/
public function getApikey()
{
return $this->apikey;
}
/**
* Set globalroleid
*
* @param integer $globalroleid
*
* @return KimaiUsers
*/
public function setGlobalroleid($globalroleid)
{
$this->globalroleid = $globalroleid;
return $this;
}
/**
* Get globalroleid
*
* @return integer
*/
public function getGlobalroleid()
{
return $this->globalroleid;
}
/**
* Get userid
*
* @return integer
*/
public function getUserid()
{
return $this->userid;
}
}

View File

@@ -1,184 +0,0 @@
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
/**
* FIXME CAN BE REMOVED
*
* @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository")
* @ORM\Table(name="demo_post")
*
* Defines the properties of the Post entity to represent the blog posts.
* See http://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 http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class Post
{
/**
* Use constants to define configuration options that rarely change instead
* of specifying them in app/config/config.yml.
* See http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
*/
const NUM_ITEMS = 10;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $title;
/**
* @ORM\Column(type="string")
*/
private $slug;
/**
* @ORM\Column(type="string")
* @Assert\NotBlank(message="post.blank_summary")
*/
private $summary;
/**
* @ORM\Column(type="text")
* @Assert\NotBlank(message="post.blank_content")
* @Assert\Length(min = "10", minMessage = "post.too_short_content")
*/
private $content;
/**
* @ORM\Column(type="string")
* @Assert\Email()
*/
private $authorEmail;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $publishedAt;
/**
* @ORM\OneToMany(
* targetEntity="Comment",
* mappedBy="post",
* orphanRemoval=true
* )
* @ORM\OrderBy({"publishedAt" = "DESC"})
*/
private $comments;
public function __construct()
{
$this->publishedAt = new \DateTime();
$this->comments = new ArrayCollection();
}
public function getId()
{
return $this->id;
}
public function getTitle()
{
return $this->title;
}
public function setTitle($title)
{
$this->title = $title;
}
public function getSlug()
{
return $this->slug;
}
public function setSlug($slug)
{
$this->slug = $slug;
}
public function getContent()
{
return $this->content;
}
public function setContent($content)
{
$this->content = $content;
}
public function getAuthorEmail()
{
return $this->authorEmail;
}
public function setAuthorEmail($authorEmail)
{
$this->authorEmail = $authorEmail;
}
/**
* Is the given User the author of this Post?
*
* @param User $user
*
* @return bool
*/
public function isAuthor(User $user)
{
return $user->getEmail() === $this->getAuthorEmail();
}
public function getPublishedAt()
{
return $this->publishedAt;
}
public function setPublishedAt(\DateTime $publishedAt)
{
$this->publishedAt = $publishedAt;
}
public function getComments()
{
return $this->comments;
}
public function addComment(Comment $comment)
{
$this->comments->add($comment);
$comment->setPost($this);
}
public function removeComment(Comment $comment)
{
$this->comments->removeElement($comment);
}
public function getSummary()
{
return $this->summary;
}
public function setSummary($summary)
{
$this->summary = $summary;
}
}

View File

@@ -5,50 +5,499 @@ namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* FIXME CAN BE REMOVED
* KimaiUsers
*
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
* @ORM\Table(name="demo_user")
*
* Defines the properties of the User entity to represent the application users.
* See http://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 http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
* @ORM\Table(name="users", uniqueConstraints={@ORM\UniqueConstraint(name="name", columns={"name"}), @ORM\UniqueConstraint(name="apikey", columns={"apikey"})})
* @ORM\Entity
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @ORM\Column(name="userID", type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", unique=true)
* @ORM\Column(name="name", type="string", length=160, nullable=false, unique=true)
*/
private $username;
/**
* @ORM\Column(type="string", unique=true)
* @ORM\Column(name="mail", type="string", length=160, nullable=false, unique=true)
*/
private $email;
/**
* @ORM\Column(type="string")
* @ORM\Column(name="password", type="string", length=254, nullable=true)
*/
private $password;
/**
* @var string
*
* @ORM\Column(name="alias", type="string", length=160, nullable=true)
*/
private $alias;
/**
* @var boolean
*
* @ORM\Column(name="trash", type="boolean", nullable=false)
*/
private $trash = '0';
/**
* @var boolean
*
* @ORM\Column(name="active", type="boolean", nullable=false)
*/
private $active = '1';
/**
* @var string
*
* @ORM\Column(name="passwordResetHash", type="string", length=32, nullable=true)
*/
private $passwordresethash;
/**
* @var integer
*
* @ORM\Column(name="ban", type="integer", nullable=false)
*/
private $ban = '0';
/**
* @var integer
*
* @ORM\Column(name="banTime", type="integer", nullable=false)
*/
private $bantime = '0';
/**
* @var string
*
* @ORM\Column(name="secure", type="string", length=60, nullable=false)
*/
private $secure = '0';
/**
* FIXME
*
* @var integer
*
* @ORM\Column(name="lastProject", type="integer", nullable=false)
*/
private $lastproject = '1';
/**
* FIXME
*
* @var integer
*
* @ORM\Column(name="lastActivity", type="integer", nullable=false)
*/
private $lastactivity = '1';
/**
* @var integer
*
* @ORM\Column(name="lastRecord", type="integer", nullable=false)
*/
private $lastrecord = '0';
/**
* @var string
*
* @ORM\Column(name="timeframeBegin", type="string", length=60, nullable=false)
*/
private $timeframebegin = '0';
/**
* @var string
*
* @ORM\Column(name="timeframeEnd", type="string", length=60, nullable=false)
*/
private $timeframeend = '0';
/**
* @var string
*
* @ORM\Column(name="apikey", type="string", length=30, nullable=true)
*/
private $apikey;
/**
* @ORM\Column(type="json_array")
*/
private $roles = [];
/**
* Set alias
*
* @param string $alias
*
* @return KimaiUsers
*/
public function setAlias($alias)
{
$this->alias = $alias;
return $this;
}
/**
* Get alias
*
* @return string
*/
public function getAlias()
{
return $this->alias;
}
/**
* Set trash
*
* @param boolean $trash
*
* @return KimaiUsers
*/
public function setTrash($trash)
{
$this->trash = $trash;
return $this;
}
/**
* Get trash
*
* @return boolean
*/
public function getTrash()
{
return $this->trash;
}
/**
* Set active
*
* @param boolean $active
*
* @return KimaiUsers
*/
public function setActive($active)
{
$this->active = $active;
return $this;
}
/**
* Get active
*
* @return boolean
*/
public function getActive()
{
return $this->active;
}
/**
* Set password
*
* @param string $password
*
* @return KimaiUsers
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Set passwordresethash
*
* @param string $passwordresethash
*
* @return KimaiUsers
*/
public function setPasswordresethash($passwordresethash)
{
$this->passwordresethash = $passwordresethash;
return $this;
}
/**
* Get passwordresethash
*
* @return string
*/
public function getPasswordresethash()
{
return $this->passwordresethash;
}
/**
* Set ban
*
* @param integer $ban
*
* @return KimaiUsers
*/
public function setBan($ban)
{
$this->ban = $ban;
return $this;
}
/**
* Get ban
*
* @return integer
*/
public function getBan()
{
return $this->ban;
}
/**
* Set bantime
*
* @param integer $bantime
*
* @return KimaiUsers
*/
public function setBantime($bantime)
{
$this->bantime = $bantime;
return $this;
}
/**
* Get bantime
*
* @return integer
*/
public function getBantime()
{
return $this->bantime;
}
/**
* Set secure
*
* @param string $secure
*
* @return KimaiUsers
*/
public function setSecure($secure)
{
$this->secure = $secure;
return $this;
}
/**
* Get secure
*
* @return string
*/
public function getSecure()
{
return $this->secure;
}
/**
* Set lastproject
*
* @param integer $lastproject
*
* @return KimaiUsers
*/
public function setLastproject($lastproject)
{
$this->lastproject = $lastproject;
return $this;
}
/**
* Get lastproject
*
* @return integer
*/
public function getLastproject()
{
return $this->lastproject;
}
/**
* Set lastactivity
*
* @param integer $lastactivity
*
* @return KimaiUsers
*/
public function setLastactivity($lastactivity)
{
$this->lastactivity = $lastactivity;
return $this;
}
/**
* Get lastactivity
*
* @return integer
*/
public function getLastactivity()
{
return $this->lastactivity;
}
/**
* Set lastrecord
*
* @param integer $lastrecord
*
* @return KimaiUsers
*/
public function setLastrecord($lastrecord)
{
$this->lastrecord = $lastrecord;
return $this;
}
/**
* Get lastrecord
*
* @return integer
*/
public function getLastrecord()
{
return $this->lastrecord;
}
/**
* Set timeframebegin
*
* @param string $timeframebegin
*
* @return KimaiUsers
*/
public function setTimeframebegin($timeframebegin)
{
$this->timeframebegin = $timeframebegin;
return $this;
}
/**
* Get timeframebegin
*
* @return string
*/
public function getTimeframebegin()
{
return $this->timeframebegin;
}
/**
* Set timeframeend
*
* @param string $timeframeend
*
* @return KimaiUsers
*/
public function setTimeframeend($timeframeend)
{
$this->timeframeend = $timeframeend;
return $this;
}
/**
* Get timeframeend
*
* @return string
*/
public function getTimeframeend()
{
return $this->timeframeend;
}
/**
* Set apikey
*
* @param string $apikey
*
* @return KimaiUsers
*/
public function setApikey($apikey)
{
$this->apikey = $apikey;
return $this;
}
/**
* Get apikey
*
* @return string
*/
public function getApikey()
{
return $this->apikey;
}
/**
* Set globalroleid
*
* @param integer $globalroleid
*
* @return KimaiUsers
*/
public function setGlobalroleid($globalroleid)
{
$this->globalroleid = $globalroleid;
return $this;
}
/**
* Get globalroleid
*
* @return integer
*/
public function getGlobalroleid()
{
return $this->globalroleid;
}
public function getId()
{
return $this->id;
@@ -75,18 +524,6 @@ class User implements UserInterface
$this->email = $email;
}
/**
* {@inheritdoc}
*/
public function getPassword()
{
return $this->password;
}
public function setPassword($password)
{
$this->password = $password;
}
/**
* Returns the roles or permissions granted to the user for security.
*/
@@ -127,4 +564,9 @@ class User implements UserInterface
// if you had a plainPassword property, you'd nullify it here
// $this->plainPassword = null;
}
}
public function __toString()
{
return $this->getUsername();
}
}

View File

@@ -5,13 +5,30 @@ namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* KimaiPreferences
* UserPreference
*
* @ORM\Table(name="preferences")
* @ORM\Table(name="preferences",indexes={@ORM\Index(name="option_idx", columns={"userid", "option"})}))
* @ORM\Entity
*/
class KimaiPreferences
class UserPreference
{
/**
* @var integer
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(name="userID", type="integer")
*/
private $userid;
/**
* @var string
*
* @ORM\Column(name="option", type="string", length=255)
*/
private $option;
/**
* @var string
*
@@ -19,32 +36,12 @@ class KimaiPreferences
*/
private $value;
/**
* @var string
*
* @ORM\Column(name="option", type="string", length=255)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $option;
/**
* @var integer
*
* @ORM\Column(name="userID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $userid;
/**
* Set value
*
* @param string $value
*
* @return KimaiPreferences
* @return UserPreference
*/
public function setValue($value)
{
@@ -68,7 +65,7 @@ class KimaiPreferences
*
* @param string $option
*
* @return KimaiPreferences
* @return UserPreference
*/
public function setOption($option)
{
@@ -92,7 +89,7 @@ class KimaiPreferences
*
* @param integer $userid
*
* @return KimaiPreferences
* @return UserPreference
*/
public function setUserid($userid)
{

View File

@@ -11,45 +11,26 @@
namespace AppBundle\Event;
use Knp\Menu\FactoryInterface;
use Knp\Menu\ItemInterface;
use Symfony\Component\EventDispatcher\Event;
use Avanzu\AdminThemeBundle\Model\MenuItemModel;
/**
* The ConfigureAdminMenuEvent is used for populating the administration navigation.
*
* @author Kevin Papst <kevin@kevinpapst.de>
*/
class ConfigureAdminMenuEvent extends Event
class ConfigureAdminMenuEvent extends ConfigureMenuEvent
{
const CONFIGURE = 'app.admin_menu_configure';
private $factory;
private $menu;
/**
* @param \Knp\Menu\FactoryInterface $factory
* @param \Knp\Menu\ItemInterface $menu
* This function will either return a MenuItem or null.
*
* In case this returns null, the user has not the ROLE_ADMIN.
*
* @return MenuItemModel|null
*/
public function __construct(FactoryInterface $factory, ItemInterface $menu)
public function getAdminMenu()
{
$this->factory = $factory;
$this->menu = $menu;
}
/**
* @return \Knp\Menu\FactoryInterface
*/
public function getFactory()
{
return $this->factory;
}
/**
* @return \Knp\Menu\ItemInterface
*/
public function getMenu()
{
return $this->menu;
return $this->getMenu()->getRootItem('admin');
}
}

View File

@@ -20,36 +20,7 @@ use Symfony\Component\EventDispatcher\Event;
*
* @author Kevin Papst <kevin@kevinpapst.de>
*/
class ConfigureMainMenuEvent extends Event
class ConfigureMainMenuEvent extends ConfigureMenuEvent
{
const CONFIGURE = 'app.main_menu_configure';
private $factory;
private $menu;
/**
* @param \Knp\Menu\FactoryInterface $factory
* @param \Knp\Menu\ItemInterface $menu
*/
public function __construct(FactoryInterface $factory, ItemInterface $menu)
{
$this->factory = $factory;
$this->menu = $menu;
}
/**
* @return \Knp\Menu\FactoryInterface
*/
public function getFactory()
{
return $this->factory;
}
/**
* @return \Knp\Menu\ItemInterface
*/
public function getMenu()
{
return $this->menu;
}
}

View File

@@ -0,0 +1,80 @@
<?php
/*
* This file is part of the Kimai package.
*
* (c) Kevin Papst <kevin@kevinpapst.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace AppBundle\Event;
use Avanzu\AdminThemeBundle\Model\MenuItemModel;
use Avanzu\AdminThemeBundle\Event\SidebarMenuEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
/**
* The ConfigureMenuEvent is used for populating navigations.
*
* @author Kevin Papst <kevin@kevinpapst.de>
*/
abstract class ConfigureMenuEvent extends Event
{
/**
* @var Request
*/
private $request;
/**
* @var SidebarMenuEvent
*/
private $event;
/**
* @var AuthorizationChecker
*/
private $auth;
/**
* ConfigureMenuEvent constructor.
* @param AuthorizationChecker $auth
* @param Request $request
* @param MenuItemModel $menuModel
*/
public function __construct(
AuthorizationChecker $auth,
Request $request,
SidebarMenuEvent $event
)
{
$this->auth = $auth;
$this->request = $request;
$this->event = $event;
}
/**
* @return Request
*/
public function getRequest()
{
return $this->request;
}
/**
* @return SidebarMenuEvent
*/
public function getMenu()
{
return $this->event;
}
/**
* @return AuthorizationChecker
*/
public function getAuth()
{
return $this->auth;
}
}

View File

@@ -0,0 +1,120 @@
<?php
/*
* This file is part of the Kimai package.
*
* (c) Kevin Papst <kevin@kevinpapst.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace AppBundle\EventListener;
use AppBundle\Event\ConfigureMainMenuEvent;
use AppBundle\Event\ConfigureAdminMenuEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Avanzu\AdminThemeBundle\Model\MenuItemModel;
use Avanzu\AdminThemeBundle\Event\SidebarMenuEvent;
/**
* Class MenuBuilder configures the main navigation.
*
* @author Kevin Papst <kevin@kevinpapst.de>
*/
class MenuBuilder
{
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var AuthorizationChecker
*/
private $security;
/**
* MenuBuilder constructor.
* @param EventDispatcherInterface $dispatcher
* @param AuthorizationChecker $security
*/
public function __construct(
EventDispatcherInterface $dispatcher,
AuthorizationChecker $security
)
{
$this->eventDispatcher = $dispatcher;
$this->security = $security;
}
/**
* Generate the main menu.
*
* @param SidebarMenuEvent $event
*/
public function onSetupNavbar(SidebarMenuEvent $event)
{
$request = $event->getRequest();
$isLoggedIn = $this->security->isGranted('IS_AUTHENTICATED_FULLY');
$isAdmin = $isLoggedIn && $this->security->isGranted('ROLE_ADMIN');
$event->addItem(
new MenuItemModel('dashboard', 'menu.homepage', 'dashboard', [], 'fa fa-home')
);
$this->eventDispatcher->dispatch(
ConfigureMainMenuEvent::CONFIGURE,
new ConfigureMainMenuEvent(
$this->security,
$request,
$event
)
);
if ($isAdmin) {
$event->addItem(
new MenuItemModel('admin', 'menu.admin_dashboard', '', [], 'fa fa-dashboard')
);
$this->eventDispatcher->dispatch(
ConfigureAdminMenuEvent::CONFIGURE,
new ConfigureAdminMenuEvent(
$this->security,
$request,
$event
)
);
}
$event->addItem(
new MenuItemModel('logout', 'menu.logout', 'security_logout', [], 'fa fa-sign-out')
);
$this->activateByRoute(
$event->getRequest()->get('_route'),
$event->getItems()
);
}
/**
* @param string $route
* @param MenuItemModel[] $items
*/
protected function activateByRoute($route, $items)
{
foreach($items as $item) {
if($item->hasChildren()) {
$this->activateByRoute($route, $item->getChildren());
}
else {
if($item->getRoute() == $route) {
$item->setIsActive(true);
}
}
}
}
}

View File

@@ -1,58 +0,0 @@
<?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 AppBundle\Form;
use AppBundle\Entity\Comment;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* FIXME CAN BE REMOVED
*
* Defines the form used to create and manipulate blog comments. Although in this
* case the form is trivial and we could build it inside the controller, a good
* practice is to always define your forms as classes.
* See http://symfony.com/doc/current/book/forms.html#creating-form-classes
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class CommentType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
// By default, form fields include the 'required' attribute, which enables
// the client-side form validation. This means that you can't test the
// server-side validation errors from the browser. To temporarily disable
// this validation, set the 'required' attribute to 'false':
//
// $builder->add('content', null, ['required' => false]);
$builder
->add('content')
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Comment::class,
]);
}
}

View File

@@ -1,76 +0,0 @@
<?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 AppBundle\Form;
use AppBundle\Entity\Post;
use AppBundle\Form\Type\DateTimePickerType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* FIXME CAN BE REMOVED
*
* Defines the form used to create and manipulate blog posts.
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class PostType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
// For the full reference of options defined by each form field type
// see http://symfony.com/doc/current/reference/forms/types.html
// By default, form fields include the 'required' attribute, which enables
// the client-side form validation. This means that you can't test the
// server-side validation errors from the browser. To temporarily disable
// this validation, set the 'required' attribute to 'false':
//
// $builder->add('title', null, ['required' => false, ...]);
$builder
->add('title', null, [
'attr' => ['autofocus' => true],
'label' => 'label.title',
])
->add('summary', TextareaType::class, [
'label' => 'label.summary',
])
->add('content', null, [
'attr' => ['rows' => 20],
'label' => 'label.content',
])
->add('authorEmail', null, [
'label' => 'label.author_email',
])
->add('publishedAt', DateTimePickerType::class, [
'label' => 'label.published_at',
])
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Post::class,
]);
}
}

View File

@@ -1,129 +0,0 @@
<?php
/*
* This file is part of the Kimai package.
*
* (c) Kevin Papst <kevin@kevinpapst.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace AppBundle\Menu;
use Knp\Menu\FactoryInterface;
use AppBundle\Event\ConfigureMainMenuEvent;
use AppBundle\Event\ConfigureAdminMenuEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
/**
* Class MenuBuilder
*
* @author Kevin Papst <kevin@kevinpapst.de>
*/
class MenuBuilder
{
/**
* @var FactoryInterface
*/
private $factory;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var AuthorizationChecker
*/
private $security;
/**
* MenuBuilder constructor.
* @param FactoryInterface $factory
* @param EventDispatcherInterface $dispatcher
* @param AuthorizationChecker $security
*/
public function __construct(FactoryInterface $factory,
EventDispatcherInterface $dispatcher,
AuthorizationChecker $security)
{
$this->factory = $factory;
$this->eventDispatcher = $dispatcher;
$this->security = $security;
}
/**
* Generate the main menu.
*
* @param array $options
* @return \Knp\Menu\ItemInterface
*/
public function createMainMenu(array $options)
{
$menu = $this->factory->createItem('main');
$menu->setChildrenAttribute('class', 'nav navbar-nav navbar-right');
$isLoggedIn = $this->security->isGranted('IS_AUTHENTICATED_FULLY');
$isAdmin = $isLoggedIn && $this->security->isGranted('ROLE_ADMIN');
if ($isLoggedIn) {
$item = $menu->addChild('Homepage', array('route' => 'blog_index'));
$item->setLabel('menu.homepage');
$item->setChildrenAttribute('icon', 'home');
}
$this->eventDispatcher->dispatch(
ConfigureMainMenuEvent::CONFIGURE,
new ConfigureMainMenuEvent($this->factory, $menu)
);
if ($isAdmin) {
$item = $menu->addChild('Administration', array('route' => 'admin_post_index'));
$item->setLabel('menu.admin');
$item->setChildrenAttribute('icon', 'lock');
}
if ($isLoggedIn) {
$item = $menu->addChild('Logout', array('route' => 'security_logout'));
$item->setLabel('menu.logout');
$item->setChildrenAttribute('icon', 'sign-out');
}
return $menu;
}
/**
* Generate the admin menu.
*
* @param array $options
* @return \Knp\Menu\ItemInterface
*/
public function createAdminMenu(array $options)
{
$menu = $this->factory->createItem('admin');
$menu->setChildrenAttribute('class', 'nav navbar-nav navbar-right');
$isLoggedIn = $this->security->isGranted('IS_AUTHENTICATED_FULLY');
$isAdmin = $isLoggedIn && $this->security->isGranted('ROLE_ADMIN');
// FIXME CAN BE REMOVED
if ($isAdmin) {
$item = $menu->addChild('Post list', array('route' => 'admin_post_index'));
$item->setLabel('menu.post_list');
$item->setChildrenAttribute('icon', 'list-alt');
}
$this->eventDispatcher->dispatch(
ConfigureAdminMenuEvent::CONFIGURE,
new ConfigureAdminMenuEvent($this->factory, $menu)
);
if ($isLoggedIn) {
$item = $menu->addChild('Logout', array('route' => 'security_logout'));
$item->setLabel('menu.logout');
$item->setChildrenAttribute('icon', 'sign-out');
}
return $menu;
}
}

View File

@@ -1,61 +0,0 @@
<?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 AppBundle\Repository;
use AppBundle\Entity\Post;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Pagerfanta\Pagerfanta;
/**
* FIXME CAN BE REMOVED
*
* This custom Doctrine repository contains some methods which are useful when
* querying for blog post information.
* See http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes
*
* @author Ryan Weaver <weaverryan@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
class PostRepository extends EntityRepository
{
/**
* @return Query
*/
public function queryLatest()
{
return $this->getEntityManager()
->createQuery('
SELECT p
FROM AppBundle:Post p
WHERE p.publishedAt <= :now
ORDER BY p.publishedAt DESC
')
->setParameter('now', new \DateTime())
;
}
/**
* @param int $page
*
* @return Pagerfanta
*/
public function findLatest($page = 1)
{
$paginator = new Pagerfanta(new DoctrineORMAdapter($this->queryLatest(), false));
$paginator->setMaxPerPage(Post::NUM_ITEMS);
$paginator->setCurrentPage($page);
return $paginator;
}
}

View File

@@ -14,7 +14,6 @@ namespace AppBundle\Repository;
use Doctrine\ORM\EntityRepository;
/**
* FIXME CAN BE REMOVED
*
* This custom Doctrine repository is empty because so far we don't need any custom
* method to query for application user information. But it's always a good practice

View File

@@ -1,75 +0,0 @@
<?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 AppBundle\Tests\Controller\Admin;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Response;
/**
* FIXME CAN BE REMOVED
*
* Functional test for the controllers defined inside the BlogController used
* for managing the blog in the backend.
* See http://symfony.com/doc/current/book/testing.html#functional-tests
*
* Whenever you test resources protected by a firewall, consider using the
* technique explained in:
* http://symfony.com/doc/current/cookbook/testing/http_authentication.html
*
* Execute the application tests using this command (requires PHPUnit to be installed):
*
* $ cd your-symfony-project/
* $ phpunit -c app
*
*/
class BlogControllerTest extends WebTestCase
{
public function testRegularUsersCannotAccessToTheBackend()
{
$client = static::createClient([], [
'PHP_AUTH_USER' => 'john_user',
'PHP_AUTH_PW' => 'kitten',
]);
$client->request('GET', '/en/admin/post/');
$this->assertEquals(Response::HTTP_FORBIDDEN, $client->getResponse()->getStatusCode());
}
public function testAdministratorUsersCanAccessToTheBackend()
{
$client = static::createClient([], [
'PHP_AUTH_USER' => 'anna_admin',
'PHP_AUTH_PW' => 'kitten',
]);
$client->request('GET', '/en/admin/post/');
$this->assertEquals(Response::HTTP_OK, $client->getResponse()->getStatusCode());
}
public function testIndex()
{
$client = static::createClient([], [
'PHP_AUTH_USER' => 'anna_admin',
'PHP_AUTH_PW' => 'kitten',
]);
$crawler = $client->request('GET', '/en/admin/post/');
$this->assertCount(
30,
$crawler->filter('body#admin_post_index #main tbody tr'),
'The backend homepage displays all the available posts.'
);
}
}

View File

@@ -1,42 +0,0 @@
<?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 AppBundle\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use AppBundle\Entity\Post;
/**
* FIXME CAN BE REMOVED
*
* Functional test for the controllers defined inside BlogController.
* See http://symfony.com/doc/current/book/testing.html#functional-tests
*
* Execute the application tests using this command (requires PHPUnit to be installed):
*
* $ cd your-symfony-project/
* $ phpunit -c app
*
*/
class BlogControllerTest extends WebTestCase
{
public function testIndex()
{
$client = static::createClient();
$crawler = $client->request('GET', '/en/blog/');
$this->assertCount(
Post::NUM_ITEMS,
$crawler->filter('article.post'),
'The homepage displays the right number of posts.'
);
}
}

View File

@@ -55,6 +55,7 @@ class DefaultControllerTest extends WebTestCase
*/
public function testSecureUrls($url)
{
$this->markTestSkipped('No admin URLs for testing');
$client = self::createClient();
$client->request('GET', $url);
@@ -70,16 +71,11 @@ class DefaultControllerTest extends WebTestCase
public function getPublicUrls()
{
yield ['/'];
yield ['/en/blog/'];
yield ['/en/blog/posts/morbi-tempus-commodo-mattis'];
yield ['/en/login'];
}
public function getSecureUrls()
{
yield ['/en/admin/post/'];
yield ['/en/admin/post/new'];
yield ['/en/admin/post/1'];
yield ['/en/admin/post/1/edit'];
}
}