1. Preferrably PHP 7.4 instead of PHP 7.3 2. Maximize mo yung pagiging PHP 7.4 like typed properties Instead of: ```php ... protected $id; ``` Gawin mong ```php ... protected string $id; ``` 3. Fix mo yung mga nullable properties Instead na ``` php protected ?Factory $factory; public function __construct(Factory $factory = null) ``` gawin mong: ```php protected ?Factory $factory; public function __construct(?Factory $factory = null) ``` 4. sa may `CustomerMiddleware::findCustomer`, do [happy path](https://en.wikipedia.org/wiki/Happy_path). 5. Instead of using the `EntityManager`: ```php // Foo Service private EntityManagerInterface $entityManger; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } public function findCustomer(int $customerId): Customer { $customerRepository = $this->entityManager->getRepository(Customer::class); $customer = $customerRepository->find($customerId); } ``` Inject the `CustomerRepository` directly. See: http://www.laraveldoctrine.org/docs/1.4/orm/repositories ```php // FooService private CustomerRepositoryInterface $customerRepository; public function __construct(CustomerRepositoryInterface $customerRepository) { $this->customerRepository = $customerRepository; } public function findCustomer(int $customerId): Customer { return $this->customerRepository->find($customerId); } ``` 6. Sa `CustomerImportModel` line 33 ```php ... if ($customer !== null) { $customer->setEmail(Arr::get($row, 'email')); } ... ``` I'm not sure kung magiging `null` parin siya dyan since ni seset mo line 23 ```php ... $customer = ($customer ?? new Customer()) ``` 7. Sa router, alam ko instead of grouping with the namespace, pwede mong directly yung class na parang, instead of: ```php $router->get('customers', [ 'uses' => 'CustomerController@show' ... ]); ``` Pwede atang ganito na: ```php $router->get('customers', [ 'uses' => [CustomerController::class, 'show'], ... ]); ``` 8. Yung `ImporterManager` mo itest mo mabuti, baka magka side effect ka sa line 41 ``` ... 40 return new JsonDriver( 41 $this->config->get('customer')[$this->getDefaultDriver()], 42 $this->factory->baseUrl($this->config->get('customer.json.url'))->asForm() 43 ); ``` kapag nagbago yung default driver. 9. Parang wala masyadong flexibility yung `JsonDriver::generateQueryParams`, kasi you have `$options` argument pero `$options['count']` lang naman pala yung mababago, the rest hindi. 10. Yung `CustomerImportModel`, masyadong tali ata sa `randomuser.me`, if pwede mong maidefine din sa driver much better, medyo tricky. 11. Yung `tests` mo gawin mong PSR-4 compliance, yung with Namespace 12. Yung mga test cases mo, be consistent sa pag gamit ng methods, instead of: ```php ... public function test_if_can_paginate(): void ``` Gawin mong: ```php= ... public function testIfCanPaginate(): void ``` 13. Yung test mo sa `CustomerTest::test_if_can_query_results`, parang walang sense sya, yeah 200 status pero hindi na veverify kung tama ba yung order talaga. Add ka din ng mga query params na mali like `?order=FOO` ```php= ... $this->get('customers/?order=ASC'); ... $data = Collection::make($this->response->json('data')); $ids = $data->pluck('id'); self::assertSame([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], $ids->toArray()); $this->get('customers/?order=DESC'); $this->assertResponseOk(); $data = Collection::make($this->response->json('data')); $ids = $data->pluck('id'); self::assertSame([10, 9, 8, 7, 6, 5, 4, 3, 2, 1], $ids->toArray()); ``` 15. Same goes sa `CustomerTest::test_if_can_paginate`, how are sure na page 2 nga talaga yung lumabas 16. Add ka `@mixin` PHPDocs sa mga JsonResource 17. Parang maling class yung nainject mo sa `CustomerImportTest` line 63 --- 18. `CustomerImporterTest::testIfCanCreateCustomerFromEntity` kahit wala na ito. 19. Pwede mo din maximize pa yung PHP 7.4 na shorthand function Instead of: ```php= $this->callable(function () { return 'hey'; }); ``` Pwedeng: ```php= $this->callable(fn() => 'hey'); ``` 20. Remove mo na yung pagiging nullable ng `Dispatcher` na dependency sa `CustomerImporter`, baka magkaside effect ka kapag walang napasa na `Dispatcher`, if that's the case never matatawag yung `CustomerImportEvent` hence yung pagadvance ng bar hindi narin magagawa