+5

[Laravel 5.5] Laravel Helper với đối tượng là object, paths, Strings

Giới thiệu

  • Bài viết lần trước mình có viết về các function có trong helper có sẵn của laravel 5.5 với đối tượng là mảng.
  • Bài viết lần này, mình sẽ tiếp tục giới thiệu về các function helper liên quan đến các đối tượng khác (object, paths, string)
  • Bài viết này là bài viết mình vừa viết, vừa dịch, vừa học tập thêm, để sử dụng dần vào công việc hiện tại. Có khá là nhiều bài viết rất chi tiết và khá tốt, các bạn có thể đọc thêm tại đây.

Objects

  1. data_fill()
  • Chức năng: gán giá trị trong một mảng nhiều chiều, hoặc các object, sử dụng "dot" (dấu '.')
  • Theo mình hiểu, hàm này sẽ gán các giá trị chưa có, với các key chưa được gán giá trị, thì dùng hàm này được. Với những key đã có giá trị thì không set lại giá trị cho key đó được.
    $data = ['products' => ['desk' => ['price' => 100]]];
    
    // Thử set lại giá trị price 
    data_fill($data, 'products.desk.price', 200);
    // Kết quả nhận được là key price không thay đổi 
    ['products' => ['desk' => ['price' => 100]]]
    // Set một giá trị key khác trong $data
    data_fill($data, 'products.desk.discount', 10);
    ['products' => ['desk' => ['price' => 100, 'discount' => 10]]]
    
  • data_fill() cũng cho phép việc gán các giá trị mới theo diện rộng, sử dụng dấu * , nó cũng phần nào có ý nghĩa tương tự như dấu * trong linux.
    $data = [
        'products' => [
            ['name' => 'Desk 1', 'price' => 100],
            ['name' => 'Desk 2'],
        ],
    ];
    
    data_fill($data, 'products.*.price', 200);
    
    /*
        [
            'products' => [
                ['name' => 'Desk 1', 'price' => 100],
                ['name' => 'Desk 2', 'price' => 200],
            ],
        ]
    */
    
  1. data_get()
  • Chức năng: Lấy giá trị từ một mảng nhiều chiều (có thể gọi là mảng đa chiều, mảng lồng mảng, nguyên gốc của từ nested array, nhưng mình hiểu là mảng đa chiều, không biết có đúng hay không), hoặc object, sử dụng kí hiệu "dot" (dấu chấm ) .
    $data = ['products' => ['desk' => ['price' => 100]]];
    
    $price = data_get($data, 'products.desk.price');
    
    // 100
    
  • data_get() cũng cho phép ta gán giá trị mặc định trong trowngf hợp khong có giá trị nào được trả về hoặc key truyền vào không tồn tại.
    $discount = data_get($data, 'products.desk.discount', 0);
    
    // 0
    
  1. data_set()
  • Chức năng: Gán giá trị , một giá trị trong một nested array hoặc object sử dụng ký hiệu "dot".
  • Nó khác với data_fill() ở chỗ, data_fill() chỉ điền những giá trị còn trống trong object, nested array, các key đã gán giá trị thì không thể thay đổi được, còn với set thì đặt lại giá trị của một key, bất kể là nó được set trước đó hay chưa.
    $data = ['products' => ['desk' => ['price' => 100]]];
    
    data_fill($data, 'products.desk.price', 200);
     ['products' => ['desk' => ['price' => 100]]]
    // Không thay đổi được giá trị 
    
    data_set($data, 'products.desk.price', 200);
    
    // ['products' => ['desk' => ['price' => 200]]]
    // Thay đổi được giá trị
    
  • Giống như data_fill(), data_set() cho phép dùng dấu * để gán giá trị cho một key ở diện rộng.
        $data = [
            'products' => [
                ['name' => 'Desk 1', 'price' => 100],
                ['name' => 'Desk 2', 'price' => 150],
            ],
        ];
    
    data_set($data, 'products.*.price', 200);
    
    /*
        [
            'products' => [
                ['name' => 'Desk 1', 'price' => 200],
                ['name' => 'Desk 2', 'price' => 200],
            ],
        ]
    */
    
  • Trong trường hợp, nếu không muốn ghi đè lên giá trị mà key đã tồn tại trước đó, data_set() cũng có cơ chế giúp làm việc này với tham số thứ ba là false.
    $data = ['products' => ['desk' => ['price' => 100]]];
    
    data_set($data, 'products.desk.price', 200, false);
    
    // ['products' => ['desk' => ['price' => 100]]]
    

Paths

  1. app_path()
    • app_path() trả về đường dẫn đầy đủ đến thư mục app. Có thể sử dụng app_path để tạo ra những đường dẫn đến các file trong thư mục app.
    $path = app_path();
    // /home/tran.van.nhat/workspaces/demo-app/app"
    $path = app_path('Http/Controllers/Controller.php');
    // /home/tran.van.nhat/workspaces/demo-app/app/Http/Controllers/Controller.php
    
  2. base_path()
    • base_path trả về đường dẫn đầy đủ đến thư mục root của project. Tương tự, chúng ta có thể sử dụng base_path để tạo ra những đường dẫn đến các thư mục hoặc các file trong project
    $path = base_path()
    // home/tran.van.nhat/workspaces/demo-app/
    $path = base_path('vendor/bin');
    // home/tran.van.nhat/workspaces/demo-app/vendor/bin/
    
  3. config_path()
    • config_path() trả về đường dẫn đầy đủ của thư mục config. Tương tự cũng sử dụng để tạo ra các thư mục và file con trong thư mục config. (tương tự hai hàm trên nhưng khác thư mục, nên từ giờ đến cuối mình sẽ không để code ví dụ nữa)
  4. database_path()
    • database_path() trả về đường dẫn đầy đủ của thư mục database
  5. mix()
    • mix() về cơ bản nó cũng trả về đường dẫn, tuy nhiên không phải mục nào cụ thể cả. Mình sẽ viết rõ về mix của laravel sau. Có thể tham khảo trước tại đây (EN version)
  6. public_path()
    • public_path() trả về đường dẫn đầy đủ đến thư mục public
  7. resource_path()
    • resource_path() trả về đường dẫn đầy đủ đến thư mục resources
  8. storage_path()
    • storage_path() trả về đường dẫn đầy đủ đến thư mục storage

Strings

  1. __()
    • __() thực hiện việc đa ngôn ngữ, trả về giá trị của key trong ngôn ngữ tương ứng. Trong trường hợp key không định nghĩa text tương ứng với localization, sẽ trả về giá trị key. Tham khảo thêm về localization (EN version). Mình sẽ viết thêm về phần đa ngôn ngữ này sau.
  2. camel_case()
    • camel_case() trả về string theo định dạng camelCase của string truyền vào.
    camel_case('this is example'); 
    // thisIsExample
    
  3. class_basename()
    • class_basename() trả về tên của class, namespace sẽ được loại bỏ.
    class_basename('Foo\Bar\Baz');
    // Baz 
    
  4. e()
    • e() trả về htmlentities trên một chuỗi
    echo e('<html>foo</html>');
    
    // &lt;html&gt;foo&lt;/html&gt;
    
  5. ends_with()
    • ends_with cho biết nếu một chuỗi kết thúc bằng một chuỗi con hay không
    $result = ends_with('This is my name', 'name');
    
    // true
    
  6. kebab_case()
    • kebab_case() trả về string theo định dang kebab-case
    $converted = kebab_case('fooBar');
    
    // foo-bar
    
  7. preg_replace_array()
    • preg_replace_array thay thế một patterm trong chuỗi bởi một mảng
    $string = 'The event will take place between :start and :end';
    
    $replaced = preg_replace_array('/:[a-z_]+/', ['8:30', '9:00'], $string);
    
    // The event will take place between 8:30 and 9
    
  8. snake_case()
    • snake_case(), trả về string theo định dạng snake_case, nhớ hồi PEP8 quá. 😍
    snake_case('fooBar'); -> foo-bar
    
  9. starts_with()
    • starts_with() tương tự như ends_with(), khác nhau check đầu chuỗi và cuối chuỗi.
  10. str_after()
    • str_after() trả về giá trị còn lại của chuỗi sau chuỗi con
    $slice = str_after('This is my name', 'This is');
    
    // ' my name'
    
  11. str_before()
    • str_before() thì ngược lại với str_after trả về phần còn lại của chuỗi trước chuỗi con.
    • ❓ Nếu tồn tại hai chuỗi con giống nhau trong chuỗi, nó sẽ trả về như thế nào.
    // Trường hợp cơ bản
    $slice = str_before('This is my name', 'my name');
    
    // 'This is '
    // Đáp án cho phần câu hỏi
    $answer = str_before('This is my name and my name', 'my name');
    // 'This is'
    
    • 🐜 vậy là nó sẽ tìm chuỗi đầu tiên phù hợp với chuỗi con truyền vào. Cái này cũng được áp dụng với str_after() nhé các bạn. 🤗
  12. str_contains()
    • str_contains() kiểm tra một chuỗi, hoặc mảng có tồn tại trong chuỗi đầu vào hay không.
    • Chú ý, chuỗi kiểm tra phân biệt chữ Hoa, chữ thường. Khi check mảng có tồn tại trong chuỗi không, thì chỉ cần 1 phần tử của mảng tồn tại trong chuỗi, nó sẽ trả về true, không cần mọi phần tử trong mảng tồn tại trong chuỗi
      str_contains('This is my name', 'my');
      // True
      str_contains('This is my name', 'My');
      // False
      str_contains('This is my name', ['name', 'foo']);
      // True
    
  13. str_finish()
    • str_finish() sẽ thêm một ký tự vào cuối một chuỗi nếu nó chưa tồn tại, và không làm gì cả nếu nó đã tồn tại rồi.
    $test = str_finish('this is a string', '/');
    // 'this is a string/
    $test_more = str_finish('this is a string/', '/');
    // 'this is a string/'
    
  14. str_is()
    • str_is() sẽ kiểm tra xem một chuỗi có khớp với patterm truyền vào hay không. Dấu hoa thị * có thể được sử dụng để phù hợp với mọi ký tự
    $matches = str_is('foo*', 'foobar');
    
    // true
    
    $matches = str_is('baz*', 'foobar');
    
    // false
    
  15. str_limit()
    • str_limit() cắt chuỗi truyền vào theo số lượng ký tự cho sẵn. Chú ý là số lượng ký tự, không phải theo từ, nên dùng hàm này rất hay cắt theo kiểu dở khóc dở cười. Tốt nhất là cắt theo từ.
    $truncated = str_limit('The quick brown fox jumps over the lazy dog', 20);
    
    // The quick brown fox...
    
    • Ký tự mặc định là ..., có thể định nghĩa ký tự này như là một tham số thứ 3 của hàm str_limit()
    $truncated = str_limit('The quick brown fox jumps over the lazy dog', 20, ' (...)');
    
    // The quick brown fox (...)
    
  16. Str::orderedUuid()
    • ❓ Hàm này trong document có ghi là nó sẽ tạo ra một chuỗi uuid theo thời gian thực. Cơ mà mình thử trong terminal nó lại không chạy. Thế mới nhọ. 😆 . Mình sẽ update lại sau.
  17. str_plural()
    • str_plural() sẽ trả về string theo định dạng số nhiều của string được truyền vào. 😍 , hàm này vô cùng hữu ích với những người dốt tiếng anh như mình. Nhưng hiện tại hàm này chỉ hỗ trợ ngôn ngữ là tiếng anh thôi, còn tiếng Việt nó không hỗ trợ. 😆.
        // Test chơi chơi vài cái
        str_plural('catgory');
        //categories
        str_plural('I');
        // IS
        // hoho, cái này không hay rồi, cái này lại thành is , lẽ ra nó nên hiểu là i -> we chứ. Đúng là hỗ trợ thì ta cũng không tin được. 
    
    • Tham số thứ 2 của hàm này chỉ số lượng, số ít, hay số nhiều trong tiếng anh ấy anh em ạ.
    $plural = str_plural('child', 2);
    
    // children
    
    $plural = str_plural('child', 1);
    
    // child
    // Tiếc là mình thử str_plural('I', 2); nó vẫn thành IS . 
    
  18. str_random()
    • str_random() tạo ra một chuỗi random với độ dài được truyền vào. Mà tiện đây, mình xin giới thiệu lại bài random có thật sự ngẫu nhiên của anh Kiên đi nắng, một bài viết rất hay, hấp dẫn.
    str_random(40);
    // "fe5fz78K3OKhOdzycLwNR68JRhcqSs5iS7bFX7mL"
    
  19. str_replace_array()
    • str_replace_array() thay thế string truyền vào bởi giá trị của mảng, lần lượt từng giá trị của mảng sẽ được truyền vào tương ứng với các vị trí của mảng.
    • ❓ Nếu array truyền vào không đủ số vị trí của ký tự trong mảng thì sao?
        // Case cơ bản 
        $string = 'The event will take place between ? and ?';
    
       $replaced = str_replace_array('?', ['8:30', '9:00'], $string);
        // The event will take place between 8:30 and 9:00
        // Case question 
        $replaced = str_replace_array('?', ['8:30'], $string);
        // The event will take place between 8:30 and ?
        // Nó chỉ thay thế đúng cái vị trí lần lượt thôi, còn đâu nó mặc kệ, thừa thiếu cũng không quan tâm, cứ lần lượt nó làm thôi. Vậy nên hàm này với chuỗi đơn giản có thể sử dụng, nếu là đoạn văn hay gì đó phức tạp, khi sử dụng cần lưu ý nhiều hơn.
    
  20. str_replace_first()
    • str_replace_first() sẽ thay thế ở vị trí chuỗi con tìm được đầu tiên trong bằng chuỗi truyền vào.
    $replaced = str_replace_first('the', 'a', 'the quick brown fox jumps over the lazy dog');
    
    // a quick brown fox jumps over the lazy dog
    
  21. str_replace_last()
    • str_replace_last() tương tự như str_replace_first(), nhưng thay vào vị trí đầu tiên, thì nó sẽ thay ở vị trí cuối cùng tìm được chuỗi con trong chuỗi ban đầu. 👊 cái này chẳng buồn test xem có phải không, nên không viết code ví dụ.
  22. str_singular()
    • str_singular() tương tự như str_plural(), nhưng ngược lại, nó convert string truyền vào từ số nhiều thành số ít trong tiếng anh. Và sức mạnh của nó cũng như str_plural() thôi, có hỗ trợ, nhưng không chính xác trong nhiều trường hợp.
  23. str_slug()
    • str_slug() tạo ra một chuỗi URL thân thiện bằng chuỗi truyền vào.
    str_slug('i am a coder');
    //  'i-am-a-coder'
    // Hàm này theo mình test thì nó chưa hỗ trợ với string truyền vào là unicode truyền vào. ví dụ như truyền vào 'Việt Nam, đất nước con người', nó tạo ra một chuỗi trống. Không biết là do môi trường test của mình, hay hàm không hỗ trợ. 
    
  24. str_start()
    • str_start(), ngược với str_finish, cái này thêm ký tự vào đầu của chuỗi.
  25. studly_case()
    • studly_case() định dạng lại chuỗi truyền vào thành StudlyCase
    studly_case('test example');
    // TestExample
    
  26. title_case()
    • title_case() định dạng chuỗi truyền vào thành định dạng Title Case
    title_case('example title');
    // Example Title
    
  27. trans()
    • trans() sử dụng giống __() và thường được sử dụng hơn.
  28. trans_choice()
    • Hàm này mình sẽ tim hiểu thêm, hiện tại, chưa dùng bao giờ. Và chưa thực sự cái sự biến đối mà nó để cập đến trong tài liệu là gì.
  29. Str::uuid()
    • Hàm này cũng tạo ra một chuỗi uuid theo version 4 , tương tự hàm Str::orderedUuid(), hàm này mình không test được.
    • 💁 Với các bạn có sẵn python trong máy (ví dụ đang xài ubuntu nhé), gõ lệnh sau để biết uuid là gì.
    // Bước 1 : Bật terminal lên 
    // Bước 2: Gõ python để vào cửa sổ chạy lệnh của python. Thông thường, nếu chưa có động chạm gì, thì python trên ubuntu là version 2x, python 2, python thường dùng là python 3 rồi. 
    // Bước 3: Khi vào cửa sổ python rồi, gõ  from uuid import uuid4
    // Bước 4: Gõ uuid4() rồi ấn enter, nó sẽ tự tạo ra một chuỗi uiud, tương ứng với thời gian hệ thống hiện thời. Cái này là cái mà hàm Str::orderedUuid() của laravel helper muốn làm, tuy nhiên, thời gian của Str::orderedUuid() nó căn cứ vào thời gian lưu trong database, còn bên python thì nó căn cứ vào thời gian thực của hệ điều hành ubuntu. Mà cái hàm Str::orderedUuid mình chưa test được.

All rights reserved

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í