Zend的MVC机制使用分析(一)_PHP
代码
复制代码 代码如下:
$front = Zend_Controller_Front::getInstance();
Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));
$front->setRequest(new USVN_Controller_Request_Http());
$front->throwExceptions(true);
$front->setBaseUrl($config->url->base);
$router = new Zend_Controller_Router_Rewrite();
$routes_config = new USVN_Config_Ini(USVN_ROUTES_CONFIG_FILE, USVN_CONFIG_SECTION);
$router->addConfig($routes_config, 'routes');
$front->setRouter($router);
$front->setControllerDirectory(USVN_CONTROLLERS_DIR);
Zend_Controller_Front::getInstance()->dispatch();
分析
首先看下Zend_Controller_Front::getInstance是调用单例模式,实例化了它的内部属性_plugins,实例化了一个Zend_Controller_Plugin_Broker类。
这个类是管理front的插件的类。先看一个Front中的方法public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)
意思是如果你有一个自己的插件要插入使用的话,调用这个函数能把你自己的插件委托给Zend_Controller_Plugin_Broker使用。
如果你有愿望继续跟下去你会看到注册插件做的一件最根本的事情就是把request和response放入到你的插件中去(setRequest和setResponse)。
class Zend_Controller_Plugin_Broker extends Zend_Controller_Plugin_Abstract
这个实现了抽象类Zend_Controller_Plugin_Abstract。
Zend_Controller_Plugin_Abstract是所有插件的抽象类,所有用户自己定义的插件或者Zend已有的插件都要从这个类继承。这里就看到了,前端控制器Front就是使用broker作为用户插件注册。
这个抽象类可以被实现的函数有:
routeStartup: 在路由发送请求前被调用
routeShutdown:在路由完成请求后被调用
dispatchLoopStartup:在进入分发循环(dispatch loop)前被调用
Predispatch:在动作由分发器分发前被调用
postdispatch:在动作由路由器分发后被调用
dispatchLoopShutdown:在进入分发循环(dispatch loop)后被调用
我们还看到了getRequest, getResponse两个方法,我们可以通过他们分别从控制器中获取request对象和response对象
好了,扯远了,回到最开始的代码,Zend_Controller_Front::getInstance实际上来看做的事情就是注册了一个broker插件放到$front中。
下面一行代码
Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));
看到Zend/Layout.php中,startMvc做了两件事:首先是调用自己的构造函数来实例化自己(切记带着initMvc参数为true),然后是设置参数。
Zend_Layout的构造函数比较复杂,就跟到里面看看。首先也是设置传递进来的参数$options,我们这个例子中是传递进来Array ( [layoutPath] => /var/www/html/usvn/app/layouts )这个array作为options,构造函数就是调用$this->setOptions($options);
这个setOptions做的事是根据array的每个key,调用$this->set$key($val);也就是说,以上面的例子来说,setOptions调用了setLayoutPath("/var/www/html/usvn/app/layouts")
顺藤摸瓜,setLayoutPath的功能是设置自己类的this->_layout为"/var/www/html/usvn/app/layouts", 然后设置_enable为true;这两个属性记住,以后会有使用的。
回退到Zend_Layout的构造函数,初始化options之后是调用了_initVarContainer();
这个函数做了这么个事情:
$this->_container = Zend_View_Helper_Placeholder_Registry::getRegistry()->getContainer(__CLASS__);
又出现了Zend_View_Helper_Placeholder_Registry(我翻译为:Zend视图助手注册表)
getRegistry() 将Zend_View_Helper_Placeholder_Registry作为key,Zend_View_Helper_Placeholder_Registry类的实例作为value注册到之前见过的Zend_Registry中。这个类的构造函数就什么事都没有。
getRegistry()返回了Zend_View_Helper_Placeholder_Registry实例,下面调用getContainer(__CLASS__)。 这里的__CLASS__是什么,当前调用的类,自然就是Zend_Layout了。这里是getContainer("Zend_Layout")
进入到getContainer里面,它调用了createContainer("Zend_Layout")。createContainer("Zend_Layout")是在Registry中以Zend_Layout为key,Zend_View_Helper_Placeholder_Container类为value的array。
Zend_View_Helper_Placeholder_Container实现抽象类Zend_View_Helper_Placeholder_Container_Abstract,这个抽象类实际上也是一个ArrayObject,这个在之前的文章有提到过了,是一个和泛型类一样的东东。
好了,这里不跟下去了,回头到Zend_Layout的构造函数
_initVarContainer结束了,下面是调用两个重要的函数:
$this->_setMvcEnabled(true);
$this->_initMvc();
Mvc大家一定很熟悉,我们来看看这里是怎么个MVC的
setMvcEnabled没什么特别,设置标志位this->_mvcEnabled
_initMvc做了两件事,_initPlugin和_initHelper。
先看initPlugin:
获取PluginClass,这里的pluginClass就是Zend_Layout_Controller_Plugin_Layout,可以看到,这里是作为一个插件的形式放进来的。
接着又获取了Zend_Controller_Front的实例,调用:
$front->registerPlugin(
new $pluginClass($this),
99
);
记得前面对Zend_Controller_Front的分析不?里面有registerPlugin的函数,是将插件委托给front的broker来用。有人就会问后面的99是什么意思?是插件的索引顺序,越后面的插件越后执行插件的动作。
下面再看_initHelper:
获取helperClass,这里的helperClass就是Zend_Layout_Controller_Action_Helper_Layout
if (!Zend_Controller_Action_HelperBroker::hasHelper('layout')) {
。。。
Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-90, new $helperClass($this));
}
如果Action_HelperBroker没有layout的helper的话
就执行下面的offsetSet命令。将-90和Zend_Layout_Controller_Action_Helper_Layout实例作为参数传入。
和plugin同样的关系,将Zend_Layout_Controller_Action_Helper_Layout实例作为value存入到this->_helpersByPriority和this->_helpersByNameRef去了
前面的-90是权重,也是要保证这个helper是最后调用(看最后一行是krsort排序)
好了,Layout的构造函数就这样分析结束了。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











소개 오늘날 빠르게 발전하는 디지털 세계에서는 강력하고 유연하며 유지 관리가 가능한 웹 애플리케이션을 구축하는 것이 중요합니다. PHPmvc 아키텍처는 이러한 목표를 달성하기 위한 이상적인 솔루션을 제공합니다. MVC(Model-View-Controller)는 애플리케이션의 다양한 측면을 독립적인 구성 요소로 분리하는 널리 사용되는 디자인 패턴입니다. MVC 아키텍처의 기초 MVC 아키텍처의 핵심 원칙은 관심사 분리입니다. 모델: 애플리케이션의 데이터와 비즈니스 로직을 캡슐화합니다. 보기: 데이터 표시 및 사용자 상호 작용 처리를 담당합니다. 컨트롤러: 모델과 뷰 간의 상호 작용을 조정하고 사용자 요청과 비즈니스 로직을 관리합니다. PHPMVC 아키텍처 phpMVC 아키텍처는 전통적인 MVC 패턴을 따르지만 언어별 기능도 도입합니다. 다음은 PHPMVC입니다.

PHP 구현 프레임워크: ZendFramework 입문 튜토리얼 ZendFramework는 PHP에서 개발하고 현재 ZendTechnologies에서 유지 관리하는 오픈 소스 웹 사이트 프레임워크입니다. ZendFramework는 MVC 디자인 패턴을 채택하고 Web2.0 애플리케이션 및 Web Serve 구현을 지원하기 위한 재사용 가능한 코드 라이브러리 시리즈를 제공합니다. ZendFramework는 PHP 개발자들에게 매우 인기 있고 존경받고 있으며 다양한 기능을 갖추고 있습니다.

Zend Framework에서 권한 제어를 위해 ACL(AccessControlList)을 사용하는 방법 소개: 웹 애플리케이션에서 권한 제어는 중요한 기능입니다. 이는 사용자가 액세스 권한이 있는 페이지와 기능에만 액세스할 수 있도록 하고 무단 액세스를 방지합니다. Zend 프레임워크는 ACL(AccessControlList) 구성 요소를 사용하여 권한 제어를 구현하는 편리한 방법을 제공합니다. 이 기사에서는 Zend Framework에서 ACL을 사용하는 방법을 소개합니다.

MVC 아키텍처(Model-View-Controller)는 코드를 구성하고 WEB 애플리케이션 개발을 단순화하기 위한 명확한 구조를 제공하기 때문에 PHP 개발에서 가장 널리 사용되는 패턴 중 하나입니다. 기본 MVC 원칙은 대부분의 웹 애플리케이션에 충분하지만 복잡한 데이터를 처리하거나 고급 기능을 구현해야 하는 애플리케이션에는 몇 가지 제한 사항이 있습니다. 모델 계층 분리 모델 계층을 분리하는 것은 고급 MVC 아키텍처에서 일반적인 기술입니다. 여기에는 모델 클래스를 더 작은 하위 클래스로 나누는 작업이 포함되며, 각 하위 클래스는 특정 기능에 중점을 둡니다. 예를 들어 전자 상거래 애플리케이션의 경우 기본 모델 클래스를 주문 모델, 제품 모델 및 고객 모델로 나눌 수 있습니다. 이러한 분리는 코드 유지 관리성과 재사용성을 향상시키는 데 도움이 됩니다. 의존성 주입 사용

MVC(Model-View-Controller) 패턴은 개발자가 코드를 더 잘 구성하고 관리하는 데 도움이 될 수 있는 일반적으로 사용되는 소프트웨어 디자인 패턴입니다. MVC 패턴은 애플리케이션을 모델, 뷰, 컨트롤러의 세 부분으로 나누고 각 부분에는 고유한 역할과 책임이 있습니다. 이번 글에서는 PHP를 사용하여 MVC 패턴을 구현하는 방법에 대해 설명합니다. 모델 모델은 애플리케이션의 데이터 및 데이터 처리를 나타냅니다. 대개,

SpringMVC 프레임워크 복호화: 왜 그렇게 인기가 있으며 특정 코드 예제가 필요합니까? 소개: 오늘날의 소프트웨어 개발 분야에서 SpringMVC 프레임워크는 개발자들 사이에서 매우 인기 있는 선택이 되었습니다. MVC 아키텍처 패턴을 기반으로 하는 웹 프레임워크로 유연하고 가볍고 효율적인 개발 방법을 제공합니다. 이 기사에서는 SpringMVC 프레임워크의 매력을 자세히 살펴보고 특정 코드 예제를 통해 그 강력함을 보여줍니다. 1. SpringMVC 프레임워크의 장점 유연한 구성 방식 Spr

PHP가 ZendOptimizer를 인식하지 못합니다. 어떻게 해결합니까? PHP 개발 중에 PHP가 ZendOptimizer를 인식하지 못하는 상황이 발생할 수 있으며, 이로 인해 일부 PHP 코드가 제대로 실행되지 않을 수 있습니다. 이 경우 문제를 해결하기 위해 몇 가지 조치를 취해야 합니다. 아래에는 몇 가지 가능한 해결 방법과 특정 코드 예제가 설명되어 있습니다. 1. ZendOptimizer가 올바르게 설치되었는지 확인: 먼저 ZendOptimizer가 올바르게 설치되었는지 확인해야 합니다.

Windows 2003 설치 패키지에는 Zend, PHP5.2.17, PHPWind8.7 및 PHPMyadmin3.5.2가 포함되어 있습니다. 설치 패키지를 직접 다운로드하여 리소스 검색 시간을 절약할 수 있습니다. 하지만 MySQL은 업로드 제한을 초과했기 때문에 MySQL 공식 웹사이트에 가서 다운로드해야 합니다. 그런 다음 아래와 같이 압축을 풀고 D 드라이브에 복사합니다. MySQLinDdisk WindowsIIS+FTP 설치 및 구성 시작>제어판>프로그램 추가/제거를 클릭합니다.PG 추가 또는 삭제 Windows 구성 요소 추가/제거(A)를 클릭합니다. 추가고르데
