php - 如何从中间件向 Laravel 的 IOC 容器添加对象

标签 php laravel laravel-5 ioc-container

我想在我的中间件中创建一个对象(在本例中,是来自 Eloquent 查询的集合),然后将它添加到 IOC 容器中,这样我就可以在我的 Controller 中使用类型提示方法签名来访问它。

这可能吗?我在网上找不到任何例子。

最佳答案

您可以通过几个步骤轻松完成此操作。

创建新的中间件(随意命名)

php artisan make:middleware UserCollectionMiddleware

创建将扩展 Eloquent 数据库集合的新集合类。此步骤不是必需的,但可以让您将来使用不同的集合类型创建不同的绑定(bind)。否则,您只能对 Illuminate\Database\Eloquent\Collection 进行一次绑定(bind)。

app/Collection/UserCollection.php

<?php namespace App\Collection;

use Illuminate\Database\Eloquent\Collection;

class UserCollection extends Collection {

}

将您的绑定(bind)添加到 app/Http/Middleware/UserCollectionMiddleware.php

<?php namespace App\Http\Middleware;

use Closure;
use App\User;
use App\Collection\UserCollection;

class UserCollectionMiddleware {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        app()->bind('App\Collection\UserCollection', function() {
            // Our controllers will expect instance of UserCollection
            // so just retrieve the records from database and pass them
            // to new UserCollection object, which simply extends the Collection
            return new UserCollection(User::all()->toArray());
        });

        return $next($request);
    }

}

不要忘记将中间件放在所需的路由上,否则会出错

Route::get('home', [
    'middleware' => 'App\Http\Middleware\UserCollectionMiddleware',
    'uses' => 'HomeController@index'
]);

现在您可以像这样在您的 Controller 中键入提示此依赖项

<?php namespace App\Http\Controllers;

use App\Collection\UserCollection;

class HomeController extends Controller {

    /**
     * Show the application dashboard to the user.
     *
     * @return Response
     */
    public function index(UserCollection $users)
    {
        return view('home', compact('users'));
    }

}

关于php - 如何从中间件向 Laravel 的 IOC 容器添加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30538370/

相关文章:

php - 如何在 symfony 4 中启用分析器

php - Laravel Eloquent,如何从多对多关系中选择某种类型的用户

php - 代码覆盖率只覆盖一个测试而不是所有套件

ajax - AJAX CORS 的 Laravel CSRF token

php - 保护 PHP 源代码

尝试将文件上传到服务器时 PHP SSH2 操作失败

php - 使用两个同名的类

laravel-5 - 如何在 API 身份验证中仅允许 Bearer token ?

composer-php - 如何使用 Composer 将 Require 打包到 Laravel 项目中

php - Laravel 5 返回 JSON 或 View 取决于是否使用 ajax