Laravel 5:如何让资源控制器所有方法共享branch变量至视图?
branch Variable to Every View in a Resource Controller Since you need to perform custom operations on the branch variable in each controller method before passing it to the view, here are a couple of clean, non-repetitive approaches tailored to your needs:
1. Create a Reusable Helper Method in the Controller
Define a private method in your resource controller to handle branch manipulation and share it with the view. You can call this method at the end of each action (or right before returning the view) to ensure the variable is always available, while still allowing custom tweaks per method.
Example:
class YourResourceController extends Controller { private function prepareBranchForView($customAdjustment = null) { // Start with base branch fetch or setup $branch = Branch::findOrFail(auth()->user()->branch_id); // Apply method-specific manipulation if needed if ($customAdjustment) { $branch->active_items = $customAdjustment; // Example tweak } // Share the finalized variable with all views from this controller view()->share('branch', $branch); } public function index() { // Index-specific logic $activeItems = Item::where('branch_id', auth()->user()->branch_id)->count(); $this->prepareBranchForView($activeItems); return view('resources.index'); } public function show($id) { // Show-specific logic $this->prepareBranchForView(); // No custom adjustment needed here return view('resources.show', ['resource' => Resource::find($id)]); } // Repeat for create, store, edit, update, destroy with method-specific tweaks }
This keeps your code DRY while giving you full control over how branch is modified in each action.
2. Use Controller Middleware (For Shared Base Logic)
If most of your branch manipulation follows a consistent pattern (with only minor per-method changes), a custom middleware can handle the base setup, and you can tweak the variable in individual methods as needed.
First, create the middleware:
php artisan make:middleware ShareBranchWithViews
Then, add your base branch logic to the middleware's handle method:
public function handle(Request $request, Closure $next) { // Base branch setup $branch = Branch::where('id', auth()->user()->branch_id)->with(['settings'])->firstOrFail(); // Share with all views rendered after this middleware runs view()->share('branch', $branch); return $next($request); }
Register the middleware in app/Http/Kernel.php:
protected $routeMiddleware = [ // ... other existing middleware 'share.branch' => \App\Http\Middleware\ShareBranchWithViews::class, ];
Apply it to your resource controller via the constructor:
class YourResourceController extends Controller { public function __construct() { $this->middleware('share.branch'); } public function edit($id) { // Modify the shared branch variable for the edit view $branch = view()->shared('branch'); $branch->edit_mode = true; return view('resources.edit', ['resource' => Resource::find($id)]); } // Other methods can adjust the shared branch as required }
This approach works best when most of your branch logic is the same across methods, and you only need small, action-specific changes.
内容的提问来源于stack exchange,提问作者Sunny Kumar

