2016-07-13 4 views
1

Я новичок в Laravel и в настоящее время кодирую приложение интрасети, которое в основном представляет собой панель инструментов с большой информацией, с Laravel 5.2, и одним из требований является возможность для навигации по различным магазинам. На каждой странице приложения потребуется КОД магазина.Laravel 5.2 - Общий OBJECT для всех контроллеров и представлений

В настоящее время у меня есть столбец store_id во всех моих таблицах, и я использую GET с маршрутами, чтобы получить это значение, например:

www.mysite.com/1/employees -> will list all employees from Store 1 
www.mysite.com/1/employees/create -> will create employee to Store 1 
www.mysite.com/2/financial -> will list all financial widgets with data from Store 2 

Я хотел бы удалить мой store_id из ГЭТ, а также использовать раскрывающийся выбрать все магазины в моем topbar.blade.php, например:

<select> 
    <option selected>Store1</option> 
    <option>Store2</option> 
</select> 

Всякий раз, когда кто-то выбрать «store1» или «store2», я хотел бы получить информацию о Store, используя StoreController и сделать эти переменные доступны все контроллеры и представления. Где я могу использовать следующий URL

www.mysite.com/employees -> will list all employees from "Depending of the SELECT" 
www.mysite.com/employees/create -> will create employee to "Depending of the SELECT" 
www.mysite.com/financial -> will list all financial widgets with data from "Depending of the SELECT" 

Я прочитал о View Composer, фасадах, ServiceProvide, и я получил действительно путают обо всех из них.

ответ

1

Это не так уж и сложно. Есть могут быть и другие методы, но я предпочитаю делать это таким образом:

Sharing данных:

Открыть app/Http/Controllers/Controller.php и добавить aconstructor функцию следующим образом:

<?php 

namespace App\Http\Controllers; 

... 

abstract class Controller extends BaseController 
{ 
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests; 

    public function __construct() 
    { 
     $this->sharedVar = "I am shared.."; // to share across controllers 
     view()->share('sharedVar',$this->sharedVar); // to share across views 
    } 
} 

Использование данных:

1. В контроллерах:

Все контроллеры расширяют вышеуказанный контроллер. Таким образом, свойство доступно для всех контроллеров:

class YourController extends Controller 
{ 
    public function index() 
    { 
     dd($this->sharedVar); 
    } 
... 
} 

2. В Просмотры:

{{$sharedVar}} // your-view.blade.php 

EDIT:

Если вы хотите, чтобы обмениваться данными с другими местами, чем контроллеры и виды, лучшим способом, возможно, является использование AppServiceProvider:

Открыть app/Providers/AppServiceProvider.php и обновить boot() метод:

class AppServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     $this->app->singleton('sharedVariable', function() { 
      return "I am shared"; 
     }); 
    } 

    ... 

} 

Usage:

dd(app('sharedVariable')); // anywhere in the application 
+0

Мне понравился этот, но единственная «проблема» (по крайней мере, для меня хе-хе) - использовать виджеты плагинов, которые расширяют AbstractWidget. Будет ли он там доступен? –

+1

Пожалуйста, обратитесь к редакции – Naveed

+0

Отлично, спасибо большое. Так что это привело меня к другому вопросу. Например, всякий раз, когда кто-то выбирает Store 1, я буду вызывать POST/GET StoreController для извлечения всех данных из этого хранилища и как я могу поделиться этой информацией динамически? Как я могу передать объект в качестве параметра ServiceProvider? –

1

Вы можете также общие данные от провайдера, например. AppServiceProvider или вашим собственным провайдером. здесь, например, AppServiceProvider. В AppServiceProvider методом загрузки:

public function boot() 
{ 
    $this->passCommonDataToEverywhere(); 
} 

Теперь писать в методе:

protected function passCommonDataToEverywhere() 
{ 
    // Share settings 
    $this->app->singleton('settings', function() { 
     return Setting::first(); 
    }); 
    view()->share('settings', app('settings')); 

    // Share languages 
    $this->app->singleton('languages', function() { 
     return Language::orderBy('weight', 'asc')->get(); 
    }); 
    view()->share('languages', app('languages')); 
} 

В этом примере я должен использовать:

use App\Language; 
use App\Setting; 
+0

Привет, Спасибо за ответ. Всякий раз, когда я выбираю хранилище в top.blade.php, как мне вызвать этот ServideProvider с переменной? общественная функция boot() { $ this-> ShareStore(); } защищенная функция passCommonDataToEverywhere ($ ID) { настройки // Share $ this-> app-> синглтон ('магазин', функция() { возвращение Store :: где ('ID', $ ID); }); view() -> share ('store', app ('store')); } –

+0

'публичную функцию загрузки (маршрутизатор $ маршрутизатор) { $ router-> Bind ('идентификатор', функция ($ ID) { $ this-> ShareStore ($ ID); }); } ' Но я думаю, вы должны использовать его осторожно, так как теперь он зависит от параметра {$ id} –

0

Иам интересно, если следующий будет возможно :

-- StoreController 

public function BindStore($id) 
{ 
    $store = Store::where('id', $id); 
    App::singleton('store', $store); 
} 

Или, может быть, с использованием услуг

 Смежные вопросы

  • Нет связанных вопросов^_^