У меня есть базовый фреймворк, похожий на mvc, и я хотел бы использовать pimple для внедрения зависимости, но я не знаю, как использовать его внутри фреймворка. Это моя структура приложения.
x-framework
- config
- app
controller
homeController.php
- core
- vendor
pimple
lib
pimple.php
- public
Сейчас в homeController.php
Я хотел бы использовать прыщ, но на самом деле не делая new Pimple
как видно в этом примере.
use vendor\pimple;
class homeController
{
function index(){
$app = new Pimple();
$app['orm'] = $app->share({ return new vendor\orm; });
$orm = $app['orm'];$orm->table('foo');
$orm->findFirst(['name'=>'john']);
}
}
Кажется, как видно из этого примера, было бы очень громоздкой задачей инициализировать класс pimple на каждом контроллере. Как это сделать правильно?
Мой ответ не был актуален, хотя принцип абстрактных классов остается интересным. Сейчас:
Я хотел бы использовать Pimple, но без создания нового Pimple, как показано в этом примере.
В какой-то момент вам нужно создать экземпляр объекта, если вы хотите его использовать.
Прыщ использует контейнер для хранить и извлекать услуги и параметры:
$container = new \Pimple\Container();
// define some services
$container['session_storage'] = function ($c) {
return new SessionStorage('SESSION_ID');
};
этот пример из документа определяет анонимную функцию, которая возвращает объект хранения сеанса
Прыщ или любой контейнер можно сделать доступным с помощью схема внедрения зависимостей.
либо передать его в качестве параметра в индекс
function index(\Pimple $app){
или передать его homeController
конструктор
function __construct(\Pimple $app){
$this->app = $app;
затем использовать его как свойство или переменную
$orm = $app['orm']; // through index() parameters
$orm = $this->app['orm']; // through constructor
абстрактные классы позволяют вам определять метод для каждого расширяющегося класса или заставлять каждый расширяющий класс определять метод.
здесь мы определяем конструктор для каждого расширяющегося класса, печатая класс Pimple так, чтобы php гарантировал, что ваш контроллер получит реальный объект pimple
abstract class Pimpleized {
function __construct(\Pimple $pimple) {
$this->app = $pimple;
}
}
тогда ваш контроллер
class homeController extends Pimpleized {
function foo() {
$this->app->accessSomePimpleMethod();
}
}
Таким образом, вам нужно только создать свой Pimple
один раз, затем передайте его своим контроллерам:
$pimp = new Pimple();
$controller = new homeController($pimp);
Просто расширьте класс HomeController с помощью прыща
class HomeController extends Pimple {
public function __construct() {
$this['orm.class']= 'vendor\orm';
$this['orm'] = $this->share(function($c){ return new $c['orm.class']; });
}
}
//and use it directly just after instanciation
$controller = new HomeController();
// you can modify parameters if you need
$controller['orm.class'] = 'myothervendor\orm';
//And get class
$orm = $controller['orm'];
$orm->table('foo');
$orm->findFirst(['name'=>'john']);
я надеюсь, что ты хочешь 🙂 ура