Yêu cầu Jun 1st, 2018 9:31 a.m. 1236 0 3
  • 1236 0 3
0

url() và route()

Chia sẻ
  • 1236 0 3

Tình hình e thì hay dùng hàm url() khi send request với form hoặc redirect. Nhưng gần đây để ý mọi người hay dùng hơn. Theo e đánh giá thì nên dùng url() hơn vì nó gần với code PHP thuần hơn, dễ đánh giá xem hệ thống hoạt động thế nào. Không biết mọi người thấy sao?

3 CÂU TRẢ LỜI


Đã trả lời Jun 1st, 2018 4:45 p.m.
Đã được chấp nhận
+8

Mình nghĩ nó phụ thuộc vào bạn hay team của bạn khi xây dựng ứng dụng. Trên thực tế có 3 cách chính để generate URL đến một route nào đó sử dụng các helper functions: action(), url()route()

  • action('Controller@method', $parameters): cách này ít được sử dụng do nó phụ thuộc vào tên của controller và tên của phương thức bên trong nó. Nếu thay đổi tên thì việc update khá bất tiện. Và nếu route của bạn chỉ là một closure thì tất nhiên sẽ ko sử dụng cách này được.
  • url($path, $parameters): cách này cũng hay được sử dụng, nó khá đơn giản. Bạn có thể không cần phải đặt tên cho route hay định nghĩa controller (sử dụng route closure chẳng hạn). Tuy nhiên, khi thay đổi route path việc update cũng hơi mệt chút.
  • route($path, $parameters): cách này có lẽ được sử dụng nhiều nhất. Tuy nhiên, bạn phải đặt tên cho các route. Tất nhiên, nếu tên route thay đổi bạn sẽ vẫn phải update, nhưng trên thực tế thường sẽ có chuẩn để đặt tên cho các route nên việc thay đổi chúng là rất ít khi xảy ra. Theo mình việc search-replace theo route name sẽ dễ hơn là search-replace theo route path 😃

Khi muốn generate URL đến một model instance nào đó, thay vì sử dụng các helper functions trên, bạn có thể sử dụng accessor trong Laravel (hoặc có thể sử dụng một phương thức trong model), như thế này chẳng hạn. Sau này thì bạn chỉ cần gọi phương thức hoặc custom attribute thôi.

use Illuminate\Database\Eloquent\Model;

class Lesson extends Model
{
    public function getPathAttribute()
    {
        // constructing path to a given model
    }

    public function path()
    {
        // constructing path to a given model
    }
}

$lesson = Lesson::find(1);
$path = $lesson->path;
$path = $lesson->path();

Mình nghĩ sử dụng cách nào thì nó cũng không ảnh hưởng đến performance đâu. Điều quan trọng là bạn chỉ nên sử dụng một cách thôi, đừng sử dụng mix các cách trên với nhau 😃

Chia sẻ
Đã trả lời Jun 1st, 2018 9:35 a.m.
+3

Giả sử bạn dùng cùng hàm url() cho nhiều hơn 1 form và khi có yêu cầu cần sửa đổi url trong đó web.php thì bạn sẽ mất công tìm đến tất cả các nơi dùng để sửa đổi. Hoặc đơn giản bạn dùng 1 hàm url() thì cũng sẽ cần tìm đến đúng file để cập nhật. Còn khi dùng hàm route() thì bạn chỉ cần sửa ở đúng file web.php và tất cả vị trí sử dụng url ứng với route() đó sẽ được cập nhật

Chia sẻ
Avatar Cao MInh Đức @caominhduc
Jun 1st, 2018 9:40 a.m.

Theo mình thấy việc sửa url là rất ít khi xảy ra. Vì bản chất url là cấu trúc thư mục ( ban đầu là thế ). Thông thường 1 là thêm url hơn là sửa url. Việc dùng route mình cũng thấy có nhiều bất cập với hệ thống lớn khi có quá nhiều route có vai trò tương tự ( như CRUD chẳng hạn ) thì lúc đó để phân biệt sẽ lại phải bổ sung, sửa tên Route cuối cùng tên Route cũng chả khác Url là mấy.

Jun 1st, 2018 9:46 a.m.

Giả sử bạn có route trong file web.php như sau:
Route::post('profile/user', 'ProfileController@store')->name('store-profile')

  • Nếu dùng hàm url() sẽ có dạng url('/profile/user'). Trong trường hợp ở cần sửa route đó thành user/profile thì bạn sẽ phải sửa ở 2 chỗ, 1 là ở file web.php 2 là ở chỗ bạn dùng hàm url().
  • Còn nếu bạn dùng route() thì sẽ chì cần sửa trong file web.php thôi tự động chỗ nào dùng hàm route('store-profile') sẽ được cập nhật
Đã trả lời Jun 1st, 2018 9:38 a.m.
+2

Nếu cái route đấy dùng nhiều thì mình thường sẽ dùng route($name) thay vì url. Lý do là khi mình thay đổi url, giữ nguyên route name thì sẽ không phải sửa các chỗ gọi hàm nữa.

Chia sẻ
Avatar Cao MInh Đức @caominhduc
Jun 1st, 2018 9:43 a.m.

Thế nếu thay đổi route name thì sao? Theo mình thấy vai trò của route name và url tương tự nhau. Nhưng thường url mang tính cố định cao hơn là route name.

Jun 1st, 2018 10:56 a.m.

@caominhduc Hai cái helper này nó có cùng chức năng là lấy ra đường dẫn của một route. Như mình chia sẻ, trường hợp bạn cần phải thay dổi đường dẫn url cho một tính năng nào đó chẳng hạn, thì bạn chỉ cần sử lại duy nhất nơi định nghĩa cái route đó. Việc dùng nó ở rất nhiều nhiều chỗ khác sẽ không phải sửa. Thử nghĩ lục tung đống view lên để sửa lại đường dẫn thì cũng hơi mệt nếu số lượng view nhiều.

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí