detect subdomain and set shared (global) variable in laravel - php

I've got the following snippet successfully routing subdomain request. I'm looking for a way where I can detect the subdomain and do some quick logic to assign a value to a global variable depending on the subdomain. Where could I do this?
Route::group(array('domain' => '{username}.murch.co'), function() {
Route::controller('checkout', 'CheckoutController');
Route::get('/', 'UserController#getProfile');
});
I'd like to do something like
Route::group(array('domain' => '{username}.murch.co'), function() {
$var = "dog".$username;
View::share('var', $var);
Route::controller('checkout', 'CheckoutController');
Route::get('/', 'UserController#getProfile');
});

I still don't know how to achieve this is routes.php but I ended up finding a solution using filters
App::before(function($request)
{
$urlParts = explode('.', $_SERVER['HTTP_HOST']);
$subdomain = $urlParts[0];
$userModel = new User;
$user = $userModel->getUserByUsername($subdomain);
View::share('user', $user);
});

For Laravel 5.x, you can call it from anywhere - controller, view, etc.
Route::current()->parameter('username');

Related

How do I give route name to a closure route in Lumen?

Hi I have the following Lumen Route
$router->get('/end', function (\Illuminate\Http\Request $request) use ($router) {
$controller = $router->app->make('App\Http\Controllers\Legacy\EndLegacyController');
return $controller->index($request);
});
I am trying to give it a route name so that I can use redirect to redirect to this route like redirect()->route('name_of_route')
so far I have tried
})->namedRoute['end'] = '/end'; // No Effect
})->name('end') //Undefined function
but it didn't work
here's a list of present routes
Edit
Because of my certain requirement, I can't use ['as' => 'end', 'uses'=> 'ControllerName#Action']
you can use the following syntax: $router->get('/end', ['as'=>'name_here', function()]);

Get subdomain value in laravel 5.3

I am new in laravel, I am creating a subdomain in same project main domain localhost.vibrant-invitations.com and subdomain sadmin.localhost.vibrant-invitations.com on local, now I want to get subdomain value like sadmin. I am trying following the code
Route::group(['domain' => '{subdomain}.localhost.vibrant-invitations.com'], function () {
Route::get('/', function ($subdomain) {
$name = DB::table('users')->where('name', $subdomain)->get();
dd($name);
});
});
Route::get('/', function () {
return "This will respond to all other '/' requests.";
});
this is always returning "This will respond to all other '/' requests", Route group with a domain is not working.
My laravel version 5.3
Please help me to solve this.
Regards
Yash

Laravel 5.2 routing like cakephp

I am new to laravel. I am coming form cakephp, so routing is creating a bit of difficulty for me.
I have tried the Question but getting error in that.
I also tried for Route::controller(); and Route::resource(); but not getting the the result i want.
I simply want the rounting to be
http://example.com/controller/action/param1/param2/param3
also, if i can get answer for the backend management like
http://example.com/backend/controller/action/param1/param2/param3
In Laravel 5.2 the use of Route::controller('Controller') has been deprecated due to annoying race conditions.
To get your desired result. Let's say you have a controller App\Http\Controllers\MyController.
In your routes.php file you would have the following:
Route::group(['middleware' => ['web']], function(Router $router) {
// Note the question marks after the parameters
// this makes them optional.
$router->get('uri/{action?}/{param1?}/{param2?}', [
'uses' => 'MyController#getIndex'
]);
});
You would now have a controller method getIndex
// As the parameters were optional, make sure to give them
// default values.
public function getIndex($action = null, $param1 = null, $param2 = null)
{
// Your route logic
}
im coming from cakephp too, and i write this route for emulate cakephp routing.
Route::any('{anyRoute}', function($anyRoute){
$call = "";
$parts = explode("/", $anyRoute);
$size = sizeof($parts);
if($size > 0){
$controller = ucfirst(strtolower(trim($parts[0])));
$action = trim(array_get($parts, 1));
$params = [];
if(empty($controller)){
return view("welcome");
}
else{
if(empty($action)){
$action = "index";
}
}
if($size > 2){
unset($parts[0], $parts[1]);
$params = array_merge($params, $parts);
}
$object = app('App\\Http\\Controllers\\'.$controller.'Controller');
call_user_func_array([$object, $action], $params);
}
})->where('anyRoute', '(.*)');
Easiest way to get params i thinks this way maybe helps you:
i assume you want to get params
//App/routes.php
Route::get( '/controller/action/{param1}/{param2}/{param3}' , 'ActionController#getParams' );
//App/Http/Controllers/ActionController.php
public function getParams($param1, $param2, $param3 )
{
return $param1.$param2.$param3;
}
for second part it's same.
for more information: laravel controller
Laravel doesn’t have implicit routing like CakePHP (like you, I moved from CakePHP to Laravel). You’re better off defining resource routes, i.e.
$router->resources([
'users' => 'UserController',
'articles' => 'ArticleController',
'events' => 'EventController',
// And so on...
]);
This has the benefit of people being able to see what routes your application responds to by looking over your app/Http/routes.php file, rather than having to delve into your controller classes and seeing what actions you’ve defined in them.

Passing variables from route group to route functions in Laravel 4

I have one installation of Laravel on which I wish to run 3 sites (addon domains). I am using Laravel's route grouping method to grab each domain. However, I need to be able to know which domain I am working with inside of each group. What is the best way to do this? I have the following code:
Route::group(array('domain' => 'domainone.com'), function($domain = 'domainone')
{
Route::get('/', function($domain) {
//
});
});
^ Which doesn't work.
The notes suggest using wildcards in the URL, eg.
Route::group(array('domain' => '{domain}.com'), function()
{
Route::get('/', function($domain) {
//
});
});
However, I would prefer a different method, as I can't really use this during development on my local server. Is there any way that is more like my first method, in which I can just manually declare a key for each domain?
EDIT: I also then need to pass that domain variable to a controller, which I am also struggling to work out how to do?
Thanks.
EDIT 2
My problem is that I am not using subdomains, I am using domains; I have 3 separate domains for 3 sister sites that are running on the same installation of Laravel. So I have 3 route groups, one for each domain. Moreover, I don't want to request the domain variable using {domain}.com each time, I want to tell Laravel the domain in each case, then pass that domain as a variable to the appropriate controller within each group. Here is my example code:
$domain1 = 'domain1.com';
$domain2 = 'domain2.com';
$domain3 = 'domain3.com';
Route::group(array('domain' => $domain1), function(){
Route::get('/', 'PrimaryController#somefunction1'); // <-- I want to access $domain1 in my controller
});
Route::group(array('domain' => $domain2), function(){
Route::get('/', 'PrimaryController#somefunction2'); // <-- ...and $domain2
});
Route::group(array('domain' => $domain3), function(){
Route::get('/', 'PrimaryController#somefunction3'); // <-- ...and $domain3
});
This is an option for your first method:
$domain = 'domainone';
Route::group(array('domain' => $domain.'.com'), function() use ($domain)
{
Route::get('/', function() use ($domain) {
echo "$domain";
});
});
You can pass watever you like to your controllers, via groups too, you just need to add one more level.
$subdomain = 'atlanta';
$domain = 'domainone';
Route::group(array('domain' => "$subdomain.$domain.com"), function()
{
Route::group(array('domain' => '{subdomain}.{domain}.com'), function()
{
Route::get('testdomain', function($subdomain, $domain) {
dd("closure: subdomain: $subdomain - domain: $domain");
});
Route::get('testdomaincontroller', 'FooController#index');
});
});
By doing this you have to understand that your first two variables passed to your controller action will always be $subdomain and $subdomain. Here's a controller to show it, which you can use to test those routes too:
class FooController extends Controller {
public function index($subdomain, $domain)
{
dd("controller: subdomain: $subdomain - domain: $domain");
}
}
You'll have two different routes with this:
http://yourdomain.dev/testdomain
http://yourdomain.dev/testdomaincontroller
I accomplish this with the following two steps:
First, using the Laravel documentation example, I pull the subdomain down and assign it to {account}.
Route::group(array('domain' => '{account}.myapp.com'), function()
From here, any controller you assign to a route within this group will have the ability to inject this {account} data in to its functions.
Note: you can't access it in the constructor. Each function in the Controller that needs to use this data will need a parameter created for it. Like this:
/**
* The $subdomain variable below will capture the data stored in
* {account} in your route group. Note that you can name this variable
* anything you'd like.
*/
public function showCreateBankAccount($subdomain) {
echo "This is your subdomain: " . $subdomain;
}

Get the subdomain in a subdomain-route (Laravel)

I'm building an application where a subdomain points to a user. How can I get the subdomain-part of the address elsewhere than in a route?
Route::group(array('domain' => '{subdomain}.project.dev'), function() {
Route::get('foo', function($subdomain) {
// Here I can access $subdomain
});
// How can I get $subdomain here?
});
I've built a messy work-around, though:
Route::bind('subdomain', function($subdomain) {
// Use IoC to store the variable for use anywhere
App::bindIf('subdomain', function($app) use($subdomain) {
return $subdomain;
});
// We are technically replacing the subdomain-variable
// However, we don't need to change it
return $subdomain;
});
The reason I want to use the variable outside a route is to establish a database-connection based on that variable.
Shortly after this question was asked, Laravel implemented a new method for getting the subdomain inside the routing code. It can be used like this:
Route::group(array('domain' => '{subdomain}.project.dev'), function() {
Route::get('foo', function($subdomain) {
// Here I can access $subdomain
});
$subdomain = Route::input('subdomain');
});
See "Accessing A Route Parameter Value" in the docs.
$subdomain is injected in the actual Route callback, it is undefined inside the group closure because the Request has not been parsed yet.
I don't see why would you need to have it available inside the group closure BUT outside of the actual Route callback.
If want you want is to have it available everywhere ONCE the Request has been parsed, you could setup an after filter to store the $subdomain value:
Config::set('request.subdomain', Route::getCurrentRoute()->getParameter('subdomain'));
Update: applying a group filter to setup a database connection.
Route::filter('set_subdomain_db', function($route, $request)
{
//set your $db here based on $route or $request information.
//set it to a config for example, so it si available in all
//the routes this filter is applied to
Config::set('request.subdomain', 'subdomain_here');
Config::set('request.db', 'db_conn_here');
});
Route::group(array(
'domain' => '{subdomain}.project.dev',
'before' => 'set_subdomain_db'
), function() {
Route::get('foo', function() {
Config::get('request.subdomain');
});
Route::get('bar', function() {
Config::get('request.subdomain');
Config::get('request.db');
});
});
Above won't work in Laravel 5.4 or 5.6. Please test this one:
$subdomain = array_first(explode('.', request()->getHost()));
Way with macro:
Request::macro('subdomain', function () {
return current(explode('.', $this->getHost()));
});
Now you can use it:
$request->subdomain();
in the route call
$route = Route::getCurrentRoute();
and now you should have access to everything the route has. I.e.
$route = Route::getCurrentRoute();
$subdomain = $route->getParameter('subdomain');
YOU CAN GET THE SUBDOMAIN LIKE THIS
Route::getCurrentRoute()->subdomain

Categories