Nguồn: http://laraveldaily.com/
Tip 26 Tham số câu lệnh artisan.
Trong quá trình tạo mới một lệnh câu lệnh với artisan, bạn có thể yêu câu input bằng một số cách như $this->confirm(), $this->anticipate(), $this->choice()
Code ví dụ sẽ như sau
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment">// Yes or no?</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">confirm</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Do you wish to continue?'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment">// Open question with auto-complete options</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">anticipate</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'What is your name?'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'Taylor'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Dayle'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// One of the listed options with default index</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">choice</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'What is your name?'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'Taylor'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Dayle'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$defaultIndex</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Tip 27 Xem trước mailables.
Nếu bạn sử dụng Mailables để gửi email, bạn có thể xem trước kết quả mà không phải gửi mail đi, mà có thể nhận dạng trên brosser,
1 2 3 4 5 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/mailable'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$invoice</span> <span class="token operator">=</span> App<span class="token package">Invoice</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">AppMailInvoicePaid</span><span class="token punctuation">(</span><span class="token variable">$invoice</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> |
Tip 28 Route::view(), đừng tạo Controller.
Nếu trong function Controller của bạn, chỉ trả về view, thì có thể không sử dụng controller.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token comment">// Instead of this</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'about'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'<a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// And this</span> <span class="token keyword">class</span> <span class="token class-name">TextsController</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">about</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 function">view</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'texts.about'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Do this</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">view</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'about'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'texts.about'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Thực tế thì trong dự án, tất cả phải viết vào controller, vì hiện tại, có thể chỉ trả về view, tuy nhiên, nếu thêm một số xử lý logic, như thêm policy, thì lại mất công viết vào controller.
Tip 29 Blade @auth
Thay vì việc sử dụng cấu trúc if để check điều kiện user đã login hay chưa, ở blade có thể sử dụng directive @auth
Cách viết thông thường
1 2 3 4 | @<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// The user is authenticated.</span> @<span class="token keyword">endif</span> |
Cách viết ngắn hơn
1 2 3 4 | @auth <span class="token comment">// The user is authenticated.</span> @endauth |
Ngoài ra cũng có @guest directive, phần cho riêng user chưa login
1 2 3 4 | @guest <span class="token comment">// The user is not authenticated.</span> @endguest |
Tip 30 Model all: columns
Trong khi sử dụng ::all của Model, chúng ta có thể sử chỉ định cột nào được lấy ra
1 2 3 | $users = User::all(); // normal case $users = User::all(['id', 'name', 'email']); |
Chú ý: típ này cũng được sử dụng với function get() của Eloquent Model
Tip 31 Localhost trong .env
Đừng quên đổi biến APP_URL trong file .env từ http://localhost thành URL thật sự. Nó là nguyên nhân chính dẫn đến một số lỗi của các trường hợp đường dẫn không hợp lệ.
1 2 3 4 5 6 | <span class="token constant">APP_NAME</span><span class="token operator">=</span>Laravel <span class="token constant">APP_ENV</span><span class="token operator">=</span>local <span class="token constant">APP_KEY</span><span class="token operator">=</span>base64<span class="token punctuation">:</span><span class="token number">9</span>PHz3TL5C4YrdV6Gg<span class="token operator">/</span>Xkkmx9btaE93j7rQTUZWm2MqU<span class="token operator">=</span> <span class="token constant">APP_DEBUG</span><span class="token operator">=</span><span class="token boolean constant">true</span> <span class="token constant">APP_URL</span><span class="token operator">=</span> http<span class="token punctuation">:</span><span class="token comment">//localhost</span> |
Tip 32 Có gì đằng sau các routes ?
Nếu bạn muốn biết các xử lý đừng sau các routes, và thực sự muốn hiểu cơ chế thực hiện đằng sau các dòng lệnh routes cơ bản. Ví dụ như đằng sau Auth::routes là gì.
Đối với các phiên bản từ Laravel 7 trở lên thì hãy kiểm tra file /vendor/laravel/ui/src/AuthRouteMethods.php
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 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">auth</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 keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$options</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 comment">// Authentication Routes...</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'login'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Auth<a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'login'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">post</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'login'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Auth<a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">post</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'logout'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Auth<a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'logout'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Registration Routes...</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$options</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'register'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token boolean constant">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'register'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Auth<a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'register'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">post</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'register'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Auth<a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Password Reset Routes...</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$options</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'reset'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token boolean constant">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">resetPassword</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Password Confirmation Routes...</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$options</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'confirm'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token function">class_exists</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prependGroupNamespace</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'AuthConfirmPasswordController'</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">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">confirmPassword</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Email Verification Routes...</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$options</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'verify'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token boolean constant">false</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">emailVerification</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 punctuation">;</span> <span class="token punctuation">}</span> |
Ở các phiên bản thấp hơn Laravel 7.0 có thể kiểm tra ở file /vendor/laravel/framework/src/illuminate/Routing/Router.php
Tip 33 To Fail
Cùng với phương thức findOrFail(), Eloquent cũng cung cấp phương thức firstOrFail(), sẽ trả về record đầu tiên thỏa mãn điều kiện, hoặc trả về trang 404 nếu không có bản ghi nào thỏa mãn.
Điểm khác biệt giữa chúng là trong khi findOrFail yêu cầu tham số là id, thì firstOrFail() thường được sử dụng trong các câu query
1 2 3 | <span class="token variable">$user</span> <span class="token operator">=</span> User<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">findOrFail</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// trả về user có id = 1 hoặc trang 404 nếu không có bản ghi nào thỏa mãn. </span> <span class="token variable">$user</span> <span class="token operator">=</span> User<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">whereEmail</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'<a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">firstOrFail</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// trả về bản ghi đầu tiên thỏa mãn điều kiện có email là <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> hoặc trả về trang 404 nếu không có bản ghi nào thỏa mãn. </span> |
Tip 34 Thay đổi tên cột
Trong Eloquent Query Builder để thay đổi tên cột trả về, giống SQL có thể sử dụng as.
1 2 3 4 | <span class="token variable">$users</span> <span class="token operator">=</span> <span class="token constant">DB</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">table</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'users'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">select</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'name'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'email as user_email'</span><span class="token punctuation">)</span> <span class="token operator">-</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> |
Tip 35 Ghi log với các tham số.
Có thể sử dụng Log::info với tham số truyền vào để biết rõ hơn chính xác chuyện gì đã xảy ra.
1 2 | Log<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'User failed to login.'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |