WIP: feature_paste #1
|
@ -15,7 +15,8 @@ use Symfony\Component\HttpFoundation\Request;
|
|||
class PasteController extends AbstractController
|
||||
{
|
||||
#[Route('/')]
|
||||
|
||||
public function new(Request $request, PasteRepository $pasteRepository): Response {
|
||||
public function new(Request $request, PasteRepository $pasteRepository): Response
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
You don't really need Make your repository implement You don't really need `EntityManager` here.
Make your repository implement `save` like I showed you and use it instead.
|
||||
{
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
I'd suggest we refactor this to to DTO usage and make our I'd suggest we refactor this to to DTO usage and make our `Paste` entity immutable.
|
||||
$paste = new Paste();
|
||||
$form = $this->createForm(PasteForm::class, $paste);
|
||||
|
||||
|
@ -32,7 +33,6 @@ class PasteController extends AbstractController
|
|||
$pasteRepository->save($paste);
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
I still suggest to make I still suggest to make `Paste::fromFormData()`.
|
||||
|
||||
return $this->redirectToRoute($request->attributes->get('_route'));
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
Just set a BTW, where are you redirecting exactly? 🤔 You should be redirecting to the route which is processed by Just set a `name` for your route and you won't need such workarounds.
BTW, where are you redirecting exactly? 🤔 You should be redirecting to the route which is processed by `PasteController::show_paste()` as far as I understand your code.
|
||||
|
||||
}
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
I see you needed some space 🤔 I see you needed some space 🤔
|
||||
|
||||
return $this->render('paste.html.twig', [
|
||||
|
@ -41,13 +41,13 @@ class PasteController extends AbstractController
|
|||
}
|
||||
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
- it's a good idea to add `,` to the last argument too if you use multi-line formatting
- if you're doing this in the controller, you can just do something like `$pasteData->private ? \hash('sha1', \random_bytes(25)) : null`. But I suggest to do that in the static method (named constructor) as I also suggested nearby.
|
||||
#[Route('/{id}/{secret}')]
|
||||
public function show_paste(PasteRepository $pasteRepository, Request $request, string $id, ?string $secret=NULL): Response {
|
||||
public function showPaste(PasteRepository $pasteRepository, Request $request, string $id, ?string $secret=NULL): Response
|
||||
{
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
You're violating Symfony code style here which as I can guess you used above. You can just set Symfony style in the settings of your IDE for this project and auto-format this file to fix. Or fix it manually if you want. You're violating [Symfony code style](https://symfony.com/doc/current/contributing/code/standards.html#symfony-coding-standards-in-detail) here which as I can guess you used above.
You can just set Symfony style in the settings of your IDE for this project and auto-format this file to fix. Or fix it manually if you want.
|
||||
$paste = $pasteRepository->findOneBy(['id' => $id, 'secret' => $secret]);
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
Do you need double quotes here too? Do you need double quotes here too?
|
||||
$form = $this->createForm(PasteForm::class, $paste);
|
||||
|
||||
return $this->render('paste.html.twig', [
|
||||
skobkin
commented
I'd suggest you implementing Twig extension wih filter and function to use highlighter in the template. I'd suggest you implementing Twig extension wih filter and function to use highlighter in the template.
|
||||
'form' => $form,
|
||||
]);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,91 +51,113 @@ class Paste
|
|||
#[ORM\Column(length: 40, nullable: true)]
|
||||
private ?string $secret;
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
Same code style problem like above. You're leaving It's ok if you're doing multi-line arguments, but not in this case. Same code style problem like above. You're leaving `{` on the same line with return type.
It's ok if you're doing multi-line arguments, but not in this case.
|
||||
|
||||
public function getId(): int {
|
||||
public function getId(): int
|
||||
{
|
||||
return $this->id;
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
Let this thread be for now, but we'd better make this entity immutable and remove every setter method from here. This way we can use Let this thread be for now, but we'd better make this entity immutable and remove every setter method from here.
This way we can use `private readonly` instead of just `private` properties. Or even `public readonly` 🤔
|
||||
}
|
||||
|
||||
public function setId(int $id): void {
|
||||
public function setId(int $id): void
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function getText(): string {
|
||||
public function getText(): string
|
||||
{
|
||||
return $this->text;
|
||||
}
|
||||
|
||||
public function setText(string $text): void {
|
||||
public function setText(string $text): void
|
||||
{
|
||||
$this->text = $text;
|
||||
}
|
||||
|
||||
public function getLanguage(): ?string {
|
||||
public function getLanguage(): ?string
|
||||
{
|
||||
return $this->language;
|
||||
}
|
||||
|
||||
public function setLanguage(?string $language): void {
|
||||
public function setLanguage(?string $language): void
|
||||
{
|
||||
$this->language = $language;
|
||||
}
|
||||
|
||||
public function getDescription(): ?string {
|
||||
public function getDescription(): ?string
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
public function setDescription(?string $description): void {
|
||||
public function setDescription(?string $description): void
|
||||
{
|
||||
$this->description = $description;
|
||||
}
|
||||
|
||||
public function getFilename(): ?string {
|
||||
public function getFilename(): ?string
|
||||
{
|
||||
return $this->filename;
|
||||
}
|
||||
|
||||
public function setFilename(?string $filename): void {
|
||||
public function setFilename(?string $filename): void
|
||||
{
|
||||
$this->filename = $filename;
|
||||
}
|
||||
|
||||
public function getAuthor(): string {
|
||||
public function getAuthor(): string
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
You don't need this. You don't need this.
|
||||
{
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
public function setAuthor(string $author): void {
|
||||
public function setAuthor(string $author): void
|
||||
{
|
||||
$this->author = $author;
|
||||
}
|
||||
|
||||
public function getPublishDate(): \DateTime {
|
||||
public function getPublishDate(): \DateTime
|
||||
{
|
||||
return $this->publishDate;
|
||||
}
|
||||
|
||||
public function setPublishDate(\DateTime $date): void {
|
||||
public function setPublishDate(\DateTime $date): void
|
||||
{
|
||||
$this->publishDate = $date;
|
||||
}
|
||||
|
||||
public function getExpirationDate(): ?\DateTime {
|
||||
public function getExpirationDate(): ?\DateTime
|
||||
{
|
||||
return $this->expirationDate;
|
||||
}
|
||||
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
You don't need this. You don't need this.
|
||||
public function setExpirationDate(?\DateTime $date): void {
|
||||
public function setExpirationDate(?\DateTime $date): void
|
||||
{
|
||||
$this->expirationDate = $date;
|
||||
}
|
||||
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
Do you really need this You can just Do you really need this `bool` flag?
You can just `return $this->secret !== null`.
|
||||
public function getIp(): string {
|
||||
public function getIp(): string
|
||||
{
|
||||
return $this->ip;
|
||||
}
|
||||
|
||||
public function setIP(string $ip): void {
|
||||
public function setIP(string $ip): void
|
||||
{
|
||||
$this->ip = $ip;
|
||||
}
|
||||
|
||||
public function getSecret(): ?string {
|
||||
public function getSecret(): ?string
|
||||
{
|
||||
return $this->secret;
|
||||
}
|
||||
|
||||
public function setSecret(?string $secret): void {
|
||||
public function setSecret(?string $secret): void
|
||||
{
|
||||
$this->secret = $secret;
|
||||
}
|
||||
|
||||
public function isPrivate(): bool {
|
||||
public function isPrivate(): bool
|
||||
{
|
||||
return $this->private;
|
||||
}
|
||||
|
||||
public function setPrivate(bool $private): void {
|
||||
public function setPrivate(bool $private): void
|
||||
{
|
||||
$this->private = $private;
|
||||
}
|
||||
}
|
|
@ -15,14 +15,27 @@ use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
|||
|
||||
class PasteForm extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void {
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
Double quotes? Also please multi-line format arrays with more than one element for readability. Double quotes?
Also please multi-line format arrays with more than one element for readability.
|
||||
{
|
||||
$builder
|
||||
->add('language', ChoiceType::class, ['choices' => ['Python' => 'python', 'PHP' => 'php', 'Plain text' => NULL]])
|
||||
->add('language', ChoiceType::class, [
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
You can probably extract You can probably extract `128` to the constant and use here and in the validation attribute.
|
||||
'choices' => [
|
||||
'Python' => 'python',
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
This should be a combo-box ( This should be a combo-box (`select` in HTML terms) with a list of available periods like "10 minutes", "1 year" and "Never".
|
||||
'PHP' => 'php',
|
||||
'Plain text' => NULL,
|
||||
]
|
||||
]
|
||||
)
|
||||
->add('description', TextType::class, ['required' => false])
|
||||
->add('text', TextareaType::class)
|
||||
->add('author', TextType::class, ['attr' => ['maxlength' =>128]])
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
`required => false`?
|
||||
->add('filename', TextType::class, ['required' => false, 'attr' => ['maxlength' =>128]])
|
||||
skobkin
commented
Why 128? Why 128?
|
||||
->add('expirationDate', DateTimeType::class, ['required' => false, 'date_widget' => 'single_text', 'input' => 'datetime'])
|
||||
->add('expirationDate', DateTimeType::class, [
|
||||
'required' => false,
|
||||
'date_widget' => 'single_text',
|
||||
'input' => 'datetime',
|
||||
]
|
||||
)
|
||||
->add('private', CheckboxType::class, ['required' => false])
|
||||
->add('save', SubmitType::class)
|
||||
;
|
||||
|
|
|
@ -9,11 +9,13 @@ use Doctrine\Persistence\ManagerRegistry;
|
|||
|
||||
class PasteRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry) {
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
I'd suggest adding I'd suggest adding `save()` here like I showed you.
skobkin
commented
Better with optional Better with optional `flush`.
Flushng from the repo itself should be a rare action.
|
||||
parent::__construct($registry, Paste::class);
|
||||
}
|
||||
|
||||
public function save(Paste $paste): void {
|
||||
public function save(Paste $paste): void
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
Do not forget to use code formatting. It'd surrounded Do not forget to use code formatting. It'd surrounded `=` with spaces for you.
|
||||
{
|
||||
$entityManager = $this->getEntityManager();
|
||||
$entityManager->persist($paste);
|
||||
$entityManager->flush();
|
||||
skobkin marked this conversation as resolved
Outdated
skobkin
commented
You shouldn't do flush here by default. Only in certain cases if needed. You shouldn't do flush here by default. Only in certain cases if needed.
|
||||
|
|
I'd suggest explicitly defining which request methods we're processing here.
P.S. We'll move this to YAML in the end.