Refactoring for symfony/flex. It finally works.

This commit is contained in:
Alexey Skobkin 2019-01-20 07:11:30 +03:00
parent 713099333c
commit 969fea6eb3
17 changed files with 173 additions and 66 deletions

View File

@ -28,6 +28,7 @@
"symfony/security-bundle": "^4.2", "symfony/security-bundle": "^4.2",
"symfony/translation": "^4.2", "symfony/translation": "^4.2",
"symfony/twig-bundle": "^4.2", "symfony/twig-bundle": "^4.2",
"symfony/validator": "^4.2",
"symfony/yaml": "^4.2", "symfony/yaml": "^4.2",
"theodordiaconu/geshi": "dev-master", "theodordiaconu/geshi": "dev-master",
"theodordiaconu/geshi-bundle": "dev-master" "theodordiaconu/geshi-bundle": "dev-master"

91
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "12a1646d5d2aeff9249a996492e96c85", "content-hash": "b2efcf2213eb068842d3ad2b85667014",
"packages": [ "packages": [
{ {
"name": "doctrine/annotations", "name": "doctrine/annotations",
@ -4009,6 +4009,95 @@
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2019-01-03T09:07:35+00:00" "time": "2019-01-03T09:07:35+00:00"
}, },
{
"name": "symfony/validator",
"version": "v4.2.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
"reference": "f89d2fab883a6a20d0d0093537392763cf52f0ba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/f89d2fab883a6a20d0d0093537392763cf52f0ba",
"reference": "f89d2fab883a6a20d0d0093537392763cf52f0ba",
"shasum": ""
},
"require": {
"php": "^7.1.3",
"symfony/contracts": "^1.0.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
"symfony/dependency-injection": "<3.4",
"symfony/http-kernel": "<3.4",
"symfony/intl": "<4.1",
"symfony/translation": "<4.2",
"symfony/yaml": "<3.4"
},
"require-dev": {
"doctrine/annotations": "~1.0",
"doctrine/cache": "~1.0",
"egulias/email-validator": "^1.2.8|~2.0",
"symfony/cache": "~3.4|~4.0",
"symfony/config": "~3.4|~4.0",
"symfony/dependency-injection": "~3.4|~4.0",
"symfony/expression-language": "~3.4|~4.0",
"symfony/http-foundation": "~4.1",
"symfony/http-kernel": "~3.4|~4.0",
"symfony/intl": "~4.1",
"symfony/property-access": "~3.4|~4.0",
"symfony/translation": "~4.2",
"symfony/var-dumper": "~3.4|~4.0",
"symfony/yaml": "~3.4|~4.0"
},
"suggest": {
"doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
"doctrine/cache": "For using the default cached annotation reader and metadata cache.",
"egulias/email-validator": "Strict (RFC compliant) email validation",
"psr/cache-implementation": "For using the metadata cache.",
"symfony/config": "",
"symfony/expression-language": "For using the Expression validator",
"symfony/http-foundation": "",
"symfony/intl": "",
"symfony/property-access": "For accessing properties within comparison constraints",
"symfony/translation": "For translating validation errors.",
"symfony/yaml": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.2-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Component\\Validator\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony Validator Component",
"homepage": "https://symfony.com",
"time": "2019-01-06T14:13:54+00:00"
},
{ {
"name": "symfony/var-exporter", "name": "symfony/var-exporter",
"version": "v4.2.2", "version": "v4.2.2",

View File

@ -8,3 +8,11 @@ doctrine:
charset: 'UTF8' charset: 'UTF8'
orm: orm:
auto_generate_proxy_classes: "%kernel.debug%" auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
mappings:
App\Entity:
type: annotation
dir: '%kernel.project_dir%/src/Entity'
is_bundle: false
prefix: App\Entity
alias: App

View File

@ -1,6 +1,5 @@
doctrine: #doctrine:
dbal: # dbal:
dbname: "%test_database_name%" # driver: 'mysqli'
port: "%test_database_port%" # url: '%env(resolve:DATABASE_URL)%'
user: "%test_database_user%" # charset: 'UTF8'
password: "%test_database_password%"

View File

@ -0,0 +1,3 @@
framework:
validation:
email_validation_mode: html5

View File

@ -1,3 +1,7 @@
paste_new:
path: /
defaults: { _controller: 'App\Controller\PasteController::newAction' }
paste_show_public: paste_show_public:
path: /{id} path: /{id}
defaults: { _controller: 'App\Controller\PasteController::showAction', secret: null } defaults: { _controller: 'App\Controller\PasteController::showAction', secret: null }
@ -11,10 +15,6 @@ paste_show_private:
id: \d+ id: \d+
secret: \w{16} secret: \w{16}
paste_new:
path: /
defaults: { _controller: 'App\Controller\PasteController::newAction' }
paste_create: paste_create:
path: /create path: /create
defaults: { _controller: 'App\Controller\PasteController::createAction' } defaults: { _controller: 'App\Controller\PasteController::createAction' }

View File

@ -22,3 +22,7 @@ services:
App\Controller\: App\Controller\:
resource: '../src/Controller' resource: '../src/Controller'
tags: ['controller.service_arguments'] tags: ['controller.service_arguments']
# Overriding old bundle service definition
DT\Bundle\GeshiBundle\Highlighter\HighlighterInterface:
class: DT\Bundle\GeshiBundle\Highlighter\GeshiHighlighter

View File

@ -1,17 +1,27 @@
<?php <?php
use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__).'/vendor/autoload.php'; use App\Kernel;
// Load cached env vars if the .env.local.php file exists use Symfony\Component\Debug\Debug;
// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2) use Symfony\Component\HttpFoundation\Request;
if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) {
$_SERVER += $env; require dirname(__DIR__).'/config/bootstrap.php';
$_ENV += $env;
} elseif (!class_exists(Dotenv::class)) { if ($_SERVER['APP_DEBUG']) {
throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); umask(0000);
} else {
// load all the .env files Debug::enable();
(new Dotenv())->loadEnv(dirname(__DIR__).'/.env');
} }
$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) {
$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}
if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) {
Request::setTrustedHosts([$trustedHosts]);
}
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

View File

@ -3,7 +3,7 @@
namespace App\Command; namespace App\Command;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Copypaste; use App\Entity\Paste;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
@ -39,7 +39,7 @@ class DropExpiredPasteCommand extends Command
// @todo move to repository // @todo move to repository
$qb = $this->em->createQueryBuilder() $qb = $this->em->createQueryBuilder()
->delete(Copypaste::class, 'c') ->delete(Paste::class, 'c')
->where('c.dateExpire < :now') ->where('c.dateExpire < :now')
->andWhere('c.dateExpire IS NOT NULL') ->andWhere('c.dateExpire IS NOT NULL')
->setParameter('now', new \DateTime()); ->setParameter('now', new \DateTime());

View File

@ -2,20 +2,21 @@
namespace App\Controller; namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use DT\Bundle\GeshiBundle\Highlighter\HighlighterInterface; use DT\Bundle\GeshiBundle\Highlighter\HighlighterInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\{Request, Response}; use Symfony\Component\HttpFoundation\{Request, Response};
use App\Entity\Copypaste; use App\Entity\Paste;
use App\Form\CopypasteType; use App\Form\PasteType;
use \GeSHi\GeSHi; use \GeSHi\GeSHi;
class PasteController extends AbstractController class PasteController extends AbstractController
{ {
public function createAction(Request $request): Response public function createAction(Request $request): Response
{ {
$paste = new Copypaste(); $paste = new Paste();
$form = $this->createCreateForm($paste); $form = $this->createCreateForm($paste);
$form->handleRequest($request); $form->handleRequest($request);
@ -58,7 +59,7 @@ class PasteController extends AbstractController
public function newAction(): Response public function newAction(): Response
{ {
$paste = new Copypaste(); $paste = new Paste();
$createForm = $this->createCreateForm($paste); $createForm = $this->createCreateForm($paste);
return $this->render('Paste/new.html.twig', [ return $this->render('Paste/new.html.twig', [
@ -67,12 +68,10 @@ class PasteController extends AbstractController
]); ]);
} }
public function showAction(int $id, ?string $secret, HighlighterInterface $highlighter): Response public function showAction(int $id, ?string $secret, EntityManagerInterface $em, HighlighterInterface $highlighter): Response
{ {
$em = $this->getDoctrine()->getManager(); /* @var $paste \App\Entity\Paste */
$paste = $em->getRepository(Paste::class)->findOneBy([
/* @var $paste \App\Entity\Copypaste */
$paste = $em->getRepository(Copypaste::class)->findOneBy([
'id' =>$id, 'id' =>$id,
'secret' => $secret 'secret' => $secret
]); ]);
@ -99,7 +98,7 @@ class PasteController extends AbstractController
{ {
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$pastes = $em->getRepository(Copypaste::class)->findBy( $pastes = $em->getRepository(Paste::class)->findBy(
['secret' => null], ['secret' => null],
['id' => 'DESC'], ['id' => 'DESC'],
// @todo move to the config // @todo move to the config
@ -109,9 +108,9 @@ class PasteController extends AbstractController
return $this->render('sidebar.html.twig', ['pastes' => $pastes]); return $this->render('sidebar.html.twig', ['pastes' => $pastes]);
} }
private function createCreateForm(Copypaste $entity): FormInterface private function createCreateForm(Paste $entity): FormInterface
{ {
$form = $this->createForm(CopypasteType::class, $entity, [ $form = $this->createForm(PasteType::class, $entity, [
'action' => $this->generateUrl('paste_create'), 'action' => $this->generateUrl('paste_create'),
'method' => 'POST', 'method' => 'POST',
]); ]);

View File

@ -6,14 +6,12 @@ use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
/** /**
* Copypaste
*
* @ORM\Table(name="copypastes", indexes={ * @ORM\Table(name="copypastes", indexes={
* @ORM\Index(name="idx_expire", columns={"date_expire"}) * @ORM\Index(name="idx_expire", columns={"date_expire"})
* }) * })
* @ORM\Entity * @ORM\Entity
*/ */
class Copypaste class Paste
{ {
/** /**
* @var integer * @var integer
@ -111,7 +109,7 @@ class Copypaste
return $this; return $this;
} }
public function getText(): string public function getText(): ?string
{ {
return $this->text; return $this->text;
} }
@ -135,7 +133,7 @@ class Copypaste
return $this; return $this;
} }
public function getLanguage(): Language public function getLanguage(): ?Language
{ {
return $this->language; return $this->language;
} }

View File

@ -9,11 +9,6 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class FakeCaptchaType extends AbstractType class FakeCaptchaType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options)
{
}
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults([ $resolver->setDefaults([

View File

@ -2,25 +2,17 @@
namespace App\Form; namespace App\Form;
use App\Entity\Copypaste; use App\Entity\{Paste, Language};
use App\Entity\Language;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\{CheckboxType, ChoiceType, TextareaType, TextType};
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
class CopypasteType extends AbstractType class PasteType extends AbstractType
{ {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
@ -83,7 +75,7 @@ class CopypasteType extends AbstractType
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults([ $resolver->setDefaults([
'data_class' => Copypaste::class 'data_class' => Paste::class
]); ]);
} }
} }

View File

@ -317,6 +317,15 @@
"ref": "369b5b29dc52b2c190002825ae7ec24ab6f962dd" "ref": "369b5b29dc52b2c190002825ae7ec24ab6f962dd"
} }
}, },
"symfony/validator": {
"version": "4.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "master",
"version": "4.1",
"ref": "0cdc982334f45d554957a6167e030482795bf9d7"
}
},
"symfony/var-dumper": { "symfony/var-dumper": {
"version": "v4.2.2" "version": "v4.2.2"
}, },

View File

@ -1,4 +1,4 @@
{% block copypaste_fake_captcha_widget %} {% block fake_captcha_widget %}
{% spaceless %} {% spaceless %}
<div id="{{ form.vars.id }}"></div> <div id="{{ form.vars.id }}"></div>
<script type="text/javascript"> <script type="text/javascript">

View File

@ -2,11 +2,11 @@
{%- block css -%} {%- block css -%}
{{- parent() -}} {{- parent() -}}
<link href="{{ asset('/css/base.css') }}" rel="stylesheet" media="screen"> <link href="/css/base.css" rel="stylesheet" media="screen">
{% endblock %} {% endblock %}
{% block javascript %} {% block javascript %}
{{- parent() -}} {{- parent() -}}
<script src="{{ asset('/js/copypaste.js') }}"></script> <script src="/js/copypaste.js"></script>
{% endblock %} {% endblock %}
{%- block header -%} {%- block header -%}

View File

@ -4,7 +4,7 @@
{%- block head -%} {%- block head -%}
<title>{% block title %}CopyPaste{% endblock %}</title> <title>{% block title %}CopyPaste{% endblock %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="{{ asset('/images/favicon.ico') }}"> <link rel="icon" href="/images/favicon.ico">
{%- block css -%} {%- block css -%}
<link href="https://yastatic.net/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" media="screen"> <link href="https://yastatic.net/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" media="screen">
{%- endblock -%} {%- endblock -%}