在php Mvc Structure中的类new Instanse

时间:2019-06-23 06:11:58

标签: php model-view-controller

我使用MVC结构处理自己的项目,并使用composer使用PSR-4处理自动加载类。我为路由器引擎选择了Php Fastroute库。

我的结构是:

enter image description here

index.php

define('DS', DIRECTORY_SEPARATOR, true);
define('BASE_PATH', dirname(__DIR__) . DS, TRUE);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require '../vendor/autoload.php';
require '../application/core/Core.php';

// Our framework is now handling itself the request
$app = new Framework\Core();

$response = $app->handle();

控制器:

namespace App\Core;

class Controller
{

    public $templates;

    public function __construct()
    {

        // My Question
        $this->config = new \App\Core\Setting();
        $this->Language = new Language('en');
        $this->Url = new \App\Core\Url(Config::get('URL'),Config::get('URL'));
        $this->templates = new \League\PlatesEngine(Config::get('PATH_VIEW'));
        $this->Document = new \App\Core\Document();
    }

    public function loadModel($name, $path = null) {

        $path = ($path === null) ? 'Catalog' : $path;

        $path = '\App\\'.$path.'\Model\\'.$name;

        $this->model = new $path;

        return $this->model;

    }

    public function loadController($name) {

        $path = '\App\Catalog\Controller\\'.$name;

        $this->controller = new $path;

        return $this->controller;

    }
}

IndexController:

namespace App\Catalog\Controller\Home;

class IndexController extends \App\Core\Controller
{
    public function index()
    {
        $add['power'] = $this->config->get('on');
        $data['title'] = $this->Language->get('text_title');
        $this->templates->addData($data, 'common/header');
        //.... More Code
    }
}

在操作中,我将类的新实例(库和核心类,即:Config或Ducoment或Templates或更多,如果需要...)放在Bridge __construct()的{​​{1}}中,并扩展了{{1} }。这个模型对我有用,但是我不知道这个方法是对还是错?实际上,我需要将Object(新实例)从Core类加载到我的Controller中,但是我不知道它将放置在哪里(更好和更合适)? (在IndexController-在IndexController-在Base Controller-在IndexController中)?

1 个答案:

答案 0 :(得分:0)

我想为您提供一些如何使用PHP构建MVC 2 Web应用程序的想法:

目录结构

使用

之类的PHP(FIG)标准
  • 现代编码样式(PSR-1,PSR-2,PSR-12)
  • PHPDoc标准(PSR-5,PSR-19)
  • 自动加载机(PSR-4)
  • HTTP请求和响应(PSR-7)
  • HTTP服务器请求处理程序,中间件(PSR-15)
  • HTTP工厂(PSR-17)
  • 依赖注入容器(PSR-11):联赛/容器

其他有用的技巧和库:

  • 使用路由器:我会推荐联赛/路线(基于快速路线)
  • 单个动作控制器(ADR
  • 记录(PSR-3):monolog / monolog
  • 数据库迁移:Phinx
  • 日期和时间处理:计时
  • 控制台命令:Symfony /控制台
  • 单元测试:PHPUnit

对您的问题:

  • 不再使用继承(扩展)(如果可能的话),而使用组合(依赖注入)。
  • 使用构造函数注射
  • 不要自己创建实例,而是让依赖项注入容器(DIC)处理此任务。
  • 默认将您的类设置为“最终”(存储库类除外)
  • 您的控制器应该只能处理一件事情(SRP)。一个动作控制器将更符合SOLID。
  • 您确定所有控制器属性都必须是公共的吗?
  • 对我来说,“模型”一词听起来像是“ Active Record反模式”。也许认为“存储库”是更好的解决方案。