{"id":13396108,"url":"https://github.com/artesaos/seotools","last_synced_at":"2026-04-02T16:13:15.504Z","repository":{"id":27737254,"uuid":"31224950","full_name":"artesaos/seotools","owner":"artesaos","description":"SEO Tools for Laravel","archived":false,"fork":false,"pushed_at":"2026-03-26T16:41:26.000Z","size":338,"stargazers_count":3331,"open_issues_count":31,"forks_count":516,"subscribers_count":116,"default_branch":"master","last_synced_at":"2026-03-26T19:56:13.821Z","etag":null,"topics":["facade","json-ld","laravel","lumen","meta-tags","opengraph","opengraph-tags","php","seo","seo-meta","seometa","seotools","twitter","webmaster","webmasters"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/artesaos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-02-23T19:21:45.000Z","updated_at":"2026-03-26T16:41:32.000Z","dependencies_parsed_at":"2025-04-23T23:17:59.263Z","dependency_job_id":"9a3c28a5-47be-48c8-acf2-31c58c440c8f","html_url":"https://github.com/artesaos/seotools","commit_stats":{"total_commits":231,"total_committers":65,"mean_commits":"3.5538461538461537","dds":0.6623376623376623,"last_synced_commit":"38b1153b7de3cc00b4b62cf39bc19c567cb7da5e"},"previous_names":[],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/artesaos/seotools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artesaos%2Fseotools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artesaos%2Fseotools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artesaos%2Fseotools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artesaos%2Fseotools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artesaos","download_url":"https://codeload.github.com/artesaos/seotools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artesaos%2Fseotools/sbom","scorecard":{"id":209165,"data":{"date":"2025-08-11","repo":{"name":"github.com/artesaos/seotools","commit":"f22bc0b0ff1bcb683ff72589d11fa80d10706597"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.1,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":8,"reason":"Found 9/11 approved changesets -- score normalized to 8","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T00:24:26.364Z","repository_id":27737254,"created_at":"2025-08-17T00:24:26.364Z","updated_at":"2025-08-17T00:24:26.364Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31309729,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["facade","json-ld","laravel","lumen","meta-tags","opengraph","opengraph-tags","php","seo","seo-meta","seometa","seotools","twitter","webmaster","webmasters"],"created_at":"2024-07-30T18:00:40.307Z","updated_at":"2026-04-02T16:13:15.480Z","avatar_url":"https://github.com/artesaos.png","language":"PHP","funding_links":[],"categories":["Popular Packages","PHP","Tools"],"sub_categories":["Laravel","Packages"],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/artesaos\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://avatars3.githubusercontent.com/u/11164074\" height=\"100px\"\u003e\n    \u003c/a\u003e\n    \u003ch1 align=\"center\"\u003eSEOTools - SEO Tools for Laravel and Lumen\u003c/h1\u003e\n    \u003cbr\u003e\n\u003c/p\u003e\n\nSEOTools is a package for [Laravel 5.8+](https://laravel.com/) and [Lumen](https://lumen.laravel.com/) that provides helpers for some common SEO techniques.\n\n\u003e Current Build Status\n\n[![Build Status](https://travis-ci.org/artesaos/seotools.svg)](https://travis-ci.org/artesaos/seotools)\n[![Code Climate](https://codeclimate.com/github/artesaos/seotools/badges/gpa.svg)](https://codeclimate.com/github/artesaos/seotools)\n\n\u003e Statistics\n\n[![Latest Stable Version](https://poser.pugx.org/artesaos/seotools/v/stable)](https://packagist.org/packages/artesaos/seotools) [![Total Downloads](https://poser.pugx.org/artesaos/seotools/downloads)](https://packagist.org/packages/artesaos/seotools) [![Latest Unstable Version](https://poser.pugx.org/artesaos/seotools/v/unstable)](https://packagist.org/packages/artesaos/seotools) [![License](https://poser.pugx.org/artesaos/seotools/license)](https://packagist.org/packages/artesaos/seotools)\n\nFor license information check the [LICENSE](LICENSE.md)-file.\n\nFeatures\n--------\n\n- Friendly simple interface\n- Easy of set titles and meta tags\n- Easy of set metas for [Twitter Cards](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards) and [Open Graph](https://ogp.me/)\n- Easy of set for [JSON Linked Data](https://json-ld.org/)\n\nInstallation\n------------\n\n### 1 - Dependency\n\nThe first step is using composer to install the package and automatically update your `composer.json` file, you can do this by running:\n\n```shell\ncomposer require artesaos/seotools\n```\n\n\u003e **Note**: If you are using Laravel 5.5, the steps 2 and 3, for providers and aliases, are unnecessaries. SEOTools supports Laravel new [Package Discovery](https://laravel.com/docs/5.5/packages#package-discovery).\n\n### 2 - Provider\n\nYou need to update your application configuration in order to register the package so it can be loaded by Laravel, just update your `config/app.php` file adding the following code at the end of your `'providers'` section:\n\n\u003e **Note**: If you are using Laravel 11+, you will have to update `bootstrap/providers.php` instead. [Package Discovery](https://laravel.com/docs/12.x/packages#package-discovery).\n\n\u003e `config/app.php`\n\n```php\n\u003c?php\n\nreturn [\n    // ...\n    'providers' =\u003e [\n        Artesaos\\SEOTools\\Providers\\SEOToolsServiceProvider::class,\n        // ...\n    ],\n    // ...\n];\n```\n\n#### Lumen\n\nGo to `/bootstrap/app.php` file and add this line:\n\n```php\n\u003c?php\n// ...\n\n$app = new Laravel\\Lumen\\Application(\n    dirname(__DIR__)\n);\n\n// ...\n\n$app-\u003eregister(Artesaos\\SEOTools\\Providers\\SEOToolsServiceProvider::class);\n\n// ...\n\nreturn $app;\n```\n\n### 3 - Facades\n\n\u003e Note: facades are not supported in Lumen.\n\nYou may get access to the SEO tool services using following facades:\n\n - `Artesaos\\SEOTools\\Facades\\SEOMeta`\n - `Artesaos\\SEOTools\\Facades\\OpenGraph`\n - `Artesaos\\SEOTools\\Facades\\TwitterCard`\n - `Artesaos\\SEOTools\\Facades\\JsonLd`\n - `Artesaos\\SEOTools\\Facades\\JsonLdMulti`\n - `Artesaos\\SEOTools\\Facades\\SEOTools`\n\nYou can setup a short-version aliases for these facades in your `config/app.php` file. For example:\n\n```php\n\u003c?php\n\nreturn [\n    // ...\n    'aliases' =\u003e [\n        'SEOMeta'       =\u003e Artesaos\\SEOTools\\Facades\\SEOMeta::class,\n        'OpenGraph'     =\u003e Artesaos\\SEOTools\\Facades\\OpenGraph::class,\n        'Twitter'       =\u003e Artesaos\\SEOTools\\Facades\\TwitterCard::class,\n        'JsonLd'        =\u003e Artesaos\\SEOTools\\Facades\\JsonLd::class,\n        'JsonLdMulti'   =\u003e Artesaos\\SEOTools\\Facades\\JsonLdMulti::class,\n        // or\n        'SEO' =\u003e Artesaos\\SEOTools\\Facades\\SEOTools::class,\n        // ...\n    ],\n    // ...\n];\n```\n\n### 4 Configuration\n\n#### Publish config\n\nIn your terminal type\n\n```shell\nphp artisan vendor:publish\n```\n\nor\n\n```shell\nphp artisan vendor:publish --provider=\"Artesaos\\SEOTools\\Providers\\SEOToolsServiceProvider\"\n```\n\n\u003e Lumen does not support this command, for it you should copy the file `src/resources/config/seotools.php` to `config/seotools.php` of your project\n\nIn `seotools.php` configuration file you can determine the properties of the default values and some behaviors.\n\n#### seotools.php\n\n- **meta**\n   - `defaults` - What values are displayed if not specified any value for the page display. If the value is `false`, nothing is displayed.\n   - `webmaster` - Are the settings of tags values for major webmaster tools. If you are `null` nothing is displayed.\n- **opengraph**\n   - `defaults` - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.\n- **twitter**\n   - `defaults` - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.\n- **json-ld**\n   - `defaults` - Are the properties that will always be displayed and when no other value is set instead. **You can add additional tags** that are not included in the original configuration file.\n\nUsage\n-----\n\n### Lumen Usage\n\n\u003e Note: facades are not supported in Lumen.\n\n```php\n\u003c?php\n\n$seotools = app('seotools');\n$metatags = app('seotools.metatags');\n$twitter = app('seotools.twitter');\n$opengraph = app('seotools.opengraph');\n$jsonld = app('seotools.json-ld');\n$jsonldMulti = app('seotools.json-ld-multi');\n\n// The behavior is the same as the facade\n\necho app('seotools')-\u003egenerate();\n```\n\n### Meta tags Generator\n\nWith **SEOMeta** you can create meta tags to the `head`\n\n### Opengraph tags Generator\n\nWith **OpenGraph** you can create OpenGraph tags to the `head`\n\n### Twitter for Twitter Cards tags Generator\n\nWith **Twitter** you can create OpenGraph tags to the `head`\n\n#### In your controller\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers;\n\nuse Artesaos\\SEOTools\\Facades\\SEOMeta;\nuse Artesaos\\SEOTools\\Facades\\OpenGraph;\nuse Artesaos\\SEOTools\\Facades\\TwitterCard;\nuse Artesaos\\SEOTools\\Facades\\JsonLd;\n// OR with multi\nuse Artesaos\\SEOTools\\Facades\\JsonLdMulti;\n\n// OR\nuse Artesaos\\SEOTools\\Facades\\SEOTools;\n\nclass CommonController extends Controller\n{\n    public function index()\n    {\n        SEOMeta::setTitle('Home');\n        SEOMeta::setDescription('This is my page description');\n        SEOMeta::setCanonical('https://codecasts.com.br/lesson');\n\n        OpenGraph::setDescription('This is my page description');\n        OpenGraph::setTitle('Home');\n        OpenGraph::setUrl('http://current.url.com');\n        OpenGraph::addProperty('type', 'articles');\n\n        TwitterCard::setTitle('Homepage');\n        TwitterCard::setSite('@LuizVinicius73');\n\n        JsonLd::setTitle('Homepage');\n        JsonLd::setDescription('This is my page description');\n        JsonLd::addImage('https://codecasts.com.br/img/logo.jpg');\n\n        // OR\n\n        SEOTools::setTitle('Home');\n        SEOTools::setDescription('This is my page description');\n        SEOTools::opengraph()-\u003esetUrl('http://current.url.com');\n        SEOTools::setCanonical('https://codecasts.com.br/lesson');\n        SEOTools::opengraph()-\u003eaddProperty('type', 'articles');\n        SEOTools::twitter()-\u003esetSite('@LuizVinicius73');\n        SEOTools::jsonLd()-\u003eaddImage('https://codecasts.com.br/img/logo.jpg');\n\n        $posts = Post::all();\n\n        return view('myindex', compact('posts'));\n    }\n\n    public function show($id)\n    {\n        $post = Post::find($id);\n\n        SEOMeta::setTitle($post-\u003etitle);\n        SEOMeta::setDescription($post-\u003eresume);\n        SEOMeta::addMeta('article:published_time', $post-\u003epublished_date-\u003etoW3CString(), 'property');\n        SEOMeta::addMeta('article:section', $post-\u003ecategory, 'property');\n        SEOMeta::addKeyword(['key1', 'key2', 'key3']);\n\n        OpenGraph::setDescription($post-\u003eresume);\n        OpenGraph::setTitle($post-\u003etitle);\n        OpenGraph::setUrl('http://current.url.com');\n        OpenGraph::addProperty('type', 'article');\n        OpenGraph::addProperty('locale', 'pt-br');\n        OpenGraph::addProperty('locale:alternate', ['pt-pt', 'en-us']);\n\n        OpenGraph::addImage($post-\u003ecover-\u003eurl);\n        OpenGraph::addImage($post-\u003eimages-\u003elist('url'));\n        OpenGraph::addImage(['url' =\u003e 'http://image.url.com/cover.jpg', 'size' =\u003e 300]);\n        OpenGraph::addImage('http://image.url.com/cover.jpg', ['height' =\u003e 300, 'width' =\u003e 300]);\n\n        JsonLd::setTitle($post-\u003etitle);\n        JsonLd::setDescription($post-\u003eresume);\n        JsonLd::setType('Article');\n        JsonLd::addImage($post-\u003eimages-\u003elist('url'));\n\n        // OR with multi\n\n        JsonLdMulti::setTitle($post-\u003etitle);\n        JsonLdMulti::setDescription($post-\u003eresume);\n        JsonLdMulti::setType('Article');\n        JsonLdMulti::addImage($post-\u003eimages-\u003elist('url'));\n        if(! JsonLdMulti::isEmpty()) {\n            JsonLdMulti::newJsonLd();\n            JsonLdMulti::setType('WebPage');\n            JsonLdMulti::setTitle('Page Article - '.$post-\u003etitle);\n        }\n\n        // Namespace URI: http://ogp.me/ns/article#\n        // article\n        OpenGraph::setTitle('Article')\n            -\u003esetDescription('Some Article')\n            -\u003esetType('article')\n            -\u003esetArticle([\n                'published_time' =\u003e 'datetime',\n                'modified_time' =\u003e 'datetime',\n                'expiration_time' =\u003e 'datetime',\n                'author' =\u003e 'profile / array',\n                'section' =\u003e 'string',\n                'tag' =\u003e 'string / array'\n            ]);\n\n        // Namespace URI: http://ogp.me/ns/book#\n        // book\n        OpenGraph::setTitle('Book')\n            -\u003esetDescription('Some Book')\n            -\u003esetType('book')\n            -\u003esetBook([\n                'author' =\u003e 'profile / array',\n                'isbn' =\u003e 'string',\n                'release_date' =\u003e 'datetime',\n                'tag' =\u003e 'string / array'\n            ]);\n\n        // Namespace URI: http://ogp.me/ns/profile#\n        // profile\n        OpenGraph::setTitle('Profile')\n             -\u003esetDescription('Some Person')\n            -\u003esetType('profile')\n            -\u003esetProfile([\n                'first_name' =\u003e 'string',\n                'last_name' =\u003e 'string',\n                'username' =\u003e 'string',\n                'gender' =\u003e 'enum(male, female)'\n            ]);\n\n        // Namespace URI: http://ogp.me/ns/music#\n        // music.song\n        OpenGraph::setType('music.song')\n            -\u003esetMusicSong([\n                'duration' =\u003e 'integer',\n                'album' =\u003e 'array',\n                'album:disc' =\u003e 'integer',\n                'album:track' =\u003e 'integer',\n                'musician' =\u003e 'array'\n            ]);\n\n        // music.album\n        OpenGraph::setType('music.album')\n            -\u003esetMusicAlbum([\n                'song' =\u003e 'music.song',\n                'song:disc' =\u003e 'integer',\n                'song:track' =\u003e 'integer',\n                'musician' =\u003e 'profile',\n                'release_date' =\u003e 'datetime'\n            ]);\n\n         //music.playlist\n        OpenGraph::setType('music.playlist')\n            -\u003esetMusicPlaylist([\n                'song' =\u003e 'music.song',\n                'song:disc' =\u003e 'integer',\n                'song:track' =\u003e 'integer',\n                'creator' =\u003e 'profile'\n            ]);\n\n        // music.radio_station\n        OpenGraph::setType('music.radio_station')\n            -\u003esetMusicRadioStation([\n                'creator' =\u003e 'profile'\n            ]);\n\n        // Namespace URI: http://ogp.me/ns/video#\n        // video.movie\n        OpenGraph::setType('video.movie')\n            -\u003esetVideoMovie([\n                'actor' =\u003e 'profile / array',\n                'actor:role' =\u003e 'string',\n                'director' =\u003e 'profile /array',\n                'writer' =\u003e 'profile / array',\n                'duration' =\u003e 'integer',\n                'release_date' =\u003e 'datetime',\n                'tag' =\u003e 'string / array'\n            ]);\n\n        // video.episode\n        OpenGraph::setType('video.episode')\n            -\u003esetVideoEpisode([\n                'actor' =\u003e 'profile / array',\n                'actor:role' =\u003e 'string',\n                'director' =\u003e 'profile /array',\n                'writer' =\u003e 'profile / array',\n                'duration' =\u003e 'integer',\n                'release_date' =\u003e 'datetime',\n                'tag' =\u003e 'string / array',\n                'series' =\u003e 'video.tv_show'\n            ]);\n\n        // video.tv_show\n        OpenGraph::setType('video.tv_show')\n            -\u003esetVideoTVShow([\n                'actor' =\u003e 'profile / array',\n                'actor:role' =\u003e 'string',\n                'director' =\u003e 'profile /array',\n                'writer' =\u003e 'profile / array',\n                'duration' =\u003e 'integer',\n                'release_date' =\u003e 'datetime',\n                'tag' =\u003e 'string / array'\n            ]);\n\n        // video.other\n        OpenGraph::setType('video.other')\n            -\u003esetVideoOther([\n                'actor' =\u003e 'profile / array',\n                'actor:role' =\u003e 'string',\n                'director' =\u003e 'profile /array',\n                'writer' =\u003e 'profile / array',\n                'duration' =\u003e 'integer',\n                'release_date' =\u003e 'datetime',\n                'tag' =\u003e 'string / array'\n            ]);\n\n        // og:video\n        OpenGraph::addVideo('http://example.com/movie.swf', [\n                'secure_url' =\u003e 'https://example.com/movie.swf',\n                'type' =\u003e 'application/x-shockwave-flash',\n                'width' =\u003e 400,\n                'height' =\u003e 300\n            ]);\n\n        // og:audio\n        OpenGraph::addAudio('http://example.com/sound.mp3', [\n                'secure_url' =\u003e 'https://secure.example.com/sound.mp3',\n                'type' =\u003e 'audio/mpeg'\n            ]);\n\n        // og:place\n        OpenGraph::setTitle('Place')\n             -\u003esetDescription('Some Place')\n            -\u003esetType('place')\n            -\u003esetPlace([\n                'location:latitude' =\u003e 'float',\n                'location:longitude' =\u003e 'float',\n            ]);\n\n        return view('myshow', compact('post'));\n    }\n}\n```\n\n#### SEOTrait\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers;\n\nuse Artesaos\\SEOTools\\Traits\\SEOTools as SEOToolsTrait;\n\nclass CommonController extends Controller\n{\n    use SEOToolsTrait;\n\n    public function index()\n    {\n        $this-\u003eseo()-\u003esetTitle('Home');\n        $this-\u003eseo()-\u003esetDescription('This is my page description');\n        $this-\u003eseo()-\u003eopengraph()-\u003esetUrl('http://current.url.com');\n        $this-\u003eseo()-\u003eopengraph()-\u003eaddProperty('type', 'articles');\n        $this-\u003eseo()-\u003etwitter()-\u003esetSite('@LuizVinicius73');\n        $this-\u003eseo()-\u003ejsonLd()-\u003esetType('Article');\n\n        $posts = Post::all();\n\n        return view('myindex', compact('posts'));\n    }\n}\n```\n\n### In Your View\n\n\u003e **Pro Tip**: Pass the parameter `true` to get minified code and reduce filesize.\n\n```html\n\u003chtml\u003e\n\u003chead\u003e\n    {!! SEOMeta::generate() !!}\n    {!! OpenGraph::generate() !!}\n    {!! Twitter::generate() !!}\n    {!! JsonLd::generate() !!}\n    // OR with multi\n    {!! JsonLdMulti::generate() !!}\n\n    \u003c!-- OR --\u003e\n    {!! SEO::generate() !!}\n\n    \u003c!-- MINIFIED --\u003e\n    {!! SEO::generate(true) !!}\n\n    \u003c!-- LUMEN --\u003e\n    {!! app('seotools')-\u003egenerate() !!}\n\u003c/head\u003e\n\u003cbody\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n```html\n\u003chtml\u003e\n\u003chead\u003e\n    \u003ctitle\u003eTitle - Over 9000 Thousand!\u003c/title\u003e\n    \u003cmeta name='description' itemprop='description' content='description...'\u003e\n    \u003cmeta name='keywords' content='key1, key2, key3'\u003e\n    \u003cmeta property='article:published_time' content='2015-01-31T20:30:11-02:00'\u003e\n    \u003cmeta property='article:section' content='news'\u003e\n\n    \u003cmeta property=\"og:description\" content=\"description...\"\u003e\n    \u003cmeta property=\"og:title\" content=\"Title\"\u003e\n    \u003cmeta property=\"og:url\" content=\"http://current.url.com\"\u003e\n    \u003cmeta property=\"og:type\" content=\"article\"\u003e\n    \u003cmeta property=\"og:locale\" content=\"pt-br\"\u003e\n    \u003cmeta property=\"og:locale:alternate\" content=\"pt-pt\"\u003e\n    \u003cmeta property=\"og:locale:alternate\" content=\"en-us\"\u003e\n    \u003cmeta property=\"og:site_name\" content=\"name\"\u003e\n    \u003cmeta property=\"og:image\" content=\"http://image.url.com/cover.jpg\"\u003e\n    \u003cmeta property=\"og:image\" content=\"http://image.url.com/img1.jpg\"\u003e\n    \u003cmeta property=\"og:image\" content=\"http://image.url.com/img2.jpg\"\u003e\n    \u003cmeta property=\"og:image\" content=\"http://image.url.com/img3.jpg\"\u003e\n    \u003cmeta property=\"og:image:url\" content=\"http://image.url.com/cover.jpg\"\u003e\n    \u003cmeta property=\"og:image:size\" content=\"300\"\u003e\n\n    \u003cmeta name=\"twitter:card\"content=\"summary\"\u003e\n    \u003cmeta name=\"twitter:title\"content=\"Title\"\u003e\n    \u003cmeta name=\"twitter:site\"content=\"@LuizVinicius73\"\u003e\n\n    \u003cscript type=\"application/ld+json\"\u003e{\"@context\":\"https://schema.org\",\"@type\":\"Article\",\"name\":\"Title - Over 9000 Thousand!\"}\u003c/script\u003e\n    \u003c!-- OR with multi --\u003e\n    \u003cscript type=\"application/ld+json\"\u003e{\"@context\":\"https://schema.org\",\"@type\":\"Article\",\"name\":\"Title - Over 9000 Thousand!\"}\u003c/script\u003e\n    \u003cscript type=\"application/ld+json\"\u003e{\"@context\":\"https://schema.org\",\"@type\":\"WebPage\",\"name\":\"Title - Over 9000 Thousand!\"}\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n#### Using Macro\nUsing the same code in multiple places can be tedious, which is why this package includes a Macroable trait. This trait allows additional functionality to be added to a class that was not defined in the class definition, using a simple trait.\n\nFor example, imagine that you need to add meta titles and descriptions for your pages. You can add your Macroable functions in the AppServiceProvider or create a dedicated file for this purpose, and define your function as shown in the code snippet:\n```php\n    SEOTools::macro('webPage', function (string $title, string $description) {\n        SEOMeta::setTitle($title);\n        SEOMeta::setDescription($description);\n        SEOMeta::setCanonical('http://current.url.com');\n        OpenGraph::setDescription($description);\n        OpenGraph::setTitle($title);\n        OpenGraph::setUrl('http://current.url.com');\n        OpenGraph::addProperty('type', 'webpage');\n    });\n```\n\nIn your controller, you can use the following code to utilize the function:\n```php\n    SEOTools::webPage('Page title', 'Page description');\n```\n\n#### API (SEOMeta)\n\n```php\n\u003c?php\n\nuse Artesaos\\SEOTools\\Facades\\SEOMeta;\n\nSEOMeta::addKeyword($keyword);\nSEOMeta::addMeta($meta, $value = null, $name = 'name');\nSEOMeta::addAlternateLanguage($lang, $url);\nSEOMeta::addAlternateLanguages(array $languages);\nSEOMeta::setAlternateLanguage($lang, $url);\nSEOMeta::setAlternateLanguages(array $languages);\nSEOMeta::setTitleSeparator($separator);\nSEOMeta::setTitle($title);\nSEOMeta::setTitleDefault($default);\nSEOMeta::setDescription($description);\nSEOMeta::setKeywords($keywords);\nSEOMeta::setRobots($robots);\nSEOMeta::setCanonical($url);\nSEOMeta::setPrev($url);\nSEOMeta::setNext($url);\nSEOMeta::removeMeta($key);\n\n// You can chain methods\nSEOMeta::setTitle($title)\n            -\u003esetDescription($description)\n            -\u003esetKeywords($keywords)\n            -\u003eaddKeyword($keyword)\n            -\u003eaddMeta($meta, $value);\n\n// Retrieving data\nSEOMeta::getTitle();\nSEOMeta::getTitleSession();\nSEOMeta::getTitleSeparator();\nSEOMeta::getKeywords();\nSEOMeta::getDescription();\nSEOMeta::getCanonical($url);\nSEOMeta::getPrev($url);\nSEOMeta::getNext($url);\nSEOMeta::getRobots();\nSEOMeta::reset();\n\nSEOMeta::generate();\n```\n\n#### API (OpenGraph)\n\n```php\n\u003c?php\n\nuse Artesaos\\SEOTools\\Facades\\OpenGraph;\n\nOpenGraph::addProperty($key, $value); // value can be string or array\nOpenGraph::addImage($url); // add image url\nOpenGraph::addImages($url); // add an array of url images\nOpenGraph::setTitle($title); // define title\nOpenGraph::setDescription($description);  // define description\nOpenGraph::setUrl($url); // define url\nOpenGraph::setSiteName($name); //define site_name\n\n// You can chain methods\nOpenGraph::addProperty($key, $value)\n            -\u003eaddImage($url)\n            -\u003eaddImages($url)\n            -\u003esetTitle($title)\n            -\u003esetDescription($description)\n            -\u003esetUrl($url)\n            -\u003esetSiteName($name);\n\n// Generate html tags\nOpenGraph::generate();\n```\n\n### API (TwitterCard)\n\n```php\n\u003c?php\n\nuse Artesaos\\SEOTools\\Facades\\TwitterCard;\n\nTwitterCard::addValue($key, $value); // value can be string or array\nTwitterCard::setType($type); // type of twitter card tag\nTwitterCard::setTitle($type); // title of twitter card tag\nTwitterCard::setSite($type); // site of twitter card tag\nTwitterCard::setDescription($type); // description of twitter card tag\nTwitterCard::setUrl($type); // url of twitter card tag\nTwitterCard::setImage($url); // add image url\n\n// You can chain methods\nTwitterCard::addValue($key, $value)\n            -\u003esetType($type)\n            -\u003esetImage($url)\n            -\u003esetTitle($title)\n            -\u003esetDescription($description)\n            -\u003esetUrl($url)\n            -\u003esetSite($name);\n\n// Generate html tags\nTwitterCard::generate();\n```\n\n### API (JsonLd)\n\n```php\n\u003c?php\n\nuse Artesaos\\SEOTools\\Facades\\JsonLd;\n\nJsonLd::addValue($key, $value); // value can be string or array\nJsonLd::setType($type); // type of twitter card tag\nJsonLd::setTitle($type); // title of twitter card tag\nJsonLd::setSite($type); // site of twitter card tag\nJsonLd::setDescription($type); // description of twitter card tag\nJsonLd::setUrl($type); // url of twitter card tag\nJsonLd::setImage($url); // add image url\n\n// You can chain methods\nJsonLd::addValue($key, $value)\n    -\u003esetType($type)\n    -\u003esetImage($url)\n    -\u003esetTitle($title)\n    -\u003esetDescription($description)\n    -\u003esetUrl($url)\n    -\u003esetSite($name);\n\n// Generate html tags\nJsonLd::generate();\n```\n\n### API (JsonLdMulti)\n\n```php\n\u003c?php\n\nuse Artesaos\\SEOTools\\Facades\\JsonLdMulti;\n\nJsonLdMulti::newJsonLd(); // create a new JsonLd group\nJsonLdMulti::isEmpty(); // check if the current JsonLd group is empty\nJsonLdMulti::select($index); // choose the JsonLd group that will be edited by the methods below\nJsonLdMulti::addValue($key, $value); // value can be string or array\nJsonLdMulti::setType($type); // type of twitter card tag\nJsonLdMulti::setTitle($type); // title of twitter card tag\nJsonLdMulti::setSite($type); // site of twitter card tag\nJsonLdMulti::setDescription($type); // description of twitter card tag\nJsonLdMulti::setUrl($type); // url of twitter card tag\nJsonLdMulti::setImage($url); // add image url\n\n// You can chain methods\nJsonLdMulti::addValue($key, $value)\n    -\u003esetType($type)\n    -\u003esetImage($url)\n    -\u003esetTitle($title)\n    -\u003esetDescription($description)\n    -\u003esetUrl($url)\n    -\u003esetSite($name);\n// You can add an other group\nif(! JsonLdMulti::isEmpty()) {\n    JsonLdMulti::newJsonLd()\n        -\u003esetType($type)\n        -\u003esetImage($url)\n        -\u003esetTitle($title)\n        -\u003esetDescription($description)\n        -\u003esetUrl($url)\n        -\u003esetSite($name);\n}\n// Generate html tags\nJsonLdMulti::generate();\n// You will have retrieve \u003cscript content=\"application/ld+json\"/\u003e\n```\n\n#### API (SEO)\n\n\u003e Facilitates access to all the SEO Providers\n\n```php\n\u003c?php\n\nuse Artesaos\\SEOTools\\Facades\\SEOTools;\n\nSEOTools::metatags();\nSEOTools::twitter();\nSEOTools::opengraph();\nSEOTools::jsonLd();\n\nSEOTools::setTitle($title);\nSEOTools::getTitle($session = false);\nSEOTools::setDescription($description);\nSEOTools::setCanonical($url);\nSEOTools::addImages($urls);\n```\n\nMissing Features\n----------------\n\nThere are many SEO-related features, which you may need for your project. While this package provides support for the basic ones,\nother are out of its scope. You'll have to use separate packages for their integration.\n\n### SiteMap\n\nThis package does not support sitemap files generation. Please consider usage one of the following packages for it:\n\n- [laravelium/sitemap](https://packagist.org/packages/laravelium/sitemap)\n\n- [spatie/laravel-sitemap](https://packagist.org/packages/spatie/laravel-sitemap)\n\n### URL Trailing Slash\n\nThis package does not handle URL consistency regardless absence or presence of the slash symbol at its end.\nPlease consider usage one of the following packages if you need it:\n\n- [illuminatech/url-trailing-slash](https://packagist.org/packages/illuminatech/url-trailing-slash)\n\n- [fsasvari/laravel-trailing-slash](https://packagist.org/packages/fsasvari/laravel-trailing-slash)\n\n### Microdata Markup\n\nThis package does provide generation of the [microdata HTML markup](https://www.w3.org/TR/microdata/). If you need to create HTML like the following one:\n\n```html\n\u003cdiv itemscope\u003e\n \u003cp\u003eMy name is\n  \u003cspan itemprop=\"name\"\u003eElizabeth\u003c/span\u003e.\u003c/p\u003e\n\u003c/div\u003e\n```\n\nyou will need to handle it yourself.\n\n\u003e Note: nowadays microdata markup is considered to be outdated. It is recommened to use [JSON Linked Data](https://json-ld.org/) instead,\n  which is supported by this extension.\n\n### RSS\n\nThis package does not support RSS feed generation or related meta data composition. Please consider usage one of the following packages for it:\n\n- [spatie/laravel-feed](https://packagist.org/packages/spatie/laravel-feed)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartesaos%2Fseotools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartesaos%2Fseotools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartesaos%2Fseotools/lists"}