Создание блога

firep91613

Новичок
То же и по отдельным классам, в идеальном мире у тебя для каждого действия один класс с одним публичным методом, инъекции зависимостей через конструктор и __invoke() запускающий код.
Ок. Как тогда лучше передать? Вот контроллер главной страницы. Он использует модель PostsModel, этой модели надо передать экземпляр класса Db.
PHP:
<?php

namespace App\Controllers;

use \App\Models\PostsModel;

class HomePageController
{
    private PostsModel $postModel;

    public function __construct()
    {
        $this->postModel = new PostsModel();
    }

    public function index(): void
    {
        $posts = $this->postModel->getAllPosts();
        require_once VIEWS . '/home.php';
    }
}
Вот автозагрузка и маршрут:
PHP:
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/bootstrap.php';
require_once __DIR__ . '/../config/constants.php';

$router->get('', [HomePageController::class, 'index']);
В контейнер сунул Db.
PHP:
<?php

use \App\Classes\ServiceContainer;
use \App\Classes\Db;

$container = new ServiceContainer();

$container->setService(Db::class, function () {
    $db_config = include CONFIG . '/db_config.php';
    return new Db($db_config);
});
Я передавал $container в Router, из роутера в контроллер, из контроллера в модель. Но это же бред полный? Как грамтно в модель передавать без идеотизма? Нужен отдельный класс со статическим методом, где лежат сервисы все? Я чет запутался...
 

miketomlin

Новичок
Стоит ли вид делать классом?
Нет нужды. Достаточно набора ф-ций.

Но это же бред полный?
Не полный. Но неудобно. Мы же это уже обсуждали. Когда я «вещал» про реестр и т.п.

Можешь прямо во фронте инициализировать твой БД-шный объект и запихнуть его в реестр, а потом извлекать при обращении к твоим БД-шным методам. Помнишь db()->query('SELECT 1')?

Вот вообще через глоб. переменную: query. Фу-фу-фу, но принцип тот же. И эта обертка использует стандартный БД-шный объект, но разницы опять-таки нет. При использовании своего БД-шного объекта ты обычно инкапсулируешь стандартный.

При использовании DI можно использовать автомонтирование (автосвязывание, автовайринг).
 
Последнее редактирование:

firep91613

Новичок
Можешь прямо во фронте инициализировать твой БД-шный объект и запихнуть его в реестр, а потом извлекать при обращении к твоим БД-шным методам. Помнишь db()->query('SELECT 1')?
А, да, я что-то совсем забыл про это...
При использовании DI можно использовать автомонтирование (автосвязывание, автовайринг).
PHP:
$container->setService(HomePageController::class, function ($container) {
    return new HomePageController($container->getService(Db::class));
});
PHP:
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/bootstrap.php';
require_once __DIR__ . '/../config/constants.php';
$router->get('', [$container->getService(HomePageController::class), 'index']);
Это имеется ввиду?
 

firep91613

Новичок
Я тут статейку на хабре прочитал. И пришел к выводу, что модели нужно явно передавать класс Db, контроллену нужно передавать класс модели.
PHP:
<?php

use \App\Classes;
use \App\Controllers;
use \App\Models;

$container = new Classes\ServiceContainer();

$container->setService(Classes\Db::class, function () {
    $db_config = include CONFIG . '/db_config.php';
    return new Classes\Db($db_config);
});

$container->setService(Models\PostsModel::class, function ($container) {
    return new Models\PostsModel($container->getService(Classes\Db::class));
});

$container->setService(Controllers\HomePageController::class, function ($container) {
    return new Controllers\HomePageController($container->getService(Models\PostsModel::class));
});
Так же лучше? Все четко разложено, кто от кого зависит. В роутере просто достать нужный сервис.
 
Сверху