{"id":846,"date":"2025-05-16T11:42:40","date_gmt":"2025-05-16T15:42:40","guid":{"rendered":"https:\/\/waterloobae.com\/?p=846"},"modified":"2025-08-20T13:29:13","modified_gmt":"2025-08-20T17:29:13","slug":"how-to-build-laravel-package-for-your-look-and-feel-with-blade-template-1-2","status":"publish","type":"post","link":"https:\/\/waterloobae.com\/blog\/2025\/05\/16\/how-to-build-laravel-package-for-your-look-and-feel-with-blade-template-1-2\/","title":{"rendered":"[Laravel] How to build Laravel package for your look and feel with Blade Template"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">First, install new Laravel application to be used as testing application. We are not using DB, so It might be good enough to start new application with Herd. The folder structure after initiating the application will look like<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">my-laravel-app\/\n\u2514\u2500\u2500 packages\/\n    \u2514\u2500\u2500 your-vendor\/\n        \u2514\u2500\u2500 blade-theme\/\n            \u251c\u2500\u2500 composer.json\n            \u251c\u2500\u2500 src\/\n            \u2502   \u251c\u2500\u2500 BladeThemeServiceProvider.php\n            \u251c\u2500\u2500 resources\/\n            \u2502   \u2514\u2500\u2500 views\/\n            \u2502       \u2514\u2500\u2500 layout.blade.php\n            \u251c\u2500\u2500 routes\/\n            \u2502   \u2514\u2500\u2500 web.php (optional, for demo\/testing)\n            \u2514\u2500\u2500 README.md<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It is developed under &#8220;packages&#8221; directory. Then, it will be installed with Composer in product and the directory will be &#8220;\/vendor\/your-vendor\/blade-theme\/&#8221;. It will have the same level of directory structure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>composer.json (for your package)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n  \"name\": \"your-vendor\/blade-theme\",\n  \"description\": \"A Blade theme package for Laravel.\",\n  \"type\": \"library\",\n  \"autoload\": {\n    \"psr-4\": {\n      \"YourVendor\\\\BladeTheme\\\\\": \"src\/\"\n    }\n  },\n  \"extra\": {\n    \"laravel\": {\n      \"providers\": [\n        \"YourVendor\\\\BladeTheme\\\\BladeThemeServiceProvider\"\n      ]\n    }\n  },\n  \"require\": {\n    \"php\": \"^8.1\",\n    \"illuminate\/support\": \"^10.0 || ^11.0 || ^12.0\"\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>BladeThemeServiceProvider.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nnamespace YourVendor\\BladeTheme;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass BladeThemeServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        \/\/ Load package views\n        $this-&gt;loadViewsFrom(__DIR__ . '\/..\/resources\/views', 'blade-theme');\n\n        \/\/ Optionally publish views for customization\n        $this-&gt;publishes([\n            __DIR__ . '\/..\/resources\/views' =&gt; resource_path('views\/vendor\/blade-theme'),\n        ], 'blade-theme-views');\n    }\n\n    public function register()\n    {\n        \/\/\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example View (layout.blade.php)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;title&gt;@yield('title', 'Blade Theme')&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;header&gt;\n        &lt;h1&gt;Welcome to My Blade Theme&lt;\/h1&gt;\n    &lt;\/header&gt;\n    &lt;main&gt;\n        @yield('content')\n    &lt;\/main&gt;\n    &lt;footer&gt;\n        &lt;p&gt;Powered by Blade Theme&lt;\/p&gt;\n    &lt;\/footer&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add the Package to Laravel (my-laravel-app\/composer.json)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">\"repositories\": [\n  {\n    \"type\": \"path\",\n    \"url\": \"packages\/your-vendor\/blade-theme\"\n  }\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then you can run Composer to require your package.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">composer require your-vendor\/blade-theme:@dev<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When all of them are done, you can test the Theme in your app. Create a Blade file using your package layout:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">{{-- resources\/views\/welcome.blade.php --}}\n@extends('blade-theme::layout')\n\n@section('title', 'My Custom Page')\n\n@section('content')\n    &lt;p&gt;This is using the Blade theme!&lt;\/p&gt;\n@endsection<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And route it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">Route::get('\/', function () {\n    return view('welcome');\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Some tips for trouble shooting can be:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Checking your Laravel (illuminate) version.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">php artisan --version<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Restarting and Rebuilding after changing namespace or structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">php artisan view:clear\nphp artisan config:clear\ncomposer dump-autoload<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Publishing the views<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">php artisan vendor:publish --tag=cemclf-views<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have built one Composer package for my office which mimics Drupal site of https:\/\/cemc.uwaterloo.ca. The repository is available on: <a href=\"https:\/\/github.com\/waterloobae\/cemclf\">https:\/\/github.com\/waterloobae\/cemclf<\/a> <br>Composer package on Packagist is <a href=\"https:\/\/packagist.org\/packages\/waterloobae\/cemclf\">https:\/\/packagist.org\/packages\/waterloobae\/cemclf<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>First, install new Laravel application to be used as testing application. We are not using DB, so It might be good enough to start new application with Herd. The folder structure after initiating the application will look like It is developed under &#8220;packages&#8221; directory. Then, it will be installed with Composer in product and the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,14],"tags":[],"class_list":["post-846","post","type-post","status-publish","format-standard","hentry","category-it-tips","category-laravel"],"_links":{"self":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts\/846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/comments?post=846"}],"version-history":[{"count":8,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts\/846\/revisions"}],"predecessor-version":[{"id":900,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/posts\/846\/revisions\/900"}],"wp:attachment":[{"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/media?parent=846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/categories?post=846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/waterloobae.com\/blog\/wp-json\/wp\/v2\/tags?post=846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}