Как интегрировать прыщ в пользовательские рамки MVC?

У меня есть базовый фреймворк, похожий на 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 на каждом контроллере. Как это сделать правильно?

0

Решение

Мой ответ не был актуален, хотя принцип абстрактных классов остается интересным. Сейчас:

Я хотел бы использовать 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);
3

Другие решения

Просто расширьте класс 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']);

я надеюсь, что ты хочешь 🙂 ура

-2

По вопросам рекламы [email protected]