Skip to content

Latest commit

 

History

History
561 lines (419 loc) · 13.9 KB

rector_rules_overview.md

File metadata and controls

561 lines (419 loc) · 13.9 KB

22 Rules Overview

BuilderExpandToHelperExpandRector

Change containerBuilder->expand() to static call with parameters

 use Nette\DI\CompilerExtension;

 final class SomeClass extends CompilerExtension
 {
     public function loadConfiguration()
     {
-        $value = $this->getContainerBuilder()->expand('%value');
+        $value = \Nette\DI\Helpers::expand('%value', $this->getContainerBuilder()->parameters);
     }
 }

ContextGetByTypeToConstructorInjectionRector

Move dependency get via $context->getByType() to constructor injection

 class SomeClass
 {
     /**
      * @var \Nette\DI\Container
      */
     private $context;

+    public function __construct(private SomeTypeToInject $someTypeToInject)
+    {
+    }
+
     public function run()
     {
-        $someTypeToInject = $this->context->getByType(SomeTypeToInject::class);
+        $someTypeToInject = $this->someTypeToInject;
     }
 }

ConvertAddUploadWithThirdArgumentTrueToAddMultiUploadRector

convert addUpload() with 3rd argument true to addMultiUpload()

 $form = new Nette\Forms\Form();
-$form->addUpload('...', '...', true);
+$form->addMultiUpload('...', '...');

FormDataRector

Create form data class with all fields of Form

🔧 configure it!

use Rector\Config\RectorConfig;
use RectorNette\Rector\Class_\FormDataRector;

return static function (RectorConfig $rectorConfig): void {
    $rectorConfig->ruleWithConfiguration(FormDataRector::class, [
        FormDataRector::FORM_DATA_CLASS_PARENT => '',
        FormDataRector::FORM_DATA_CLASS_TRAITS => [],
    ]);
};

+class MyFormFactoryFormData
+{
+    public string $foo;
+    public string $bar;
+}
+
 class MyFormFactory
 {
     public function create()
     {
         $form = new Form();

         $form->addText('foo', 'Foo');
         $form->addText('bar', 'Bar')->setRequired();
-        $form->onSuccess[] = function (Form $form, ArrayHash $values) {
+        $form->onSuccess[] = function (Form $form, MyFormFactoryFormData $values) {
             // do something
         }
     }
 }

JsonDecodeEncodeToNetteUtilsJsonDecodeEncodeRector

Changes json_encode()/json_decode() to safer and more verbose Nette\Utils\Json::encode()/decode() calls

 class SomeClass
 {
     public function decodeJson(string $jsonString)
     {
-        $stdClass = json_decode($jsonString);
+        $stdClass = \Nette\Utils\Json::decode($jsonString);

-        $array = json_decode($jsonString, true);
-        $array = json_decode($jsonString, false);
+        $array = \Nette\Utils\Json::decode($jsonString, \Nette\Utils\Json::FORCE_ARRAY);
+        $array = \Nette\Utils\Json::decode($jsonString);
     }

     public function encodeJson(array $data)
     {
-        $jsonString = json_encode($data);
+        $jsonString = \Nette\Utils\Json::encode($data);

-        $prettyJsonString = json_encode($data, JSON_PRETTY_PRINT);
+        $prettyJsonString = \Nette\Utils\Json::encode($data, \Nette\Utils\Json::PRETTY);
     }
 }

LatteVarTypesBasedOnPresenterTemplateParametersRector

Adds latte {varType}s based on presenter $this->template parameters

 // presenters/SomePresenter.php
 <?php

 use Nette\Application\UI\Presenter;

 class SomePresenter extends Presenter
 {
     public function renderDefault(): void
     {
         $this->template->title = 'My title';
         $this->template->count = 123;
     }
 }

 // templates/Some/default.latte
+{varType string $title}
+{varType int $count}
+
 <h1>{$title}</h1>
 <span class="count">{$count}</span>

MagicHtmlCallToAppendAttributeRector

Change magic addClass() etc. calls on Html to explicit methods

 use Nette\Utils\Html;

 final class SomeClass
 {
     public function run()
     {
         $html = Html::el();
-        $html->setClass('first');
+        $html->appendAttribute('class', 'first');
     }
 }

MergeDefaultsInGetConfigCompilerExtensionRector

Change $this->getConfig($defaults) to array_merge

 use Nette\DI\CompilerExtension;

 final class SomeExtension extends CompilerExtension
 {
     private $defaults = [
         'key' => 'value'
     ];

     public function loadConfiguration()
     {
-        $config = $this->getConfig($this->defaults);
+        $config = array_merge($this->defaults, $this->getConfig());
     }
 }

MergeTemplateSetFileToTemplateRenderRector

Change $this->template->setFile() $this->template->render()

 use Nette\Application\UI\Control;

 final class SomeControl extends Control
 {
     public function render()
     {
-        $this->template->setFile(__DIR__ . '/someFile.latte');
-        $this->template->render();
+        $this->template->render(__DIR__ . '/someFile.latte');
     }
 }

MoveInjectToExistingConstructorRector

Move @inject properties to constructor, if there already is one

 final class SomeClass
 {
     /**
      * @var SomeDependency
-     * @inject
      */
-    public $someDependency;
+    private $someDependency;

     /**
      * @var OtherDependency
      */
     private $otherDependency;

-    public function __construct(OtherDependency $otherDependency)
+    public function __construct(OtherDependency $otherDependency, SomeDependency $someDependency)
     {
         $this->otherDependency = $otherDependency;
+        $this->someDependency = $someDependency;
     }
 }

NetteInjectToConstructorInjectionRector

Turns properties with @inject to private properties and constructor injection

 /**
  * @var SomeService
- * @inject
  */
-public $someService;
+private $someService;
+
+public function __construct(SomeService $someService)
+{
+    $this->someService = $someService;
+}

PregFunctionToNetteUtilsStringsRector

Use Nette\Utils\Strings over bare preg_split() and preg_replace() functions

+use Nette\Utils\Strings;
+
 class SomeClass
 {
     public function run()
     {
         $content = 'Hi my name is Tom';
-        $splitted = preg_split('#Hi#', $content);
+        $splitted = \Nette\Utils\Strings::split($content, '#Hi#');
     }
 }

PregMatchFunctionToNetteUtilsStringsRector

Use Nette\Utils\Strings over bare preg_match() and preg_match_all() functions

+use Nette\Utils\Strings;
+
 class SomeClass
 {
     public function run()
     {
         $content = 'Hi my name is Tom';
-        preg_match('#Hi#', $content, $matches);
+        $matches = Strings::match($content, '#Hi#');
     }
 }

RemoveParentAndNameFromComponentConstructorRector

Remove $parent and $name in control constructor

 use Nette\Application\UI\Control;

 class SomeControl extends Control
 {
-    public function __construct(IContainer $parent = null, $name = null, int $value)
+    public function __construct(int $value)
     {
-        parent::__construct($parent, $name);
         $this->value = $value;
     }
 }

RenameMethodLatteRector

Renames method calls in LATTE templates

 {varType SomeClass $someClass}

-<div n:foreach="$someClass->oldCall() as $item"></div>
+<div n:foreach="$someClass->newCall() as $item"></div>

ReplaceTimeNumberWithDateTimeConstantRector

Replace time numbers with Nette\Utils\DateTime constants

 final class SomeClass
 {
     public function run()
     {
-        return 86400;
+        return \Nette\Utils\DateTime::DAY;
     }
 }

RequestGetCookieDefaultArgumentToCoalesceRector

Add removed Nette\Http\Request::getCookies() default value as coalesce

 use Nette\Http\Request;

 class SomeClass
 {
     public function run(Request $request)
     {
-        return $request->getCookie('name', 'default');
+        return $request->getCookie('name') ?? 'default';
     }
 }

SetClassWithArgumentToSetFactoryRector

Change setClass with class and arguments to separated methods

 use Nette\DI\ContainerBuilder;

 class SomeClass
 {
     public function run(ContainerBuilder $containerBuilder)
     {
         $containerBuilder->addDefinition('...')
-            ->setClass('SomeClass', [1, 2]);
+            ->setFactory('SomeClass', [1, 2]);
     }
 }

SubstrStrlenFunctionToNetteUtilsStringsRector

Use Nette\Utils\Strings over bare string-functions

 class SomeClass
 {
     public function run()
     {
-        return substr($value, 0, 3);
+        return \Nette\Utils\Strings::substring($value, 0, 3);
     }
 }

TemplateMagicAssignToExplicitVariableArrayRector

Change $this->templates->{magic} to $this->template->render(..., $values) in components

 use Nette\Application\UI\Control;

 class SomeControl extends Control
 {
     public function render()
     {
-        $this->template->param = 'some value';
-        $this->template->render(__DIR__ . '/poll.latte');
+        $this->template->render(__DIR__ . '/poll.latte', ['param' => 'some value']);
     }
 }

TemplateTypeBasedOnPresenterTemplateParametersRector

Creates Template class and adds latte {templateType} based on presenter $this->template parameters

🔧 configure it!

use Rector\Config\RectorConfig;
use RectorNette\Rector\Class_\TemplateTypeBasedOnPresenterTemplateParametersRector;

return static function (RectorConfig $rectorConfig): void {
    $rectorConfig->ruleWithConfiguration(TemplateTypeBasedOnPresenterTemplateParametersRector::class, [
        TemplateTypeBasedOnPresenterTemplateParametersRector::TEMPLATE_CLASS_PARENT => '',
        TemplateTypeBasedOnPresenterTemplateParametersRector::TEMPLATE_CLASS_TRAITS => [],
    ]);
};

 // presenters/SomePresenter.php
 <?php

 use Nette\Application\UI\Presenter;

 class SomePresenter extends Presenter
 {
     public function renderDefault(): void
     {
         $this->template->title = 'My title';
         $this->template->count = 123;
     }
 }

+// presenters/SomeDefaultTemplate.php
+<?php
+
+use Nette\Bridges\ApplicationLatte\Template;
+
+class SomeDefaultTemplate extends Template
+{
+    public string $title;
+    public int $count;
+}
+
 // templates/Some/default.latte
+{templateType SomeDefaultTemplate}
+
 <h1>{$title}</h1>
 <span class="count">{$count}</span>

TranslateClassMethodToVariadicsRector

Change translate() method call 2nd arg to variadic

 use Nette\Localization\ITranslator;

 final class SomeClass implements ITranslator
 {
-    public function translate($message, $count = null)
+    public function translate($message, ... $parameters)
     {
+        $count = $parameters[0] ?? null;
         return [$message, $count];
     }
 }