Laravel CRUD & Vue3 : Áp dụng Repository Pattern vào ứng dụng
- Tram Ho
Ở bài trước, chúng ta đã làm một ứng dụng Laravel CRUD với VUE3 rồi, bây giờ chúng ta sẽ tối ưu hoá code lại và làm nó trông giống như code lúc thực hiện dự án thật hơn nhé. Ở bài này chưa ta sẽ tìm áp dụng Repository design pattern vào.
Nếu các bạn chưa xem bài CRUD trước đó thì hãy xem ở đây nhé :
- Link : https://b29.vn/bai-viet/laravel-crud-va-vuejs-3-composition-api?id=42
- Git : https://github.com/nguyenthuong1304/crud_vue3
Repository design pattern là gì ?
Repository Design Pattern là một trong những mẫu thiết kế được sử dụng nhiều nhất trong hầu hết các ngôn ngữ lập trình, các framework… như .NET, Java, PHP…, trải dài từ websites, services, applications,… hay kể cả mobile apps.
Chính xác nó là một lớp trung gian giữa Business Logic và Data Source, các đối tượng trong lớp trung gian này được gọi là Repository. Giao tiếp giữa Business logic và Data source sẽ được thực hiện thông qua các Interface.
Repository pattern trong Laravel
Thay vì code của bạn viết một mớ query trong controller, thì thay vào đó, bạn hãy viết vào một class riêng để thực hiện việc đó. Class này đóng vài trò giao tiếp giữa Model và Controller là nơi tập trung xử lí các logic truy vấn dữ liệu nó được gọi là Class Repository.
Vì đây là project DEMO nên tầng bussines logic mình sẽ viết ở Controller luôn, chứ thực chất nó sẽ thông qua một tầng nữa, được gọi là Service, lúc này Controller sẽ gọi các class Service để xử lí logic, và bên trong Service
sẽ gọi đến Repository
và thao tác với DB.
Khá phức tạp phải không ? đó là nhược điểm của Repository, cho nên nhiều dự án họ sẽ không cần sử dụng, và các class Service
sẽ đảm nhiệm nốt.
OK lang mang nãy giờ đủ rồi, tới công chiện thôi =))
2. Triển khai
Ở bài trước chúng ta đã có Model Company
rồi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Models</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Database<span class="token punctuation">\</span>Eloquent<span class="token punctuation">\</span>Factories<span class="token punctuation">\</span>HasFactory</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Database<span class="token punctuation">\</span>Eloquent<span class="token punctuation">\</span>Model</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Company</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">HasFactory</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$fillable</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'email'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'address'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'website'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span> |
Ở controller, mình sẽ tiếng hành viết lại function index này nhé :
1 2 3 4 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name static-context">CompanyResource</span><span class="token operator">::</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token class-name static-context">Company</span><span class="token operator">::</span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
1. Tạo repository
Tiếp theo, chúng ta sẽ repository, thì vị trí đặt ở đây mình để nó nằm trong thư mục app/
:
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 | <span class="token comment">// app/Repositories/CompanyRepository.php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Repositories</span><span class="token punctuation">;</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Repositories</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Models<span class="token punctuation">\</span>Company</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Carbon<span class="token punctuation">\</span>Carbon</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Database<span class="token punctuation">\</span>Eloquent<span class="token punctuation">\</span>Collection</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">CompanyRepository</span> <span class="token punctuation">{</span> <span class="token comment">/** * Get List * * @param array $params * @return Collection */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getList</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$params</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$createdRange</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'created_from'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token class-name static-context">Carbon</span><span class="token operator">::</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'created_from'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token class-name static-context">Carbon</span><span class="token operator">::</span><span class="token function">minValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'created_to'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token class-name static-context">Carbon</span><span class="token operator">::</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'created_to'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token class-name static-context">Carbon</span><span class="token operator">::</span><span class="token function">maxValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token class-name static-context">Company</span><span class="token operator">::</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'*'</span><span class="token punctuation">)</span> <span class="token comment">// ->join(...)</span> <span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$q</span><span class="token punctuation">)</span> <span class="token keyword">use</span> <span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">,</span> <span class="token variable">$createdRange</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$q</span><span class="token operator">-></span><span class="token function">when</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">fn</span> <span class="token punctuation">(</span><span class="token variable">$sq</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token variable">$sq</span><span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'LIKE'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'%'</span> <span class="token operator">.</span> <span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'%'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">when</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">fn</span> <span class="token punctuation">(</span><span class="token variable">$sq</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token variable">$sq</span><span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'LIKE'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'%'</span> <span class="token operator">.</span> <span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'%'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">when</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'address'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">fn</span> <span class="token punctuation">(</span><span class="token variable">$sq</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token variable">$sq</span><span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'address'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'LIKE'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'%'</span> <span class="token operator">.</span> <span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'address'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'%'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">when</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'website'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">fn</span> <span class="token punctuation">(</span><span class="token variable">$sq</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token variable">$sq</span><span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'website'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'LIKE'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'%'</span> <span class="token operator">.</span> <span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'website'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'%'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">whereBetween</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'created_at'</span><span class="token punctuation">,</span> <span class="token variable">$createdRange</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">orderBy</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Ở đây chúng ta sẽ tạo ra một hàm getList chịu trách nhiệm cho việc truy vấn dữ liệu cho index, bên trên là mình đang Ví dụ nhỏ, nhở sau này các bạn làm dự án, các câu query list đến tận cả trăm dòng mà bỏ vô Controller
chắc hoa mắt :v
2. Thêm Request search
Chúng ta sẽ thêm 1 Request search để dễ control các query mà dưới client đẩy lên nhé :
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 | // app/Http/Requests/Company/SearchRequest.php <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Requests<span class="token punctuation">\</span>Company</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>FormRequest</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">SearchRequest</span> <span class="token keyword">extends</span> <span class="token class-name">FormRequest</span> <span class="token punctuation">{</span> <span class="token comment">/** * Get the validation rules that apply to the request. * * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">rules</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'name'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'nullable'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'email'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'nullable'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'address'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'nullable'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'website'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'nullable'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'created_from'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'nullable|date'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'created_to'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'nullable|date'</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
3. Áp dụng vào controller
OK, vậy giờ bạn chỉ cần gọi nó repository vào construct của controller để sử dụng mà thôi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token operator">...</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Requests<span class="token punctuation">\</span>Company<span class="token punctuation">\</span>SearchRequest</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Repositories<span class="token punctuation">\</span>CompanyRepository</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">CompanyController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword">private</span> <span class="token class-name type-declaration">CompanyRepository</span> <span class="token variable">$companyRepository</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token comment">/** * Display a listing of the resource. * * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">index</span><span class="token punctuation">(</span><span class="token class-name type-declaration">SearchRequest</span> <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$companies</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">companyRepository</span><span class="token operator">-></span><span class="token function">getList</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-></span><span class="token function">validated</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token class-name static-context">CompanyResource</span><span class="token operator">::</span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token variable">$companies</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">...</span> |
4. Thêm khung search vào Company List
OK Tiếp theo, các bạn vào resources/js/components/companies/CompanyIndex.vue
để thêm phần search vào :
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | <div class="flex place-content-end mb-4"> <div class="px-4 py-2 text-white bg-indigo-600 hover:bg-indigo-700 cursor-pointer"> <router-link :to="{ name: 'companies.create' }" class="text-sm font-medium">Create company</router-link> </div> </div> <div class="flex place-content-end mb-4"> <div class="flex-1 py-1 px-2"> <input type="text" name="name" id="name" placeholder="Search company name" class="block mt-1 w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" v-model="params.name" > </div> <div class="flex-1 py-1 px-2"> <input type="text" name="email" id="email" placeholder="Search company email" class="block mt-1 w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" v-model="params.email" > </div> <div class="flex-1 py-1 px-2"> <input type="text" name="address" id="address" placeholder="Search company address" class="block mt-1 w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" v-model="params.address" > </div> <div class="flex-1 py-1 px-2"> <input type="text" name="website" id="website" placeholder="Search company website" class="block mt-1 w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" v-model="params.website" > </div> <div class="py-1 px-2"> <button type="button" name="email" id="search" class="bg-purple-500 text-white active:bg-purple-600 font-bold uppercase text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none ease-linear transition-all duration-150" @click.prevent="search" > Search </button> </div> </div> <div class="flex mb-4"> <div class="py-1 px-2"> <input type="date" name="f" id="from" placeholder="Search company website" class="block mt-1 w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" v-model="params.created_from" > </div> <div class="py-1 px-2"> <input type="date" name="website" id="to" placeholder="Search company website" class="block mt-1 w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" v-model="params.created_to" > </div> </div> |
Và cũng thêm function search vào setUp()
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 | <span class="token operator"><</span>script<span class="token operator">></span> <span class="token keyword">import</span> useCompanies <span class="token keyword">from</span> <span class="token string">"../../composables/companies"</span><span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> onMounted<span class="token punctuation">,</span> reactive <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"vue"</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">"CompanyIndex"</span><span class="token punctuation">,</span> <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> companies<span class="token punctuation">,</span> getCompanies<span class="token punctuation">,</span> destroyCompany <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">useCompanies</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// thêm reactive cho params search</span> <span class="token keyword">const</span> params <span class="token operator">=</span> <span class="token function">reactive</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token string">'name'</span><span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token string">'email'</span><span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token string">'address'</span><span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token string">'website'</span><span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token string">'created_from'</span><span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token string">'created_to'</span><span class="token operator">:</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token function">onMounted</span><span class="token punctuation">(</span>getCompanies<span class="token punctuation">)</span> <span class="token operator">...</span> <span class="token comment">// thêm method để search</span> <span class="token keyword">const</span> <span class="token function-variable function">search</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">await</span> <span class="token function">getCompanies</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token operator">...</span>params <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> companies<span class="token punctuation">,</span> search<span class="token punctuation">,</span> params <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> |
Và cũng add thêm params vào method getCompanies()
nữa
1 2 3 4 5 6 7 8 9 | <span class="token comment">// resources/js/composables/companies.js</span> <span class="token keyword">const</span> <span class="token function-variable function">getCompanies</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token parameter">params <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span> <span class="token keyword">let</span> response <span class="token operator">=</span> <span class="token keyword">await</span> axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/api/companies'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> params <span class="token punctuation">}</span><span class="token punctuation">)</span> companies<span class="token punctuation">.</span>value <span class="token operator">=</span> response<span class="token punctuation">.</span>data<span class="token punctuation">.</span>data<span class="token punctuation">;</span> <span class="token punctuation">}</span> |
OK lên hình
Repository Interface
Khi join vào các dự án lớn có sử dụng repository, thì người ta sẽ thường dùng interface
. Việc áp dụng interface để đảm bảo code chuẩn theo thiết kế cũng như dễ dàng thay đổi, maintain dễ dàng là điều cần thiết.
Đầu tiên các bạn tạo một interface CompanyRepositoryInterface
:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Repositories</span><span class="token punctuation">;</span> <span class="token keyword">interface</span> <span class="token class-name-definition class-name">CompanyRepositoryInterface</span> <span class="token punctuation">{</span> <span class="token comment">/** * Get all * @return mixed */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">...</span> </span> |
Sau đó tại CompanyRepository implement inteface nay:
1 2 | class CompanyRepository implements CompanyRepositoryInterface |
Và tại controller, chúng ta inject Interface thay vì CompanyRepository
1 2 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword">private</span> <span class="token class-name type-declaration">CompanyRepositoryInterface</span> <span class="token variable">$companyRepository</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
Ở đây, khi bạn chạy sẽ nhận đc lỗi :Các interface chỉ hoạt động thông qua các implementation. Khi inject class, thì container sẽ tự động resolved còn đối với interface bạn cần phải binding cho nó vào container nữa :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Providers</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Repositories<span class="token punctuation">\</span>CompanyRepository</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Repositories<span class="token punctuation">\</span>CompanyRepositoryInterface</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>ServiceProvider</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">AppServiceProvider</span> <span class="token keyword">extends</span> <span class="token class-name">ServiceProvider</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token variable">$singletons</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token class-name static-context">CompanyRepositoryInterface</span><span class="token operator">::</span><span class="token keyword">class</span> <span class="token operator">=></span> <span class="token class-name static-context">CompanyRepository</span><span class="token operator">::</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span> |
OK, nây giờ chạy lại, ngon lành cành đào.
Kết
Qua bài viết này, mình hi vọng bạn sẽ hiểu được hơn phần nào đó về Repository của laravel. Cảm ơn các bạn đã ủng hộ mình, hi vọng chúng ta cũng sẽ gặp lại trong những bài kế tiếp .
Repository : https://github.com/nguyenthuong1304/crud_vue3
Tham khảo : https://b29.vn/bai-viet/laravel-crud-vue3-ap-dung-repository-pattern-vao-ung-dung?id=43