<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ivan Grigorov</title>
    <description>The latest articles on Forem by Ivan Grigorov (@ivangrigorov).</description>
    <link>https://forem.com/ivangrigorov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F753023%2F97378e9f-1e12-45ca-b70f-fd6ffee4acfd.jpeg</url>
      <title>Forem: Ivan Grigorov</title>
      <link>https://forem.com/ivangrigorov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ivangrigorov"/>
    <language>en</language>
    <item>
      <title>PHP Getters and Setters in VS Code</title>
      <dc:creator>Ivan Grigorov</dc:creator>
      <pubDate>Sat, 10 Dec 2022 20:26:30 +0000</pubDate>
      <link>https://forem.com/ivangrigorov/php-getters-and-setters-in-vs-code-423d</link>
      <guid>https://forem.com/ivangrigorov/php-getters-and-setters-in-vs-code-423d</guid>
      <description>&lt;p&gt;Hello I have created a small plugin for every PHP developer that uses VS code.&lt;/p&gt;

&lt;p&gt;This plugin allow you to create multiple getters and setters and/or a constructor. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=IvanGrigorov.php-getters-and-setters" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=IvanGrigorov.php-getters-and-setters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is defferent from the rest ? &lt;/p&gt;

&lt;p&gt;The main difference is that it works with multiple fields in a selection, not having to go and generate the code one by one. It also includes the option to generate constructors without the need of new extension with the already defined fields.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0yd3gtbo5083hut821g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0yd3gtbo5083hut821g.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to try it, give feedback and/or rate it. :)&lt;/p&gt;

</description>
      <category>welcome</category>
      <category>beginners</category>
    </item>
    <item>
      <title>OpenAI Code Helper extension</title>
      <dc:creator>Ivan Grigorov</dc:creator>
      <pubDate>Wed, 07 Dec 2022 21:06:03 +0000</pubDate>
      <link>https://forem.com/ivangrigorov/openai-code-helper-extension-4251</link>
      <guid>https://forem.com/ivangrigorov/openai-code-helper-extension-4251</guid>
      <description>&lt;p&gt;Hello, I am happy to share with you my new extension for VS Code.&lt;/p&gt;

&lt;p&gt;It generates code by query string with the help of OpenAI (&lt;a href="https://openai.com/"&gt;OpenAI&lt;/a&gt;) API. Open AI account is required for an API Key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XJz7SWXk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddjn30fa1eu691i2ddau.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XJz7SWXk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddjn30fa1eu691i2ddau.gif" alt="Image description" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Updates - version 0.1.0&lt;br&gt;
Now you can search on selected text from the context menu&lt;/p&gt;

&lt;p&gt;Feel free to give it a try :)&lt;/p&gt;

</description>
      <category>vscode</category>
    </item>
    <item>
      <title>PHP VMValidator 2.4.2</title>
      <dc:creator>Ivan Grigorov</dc:creator>
      <pubDate>Sat, 11 Jun 2022 20:22:13 +0000</pubDate>
      <link>https://forem.com/ivangrigorov/php-vmvalidator-242-1j63</link>
      <guid>https://forem.com/ivangrigorov/php-vmvalidator-242-1j63</guid>
      <description>&lt;p&gt;🥳🥳 PHP VMValidator 2.4.2 is here 🥳🥳&lt;/p&gt;

&lt;h2&gt;
  
  
  For those who do not know, what is this:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This is simple attribute validation for PHP models and value objects based on the new features, presented in PHP 8&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;With even more improved callback execution after validation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
$successCallable is executed on successful validation

$failureCallable is executed on unsuccessful validation

$forcedCallable is executed on successful AND unsuccessful validation`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I am feeling excited how things are getting shape. &lt;/p&gt;

&lt;p&gt;Currently I am pleased with the progress of it but I still need feedback from all kind of developers junior or experienced. &lt;/p&gt;

&lt;p&gt;Like every successful library, this one also needs to be battle tested and proven. &lt;/p&gt;

&lt;p&gt;I am welcomming all sorts of feedback, recommendations and suggestions.&lt;/p&gt;

&lt;p&gt;Feel free to play, test and work with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ivangrigorov.github.io/VMValidator/"&gt;https://ivangrigorov.github.io/VMValidator/&lt;/a&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>PHP VMValidator 2.3.0</title>
      <dc:creator>Ivan Grigorov</dc:creator>
      <pubDate>Fri, 13 May 2022 21:18:55 +0000</pubDate>
      <link>https://forem.com/ivangrigorov/php-vmvalidator-230-480n</link>
      <guid>https://forem.com/ivangrigorov/php-vmvalidator-230-480n</guid>
      <description>&lt;p&gt;Additions:&lt;/p&gt;

&lt;h2&gt;
  
  
  Callback execution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Callbacks are executed when the validation does not trigger and Exception (based on SEVERITY_LEVEL)&lt;/li&gt;
&lt;li&gt;$forceCallback can be used and has an effect only with EXCEPTION_SEVERITY_LEVEL to force callback after an EXCEPTION trigger&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bug Fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Bug fixes applied for the default OptionsModel&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Test Scenarios
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;New tests for testing the callback functionality are added
Any feedback, recommendations and support are welcome and will be well appreciated :)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://ivangrigorov.github.io/VMValidator/"&gt;https://ivangrigorov.github.io/VMValidator/&lt;/a&gt;&lt;br&gt;
Enjoy.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>Object Validator for PHP 8 V2.2.1 Release</title>
      <dc:creator>Ivan Grigorov</dc:creator>
      <pubDate>Fri, 21 Jan 2022 22:09:14 +0000</pubDate>
      <link>https://forem.com/ivangrigorov/object-validator-for-php-8-v221-release-3mkf</link>
      <guid>https://forem.com/ivangrigorov/object-validator-for-php-8-v221-release-3mkf</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1XiYXF7u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lj1k29yddyhqz1yov7vu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1XiYXF7u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lj1k29yddyhqz1yov7vu.jpg" alt="VMValidator" width="498" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My new vesrion of the validator is out here:&lt;/p&gt;

&lt;h1&gt;
  
  
  Additions:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Severity&lt;br&gt;
Add option to make the failed validation throw NOTICE|WARNING|ERROR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging&lt;br&gt;
Add option to display all validations per class&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Bug Fixes:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Some bug fixes for the or attribute applied&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full documentation and capabilities here: &lt;br&gt;
&lt;a href="https://ivangrigorov.github.io/VMValidator/"&gt;https://ivangrigorov.github.io/VMValidator/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;As always:&lt;br&gt;
Feel free to leave a like, give feedback or star the project :) &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Object Validator for PHP 8 V2.1.0 Release</title>
      <dc:creator>Ivan Grigorov</dc:creator>
      <pubDate>Sat, 01 Jan 2022 17:50:33 +0000</pubDate>
      <link>https://forem.com/ivangrigorov/object-validator-for-php-8-v210-release-3f41</link>
      <guid>https://forem.com/ivangrigorov/object-validator-for-php-8-v210-release-3f41</guid>
      <description>&lt;p&gt;Have you ever tried to validate an object in PHP. Maybe you use Models, ViewModels or RequestModels.Maybe you hate writing if-else, loops and swiches to check your values.Maybe you do not like to use different validators for every framework.&lt;/p&gt;

&lt;p&gt;At least I do.&lt;/p&gt;

&lt;h1&gt;
  
  
  So I present you my general solution using the strengths of PHP 8.Clean, concise and easy.
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lots of validations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supprots also nested object validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeatable validation attributes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Works with private properties and methods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Works with constructor promotion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory and time profiling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom error messages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom property and method names for the exceptions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Collection\UniqueAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\File\FileExtensionAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\File\FileSizeAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Numbers\RangeAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Object\NestedAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Strings\StringContainsAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Enums\ValidationOrderEnum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Options\OptionsModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Validators\MasterValidator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:50)]&lt;/span&gt;
        &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:30)]&lt;/span&gt;
        &lt;span class="kt"&gt;public&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$param&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:30)]&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;propTest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;#[UniqueAttribute()]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'asd'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'asdk'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;#[FileSizeAttribute(fileSizeBiggest: 20, fileSizeLowest: 10)]&lt;/span&gt;
    &lt;span class="c1"&gt;#[FileExtensionAttribute(expected:['php'])]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;#[FileSizeAttribute(fileSizeBiggest: 20, fileSizeLowest: 10)]&lt;/span&gt;
    &lt;span class="c1"&gt;#[FileExtensionAttribute(expected:['php'])]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;#[StringContainsAttribute(needle:"asd")]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"23asd"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:30)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$prop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UpperTest&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;#[NestedAttribute(excludedProperties:['param'])]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;Test&lt;/span&gt; &lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Test&lt;/span&gt; &lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;MasterValidator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UpperTest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OptionsModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderOfValidation&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ValidationOrderEnum&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PROPERTIES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                         &lt;span class="nc"&gt;ValidationOrderEnum&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;METHODS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                         &lt;span class="nc"&gt;ValidationOrderEnum&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CONSTANTS&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
                     &lt;span class="n"&gt;excludedMethods&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'getFile'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
                     &lt;span class="n"&gt;excludedProperties&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'file'&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enjoy. Any feedback, recommendations and support are welcome :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IvanGrigorov/VMValidator"&gt;https://github.com/IvanGrigorov/VMValidator&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Object Validator for PHP 8</title>
      <dc:creator>Ivan Grigorov</dc:creator>
      <pubDate>Sun, 14 Nov 2021 19:27:11 +0000</pubDate>
      <link>https://forem.com/ivangrigorov/object-validator-for-php-8-598g</link>
      <guid>https://forem.com/ivangrigorov/object-validator-for-php-8-598g</guid>
      <description>&lt;p&gt;Have you ever tried to validate an object in PHP. Maybe you use Models, ViewModels or RequestModels.Maybe you hate writing if-else, loops and swiches to check your values.Maybe you do not like to use different validators for every framework.&lt;/p&gt;

&lt;p&gt;At least I do.&lt;/p&gt;

&lt;h1&gt;
  
  
  So I present you my general solution using the strengths of PHP 8.Clean, concise and easy.
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lots of validations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supprots also nested object validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeatable validation attributes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Works with private properties and methods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Works with constructor promotion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory and time profiling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom error messages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom property and method names for the exceptions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Collection\UniqueAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\File\FileExtensionAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\File\FileSizeAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Numbers\RangeAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Object\NestedAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Attributes\PropertyAttributes\Strings\StringContainsAttribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Enums\ValidationOrderEnum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Options\OptionsModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RMValidator\Validators\MasterValidator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:50)]&lt;/span&gt;
        &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:30)]&lt;/span&gt;
        &lt;span class="kt"&gt;public&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$param&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:30)]&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;propTest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;#[UniqueAttribute()]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'asd'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'asdk'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;#[FileSizeAttribute(fileSizeBiggest: 20, fileSizeLowest: 10)]&lt;/span&gt;
    &lt;span class="c1"&gt;#[FileExtensionAttribute(expected:['php'])]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;#[FileSizeAttribute(fileSizeBiggest: 20, fileSizeLowest: 10)]&lt;/span&gt;
    &lt;span class="c1"&gt;#[FileExtensionAttribute(expected:['php'])]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;#[StringContainsAttribute(needle:"asd")]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"23asd"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;#[RangeAttribute(from:10, to:30)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$prop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UpperTest&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;#[NestedAttribute(excludedProperties:['param'])]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;Test&lt;/span&gt; &lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Test&lt;/span&gt; &lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;MasterValidator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UpperTest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$test&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OptionsModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderOfValidation&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;ValidationOrderEnum&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PROPERTIES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                         &lt;span class="nc"&gt;ValidationOrderEnum&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;METHODS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                         &lt;span class="nc"&gt;ValidationOrderEnum&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CONSTANTS&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
                     &lt;span class="n"&gt;excludedMethods&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'getFile'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
                     &lt;span class="n"&gt;excludedProperties&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'file'&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enjoy. Any feedback, recommendations and support are welcome :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IvanGrigorov/VMValidator"&gt;https://github.com/IvanGrigorov/VMValidator&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>php</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
