Я написал свой код, чтобы создать экземпляр Eloquent Capsule / Manager, используя slim DI.
$container['db'] = function ($c) { $settings = $c->get('database'); $db = new \Illuminate\Database\Capsule\Manager; $db->addConnection($settings); $db->setAsGlobal(); $db->bootEloquent(); return $db; }
И у меня есть мой маршрут, как это
$app->get('/adduser', function() { $user = new Users; $user->name = "Users 1"; $user->email = "user1@test.com"; $user->password = "My Passwd"; $user->save(); echo "Hello, $user->name !"; });
Когда я запускаю маршрут в браузере, это приведет к ошибке в журнале ошибок веб-сервера
PHP Неустранимая ошибка: вызов функции-функции-члена () для не-объекта в /home/***/vendor/illuminate/database/Eloquent/Model.php в строке 3335
По-моему, это происходит потому, что Eloquent Capsule / Manager не запускается, чтобы создать экземпляр DI.
Я нашел решение для решения этой проблемы, объявив модель с настраиваемым конструктором, как это
use Illuminate\Database\Eloquent\Model as Eloquent; use Illuminate\Database\Capsule\Manager as Capsule; class Users extends Eloquent { protected $table = 'users'; protected $hidden = array('password'); public function __construct(Capsule $capsule, array $attributes = array()) { parent::__construct($attributes); } }
Но я не думаю, что это чистые решения, потому что я должен переписать все мои модели с помощью пользовательского конструктора.
Мне нужна помощь в поиске решений для моей проблемы. Я пытаюсь использовать код ниже:
$app->get('/adduser', function() use ($some_variable) { // create user script });
но до сих пор я не знаю, как с помощью этого метода запускать $container['db']
. Я очень ценю помощь здесь.
Вероятно, не рекомендуется вводить менеджера капсул в каждую модель. Как вы сами говорите, это будет болью для управления. Вы пробовали этот код за пределами закрытия? то есть. в начальной части вашего приложения.
$db = new \Illuminate\Database\Capsule\Manager; $db->addConnection($settings); $db->setAsGlobal(); $db->bootEloquent();
Функция setAsGlobal
делает экземпляр Capsule Manager статическим, поэтому модели могут получить доступ к нему по всему миру. Просто отметим, что соглашение – это назвать ваши классы моделей в единственной форме. то есть. Пользователь, а не Пользователи.