Как использовать Illuminate Database Query Builder & Eloquent в других средах с PHP 5.3.x
В прошлом я занимался парой проектов с Laravel, но теперь мне нужно что-то очень легкое для проекта, и я перешел на использование Slim, он отлично работает для того, что мне нужно, и я хочу замечательный Eloquent ORM и Query Builder из Laravel, не могу обойдемся без него сейчас:) Теперь мне удается заставить все это работать с композитором, используя информацию, которую Тейлор отобразил на своем GitHub, скопировал свой кусок кода
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection([
'driver' => 'mysql',
'host' => 'localhost',
'database' => '',
'username' => '',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
]);
// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
$capsule->setEventDispatcher(new Dispatcher(new Container));
// Set the cache manager instance used by connections... (optional)
$capsule->setCacheManager(...);
// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();
// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
$capsule->bootEloquent();
Это прекрасно работает на моем локальном dev (PHP 5.4.x), но когда я помещаю его на мой сервер PHP 5.3.x, он просто больше не работает:(Теперь я вижу одну проблему в том, что мы не можем использовать анонимный массив как это []
но вместо этого должен быть написан старый способ array()
, то есть внутри addConnection(array($settings))
отлично, теперь немного дальше... но потом после того, как он, кажется, падает внутри $capsule->setEventDispatcher()
и у меня нет журналов на моем сервере (я только нашел через var_dump() здесь и там), это просто NAS, и я не хочу даже думать о том, чтобы потратить несколько часов, просто чтобы узнать, как его включить. Но что забавно, у меня был проект Laravel 4, работающий с ним... так зачем просто создавать его часть Illuminate\Database
не работает тогда? Я также нашел другой кусок кода, чтобы заставить Eloquent ORM работать в PHP 5.3.x
$settings = array(
'driver' => '',
'host' => '127.0.0.1',
'database' => '',
'username' => '',
'password' => '',
'charset' => "utf8",
'collation' => 'utf8_general_ci',
'prefix' => ''
);
// Bootstrap Eloquent ORM
$connFactory = new \Illuminate\Database\Connectors\ConnectionFactory(new Illuminate\Container\Container);
$conn = $connFactory->make($settings);
$resolver = new \Illuminate\Database\ConnectionResolver();
$resolver->addConnection('default', $conn);
$resolver->setDefaultConnection('default');
\Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver);
но если я использую этот кусок кода, что хорошо с моделями, кстати. Мне нужно использовать $conn->table('...')...
вместо фасада простой способ DB::table(....)
что я хочу, почему это важно, что бы вы сказали? Ну, что если я захочу перейти на Laravel в будущем... Мне придется изменить все $conn->
в DB::
поэтому я предпочел бы сделать это правильно с первого раза. Если кто-то знает, как создать Facade на втором фрагменте кода, я тоже был бы рад... Спасибо за любую помощь.
3 ответа
Я также использую капсулу с Slim. Прежде всего, убедитесь, что вы используете версию 4.1.* Illuminate/Capsule. Когда вышла 4.2, одним из больших изменений было то, что PHP 5.4 стал необходимым минимумом. 4.1 все еще будет работать с PHP 5.3.
Теперь, если вы сделали это, но у вас все еще есть проблемы, я зарегистрировал капсулу в контейнере IoC Slim:
$app->container->singleton('capsule', function() use ($config) {
$capsule = new Illuminate\Database\Capsule\Manager;
$capsule->setFetchMode(PDO::FETCH_OBJ);
$capsule->addConnection($config['database']);
$capsule->bootEloquent();
return $capsule->getConnection();
});
Обратите внимание на призыв к getConnection()
, Это необходимо, поскольку Capsule global не регистрируется.
Изменить: также обратите внимание на звонок setFetchMode
, При использовании Fluent из Laravel запросы возвращают экземпляры stdClass, но поведение по умолчанию, как представляется, возвращает ассоциативные массивы. Фреймворк просто переопределяет это в какой-то момент, что приводит к тому, что Capsule ведет себя корректно, но неожиданно Это заставляет его работать с более ожидаемым поведением.
Посмотрите на соединитель источника данных Laravel в PPI 2.1
https://github.com/ppi/framework/tree/2.1/PPI/DataSource/Connection
Использование версии 4.1 программы "Светить / база данных"... простой случай с одним подключением:
// $app is a Slim instance
// add db connection parameters to the app config using mysql / utf8
$app->config(array(
'db' => array(
'driver' => 'mysql',
'host' => 'locahost',
'database' => 'mydbname',
'username' => 'myuser',
'password' => 'mypass',
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'options' => array(
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
),
'prefix' => '',
),
));
// make sure we always use the same service instance
$app->container->singleton('capsule', function($c) use($app) {
$capsule = new \Illuminate\Database\Capsule\Manager();
$capsule->addConnection($params);
return $capsule;
});
// USE IT ANYWHERE the slim $app instance or the slim app container are visible
$capsule = $app->capsule;
// ...or if $c is the container
// $capsule = $c->get('capsule');
$people = $capsule->table('person')->take(10)->get();
Альтернативный простой в использовании построитель запросов к базе данных:
- doctrine / dbal (кстати, подсветка / база данных использует доктрину dbal connection)
- zendframework / zend-db (также предоставляет классы шлюза данных таблицы / шлюза данных строки)
- j4mie / idiorm