by Devin Yang
(This article was automatically translated.)

Published - 1 year ago ( Updated - 1 year ago )

I believe that many people are familiar with PHP trait, because Laravel can be seen everywhere,
But I still write it out and share it with those who are destined.

PHP trait allows two different CLASS to use the same method.
It not only reduces the complexity, but also allows the code to be reused.

So it should be very convenient to put a Browser series function on Laravel's ViewServiceProvider 😝

About ViewServiceProvider official documents:

https://laravel.com/docs/9.x/views#view-composers

It is said that Traits can be built and placed casually, so I made a Browser traits in Laravel's /app/Ccc/Traits directory.
Of course, the Namespace is the same as the directory rule, you should see it (the following code example)

Because of the large number of webp image files on this website, I Googled the function of getBrowser
(Sorry, I forgot the source when I found it casually), use it to detect the browser and version,
He had a bug where the $ub variable was undefined, and I fixed it later.

With this function, I can control whether to use webp image files (is_support_webp).
If you haven't read my webp conversion bash article (jpg to webp, and shrink jpg file), you can click the following article to see:
https://www.ccc.tc/article/make-the-web-faster

The other is to get another method, isMobile(). Used to detect whether it is a mobile phone.

The content of trait Browser is as follows: (simplified version)

 

namespace App\Ccc\Traits;

use Illuminate\Support\Facades\Log;

trait Browser
{
public function is_support_webp(){

if (($this->getBrowser()->name == "Google Chrome" && $this->getBrowser()->version >= 107) ||
($this->getBrowser()->name == "Apple Safari" && $this->getBrowser()->version >= 16) ||
($this->getBrowser()->name == "Mozilla Firefox" && $this->getBrowser()->version >= 65)
) {
return true;
} else {
return false;
}
}

public function isMobile() {
return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos) /i", $_SERVER["HTTP_USER_AGENT"]);
}

public function getBrowser()
{
$u_agent = $_SERVER['HTTP_USER_AGENT'];
$bname = 'Unknown';
$platform = 'Unknown';
$version = "";
$ub=""; //Default Value

//First get the platform?
if (preg_match('/linux/i', $u_agent)) {
$platform = 'linux';
} elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
$platform = 'mac';
} elseif (preg_match('/windows|win32/i', $u_agent)) {
$platform = 'windows';
}


// Next get the name of the useragent yes seperately and for good reason
if (preg_match('/MSIE/i', $u_agent) && !preg_match('/Opera/i', $u_agent)) {
$bname = 'Internet Explorer';
$ub = "MSIE";
} elseif (preg_match('/Firefox/i', $u_agent)) {
$bname = 'Mozilla Firefox';
$ub = "Firefox";
} elseif (preg_match('/OPR/i', $u_agent)) {
$bname = 'Opera';
$ub = "Opera";
} elseif (preg_match('/Chrome/i', $u_agent) && !preg_match('/Edge/i', $u_agent)) {
$bname = 'Google Chrome';
$ub = "Chrome";
} elseif (preg_match('/Safari/i', $u_agent) && !preg_match('/Edge/i', $u_agent)) {
$bname = 'Apple Safari';
$ub = "Safari";
} elseif (preg_match('/Netscape/i', $u_agent)) {
$bname = 'Netscape';
$ub = "Netscape";
} elseif (preg_match('/Edge/i', $u_agent)) {
$bname = 'Edge';
$ub = "Edge";
} elseif (preg_match('/Trident/i', $u_agent)) {
$bname = 'Internet Explorer';
$ub = "MSIE";
}

// finally get the correct version number
$known = array('Version', $ub?? "0", 'other');
$pattern = '#(?' . join('|', $known) .
')[/ ]+(?[0-9.|a-zA-Z.]*)#';
if (!preg_match_all($pattern, $u_agent, $matches)) {
// we have no matching number just continue
}
// see how many we have
$i = count($matches['browser']);
if ($i != 1) {
//we will have two since we are not using 'other' argument yet
//see if version is before or after the name
if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) {
$version = $matches['version'][0];
} else {
$version = $matches['version'][1];
}
} else {
$version = $matches['version'][0];
}

// check if we have a number
if ($version == null || $version == "") {
$version = "?";
}

return (object)[
'userAgent' => $u_agent,
'name' => $bname,
'version' => $version,
'platform' => $platform,
'pattern' => $pattern
];
}

 }


With the above traits, I can know whether the user is using the mobile phone to open View or Desktop.

The following is also my simplified version 1. ViewServiceProvider uses App\Ccc\Traits\Browser.

 use App\Ccc\Traits\Browser;


2. Pass the test result to $view

 $view->with([
"is_mobile"=>$this->isMobile()
 ]);


Three, so the complete view of the ViewServiceProvider is roughly as follows.

Create this ViewServiceProvider file with the command:

 php artisan make:provider ViewServiceProvider

In addition, register this Provider in the providers array in config/app.php

 /*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\ViewServiceProvider::class,

 

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\App;
use App\Ccc\Traits\Browser;

class ViewServiceProvider extends ServiceProvider
{
public $locale;
use Browser;
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}

/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
View::composer('*', function ($view) {

$view->with([
"is_mobile"=>$this->isMobile()
]);

});
}
}

The above '*' should be guessed out, which means that all views do not need to be explained.

So any view, of course, includes my livewire components, and it is not a problem to use $is_mobile anywhere. It is very convenient to control whether it is for Mobile or Desktop.

For example: In the Livewire component below, I asked him to use a small phone-specific page for the mobile phone page.

 
{{-- Display the mobile version dedicated page --}} @if ($is_mobile) {{ $contents->links('livewire.mobile-pages') }} @endif
@foreach ($contents as $content) @if ($loop->first&&!$is_mobile)

Tags: laravel trait php

Devin Yang

Feel free to ask me, if you don't get it.:)

No Comment

Post your comment

Login is required to leave comments

Similar Stories


laravel storage,sftp

Use tinker to test Laravel's sftp custom Storage::path and Storage::url

Today, I will test the use of sftp driver on Laravel. If you have never used it, come and see the results of my test. By the way, it is very convenient for us to perform Storage functions in the tinker environment of Laravel, whether it is local or remote. After adjusting the settings, remember to leave and enter again.

laravel

After upgrading Laravel 8.8, I integrated the articles and notes together

Laravel 8 has undergone major revisions, and my website has also been revised accordingly. The "notes" and "articles" on my website were originally separated into two blocks. This time I integrated him together. Anyway, there are not many articles, and the combined content seems to be more. :p

laravel

How do I upgrade the backend to Lravel 5.5

At the beginning, my background was a framework created by myself, which also uses MVC architecture, database connections and environment configuration files made by myself, including my own template syntax, until I want to support Restful, I have an idea, why should I rewrite the same function myself after others have written it, would it be better to write it out? So I started to use the framework, At the beginning, Slim was adopted mainly because it supports a lower version of php, but because Slim's twig templates are not as easy to use as Laravel's blade template...