Monday, November 7, 2022

Make Laravel slug support utf8 characters

 

First Method:


By looking at Str class (\vendor\laravel\framework\src\Illuminate\Support\Str.php) you see:

//$title = static::ascii($title);   // COMMENT THIS LINE
public static function slug($title, $separator = '-')
{
  //$title = static::ascii($title);   // COMMENT THIS LINE

  // Convert all dashes/underscores into separator
  $flip = $separator == '-' ? '_' : '-';
  $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);

  // Remove all characters that are not the separator, letters, numbers, or whitespace.
  $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title));

  // Replace all separator characters and whitespace by a single separator
  $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);

  return trim($title, $separator);
}

Second Method :

If you ever wanted to use Laravel Str:slug() method, you might notice it only supports Latin characters. By looking at Str class (\vendor\laravel\framework\src\Illuminate\Support\Str.php) you see:

public static function slug($title, $separator = '-')
{
  $title = static::ascii($title);

  // Convert all dashes/underscores into separator
  $flip = $separator == '-' ? '_' : '-';
  $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);

  // Remove all characters that are not the separator, letters, numbers, or whitespace.
  $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title));

  // Replace all separator characters and whitespace by a single separator
  $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);

  return trim($title, $separator);
}

At the very first line, the string converted to ANSI. That's why you cannot use utf8 characters on return. You can comment the line out and see the result. But editing the Laravel source is not the best solution

To change slug method functionality it's best to extend or override this method. For doing so, first create a file name app/macros.php , then copy/paste the main slug method into this file and convert it to a closure method:

Str::macro('slug_utf8', function($title, $separator = '-')
{
    //$title = static::ascii($title); //comment it out to suport farsi

    // Convert all dashes/underscores into separator
    $flip = $separator == '-' ? '_' : '-';

    $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);

    // Remove all characters that are not the separator, letters, numbers, or whitespace.
    $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title));

    // Replace all separator characters and whitespace by a single separator
    $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);

    return trim($title, $separator);

});

Before this method be used in your application, you should add this macro.php file at the app/start/global.php, open this file and at the end of the file, add this line of code:

require app_path().'/macros.php';

Now you have a new slug_utf8 method that can be used in your applications:

$slug = Str::slug_utf8($value);

Saturday, May 7, 2022

In Laravel 5, What's the difference between {{url}} and {{asset}}?

Consider the type of URL that is needed / how the URL is being used. One of the advantages of having separate helper methods for each type of URL is they can have different handling logic. For example, assets (e.g. CSS, images, etc.) could involve a check that the file exists in the file system but do not require the type of analysis that a route would because the route may have parameters.


url() Generates an absolute URL to the given path (code)

Use for static URLs (which should be rare).

Accepts array of parameters that are encoded and added to the end of the domain.

Preserves any URL query string.


{{ url('search') }}

// http://www.example.com/search


{{ url('search', ['qevo', 'laravel']) }}

// http://www.example.com/search/qevo/laravel


asset() Generates a URL to an application asset (code)

Use for files that are directly served such as CSS, images, javascript.

Only accepts a direct path.


{{ asset('css/app.css') }}

// http://www.example.com/css/app.css

route() Gets the URL to a named route (code)

Use for every route (every route should be named to help future-proof path changes).

Requires named routes.

Accepts associative array for route parameters.

Allows override for relative route vs. absolute route (default).


{{ route('user.profile', ['name'=>'qevo']) }}

// http://www.example.com/user/qevo/profile


{{ route('user.profile', ['name'=>'qevo'], false) }}

// /user/qevo/profile

Laravel Pagination is showing weird arrows

 

Bootstrap Pagination is showing weird arrows

Here is official document that talk about it. You can check it





Inside AppServiceProvider

use Illuminate\Pagination\Paginator;
public function boot()
{
    Paginator::useBootstrap();
}





















Doc: 

https://laravel.com/docs/8.x/pagination#using-bootstrap


GitHub repository using Git Bash command

  To add a project to a GitHub repository using Git Bash command line, you can follow these steps: Create a new repository on GitHub by logg...