# How much?

$40-$50

per hour

It will depend on the project.

# What do I get?

You get what is mentioned below + me for a couple of hours 😄

# Best practices

Usage of best practices accordingly. The code below is a REST action, for that function I am using the repository pattern.

# Design patterns

I have a complete course on Design Patterns with PHP and you can find the source code for the course here.

# 5 years of Laravel experience

Documentation is not enough, I have spent time reading Laravel's source code on GitHub to understand the internals much better!

# I have created my own framework

Not only I know how to use Laravel effectively, but I have created a framework similar to Laravel with a tons of features. Check it here and on Github, TeaCore framework.

For that framework, I have also created a course, a step by step guide! THERE IS NOTHING ON THE INTERNET LIKE IT!

# 4 years of VueJS/NuxtJS experience

I use VueJS and NuxtJS according to the requirements.

# Comments

All functions have comments so me and other developers know exactly what is going on with that function.

# Readable code

I keep my functions small, around 5-15 lines. That means that the functions are small enough to read and understand.

# Swagger documentation

Swagger annotations are used to document that function with Swagger.io.

# Tests

@see annotation is used so the developer can immediately jump to the tests of that function.

By using the @see annotation we can also see what is tested for that function.

# Database Transactions

Unfortunately, transactions are something that developers don't use!

# Error handling and logging

Another important step that developers tend to omit. NOT WITH ME!

# Sample code

/**
     * @OA\Post(
     *     path="/api/v1/documents",
     *     description="Create document.",
     *     tags={"Document"},
     *     security={
     *      {"passport": {}},
     *     },
     *      @OA\Parameter(name="text", in="query", description="Text", required=true,
     *         @OA\Schema(type="string")
     *     ),
     *      @OA\Parameter(name="type", in="query", description="Type", required=true,
     *         @OA\Schema(type="string", @OA\Items(
     *                 type="string",
     *                 enum = {"email", "brochure", "flyer", "magazine", "newsletter", "press_release", "marketing_text", "report", "radio_report", "speech", "survey", "something_else"},
     *         ))
     *     ),
     *     @OA\Response(response="201", description="Created"),
     *     @OA\Response(response="422", description="Validation errors"),
     *     @OA\Response(response="500", description="Server error")
     * )
     *
     * Create document.
     *
     * @see DocumentControllerTest::will_fail_with_validation_errors_when_creating_document()
     * @see DocumentControllerTest::will_create_document()
     *
     * @param DocumentStoreRequest $request
     * @return DocumentResource
     * @throws Error500Exception
     */
    public function store(DocumentStoreRequest $request): DocumentResource
    {
        try {
            $this->beginTransaction();

            $document = $this->documentRepo->create([
                'user_id' => auth()->id(),
                'text' => $request->text,
                'letter_count' => strlen($request->text),
                'type' => $request->type,
                'credits' => Credits::calculate($request->text)
            ]);

            $this->commit();

            return new DocumentResource($document);
        } catch (\Exception $e) {
            $this->rollBack();

            throw new Error500Exception($e);
        }
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Last Updated: 6/17/2020, 11:17:42 PM