Zend 프레임 워크-퀵 가이드
PHP 웹 프레임 워크는 웹 애플리케이션을 개발하는 데 도움이되는 클래스 모음입니다. Zend는 가장 인기있는 PHP 프레임 워크 중 하나입니다. 이것은open-source MVC framework빠르게 개발되는 최신 웹 애플리케이션 용. Zend 프레임 워크에는 느슨하게 결합 된 여러 구성 요소가 있으므로 "구성 요소 라이브러리"라고합니다. Zend Framework는 Zend 프레임 워크 애플리케이션을 실행하기 위해 모든 PHP 스택과 Zend 서버를 제공합니다.
Zend Studio는 Zend Framework와 통합하는 기능을 포함하는 IDE입니다. MVC보기 및 코드 생성을 제공합니다. 현재 Zend 프레임 워크 3.0에는 JSON RPC 서버, XML to JSON 변환기, PSR-7 기능 및 PHP 7과의 호환성과 같은 새로운 구성 요소가 포함되어 있습니다.
Zend Framework 2는 PHP 5.3 이상을 사용하여 웹 애플리케이션 및 서비스를 개발하기위한 오픈 소스 프레임 워크입니다. Zend Framework 2는 100 % 객체 지향 코드를 사용하며 PHP 5.3의 새로운 기능, 즉Namespaces, Lambda Functions 과 Closures.
Zend Framework 2는 1,500 만 회 이상의 다운로드를 기록한 성공적인 PHP 프레임 워크 인 Zend Framework 1에서 발전했습니다. Zend Server에는 무료 커뮤니티 버전과 상용 버전이 있습니다.
Zend Framework 기능
Zend Framework의 몇 가지 두드러진 기능은 다음과 같습니다.
- 순수 객체 지향 웹 애플리케이션 프레임 워크
- 고급 MVC 구현
- PostgreSQL, SQLite 등을 포함한 다중 데이터베이스 지원,
- 간단한 클라우드 API
- 세션 관리
- 데이터 암호화
- 유연한 URI 라우팅
- Zend는 RESTful API 개발 지원을 제공합니다.
- 재사용이 가능하고 유지하기 쉬운 코드.
왜 Zend Framework인가?
Zend Framework를 PHP 개발자가 사용하는 최고의 프레임 워크 중 하나로 만드는 이유는 지적 재산권이 포함 된 깨끗하고 안정적인 코드를 제공한다는 것입니다. 또한 프로그래밍을 더 쉽게 만듭니다. 빠르고 배우기 쉽고 편리한 프레임 워크입니다. Zend는 강력한 암호화 도구와 암호 해싱 기술을 지원합니다.
젠드 목표
다음은 Zend 프레임 워크의 목표입니다.
- Flexibility
- 간단하고 생산적
- Compatibility
- 확장 성-프로그래머는 모든 프레임 워크 클래스를 쉽게 확장 할 수 있습니다.
- 이식성-여러 환경 지원
Zend 애플리케이션
Zend Framework를 사용하여 다음과 같은 인기 제품이 개발되었습니다.
- McAfee 회사 웹 사이트
- IBM 회사 웹 사이트
- Magento-인기있는 쇼핑 카트 웹 사이트 중 하나.
Zend Framework의 장점
Zend Framework의 장점 중 일부는 다음과 같습니다.
Loosely Coupled − Zend는 애플리케이션에서 필요하지 않은 모듈 또는 구성 요소를 삭제할 수있는 옵션을 제공합니다.
Performance− Zend Framework는 성능에 최적화되어 있습니다. Zend Framework 3는 이전 버전보다 4 배 빠릅니다.
Security − 프레임 워크는 업계 표준 암호화를 지원합니다.
Testing − PHPUnit은 Zend와 통합되어있어 프레임 워크를 쉽게 테스트 할 수 있습니다.
다음 장에서는 Zend Framework를 설치하는 방법을 배웁니다.
Zend Framework를 설치하려면 먼저 다음 단계에 표시된대로 Composer와 최신 버전의 PHP를 설치해야합니다.
Install Composer− Zend는 Composer를 사용하여 종속성을 관리하므로 컴퓨터에 Composer가 설치되어 있는지 확인하십시오. 합성기가 설치되어 있지 않은 경우, 다음의 공식 웹 사이트를 방문 작곡가를 설치합니다.
Install the latest version of PHP− Zend Framework의 이점을 최대한 활용하려면 최신 버전의 PHP를 설치하십시오. Zend Framework 3에 필요한 최소 버전은 PHP 5.6 이상입니다.
Zend Framework 설치
Zend Framework는 두 가지 방법으로 설치할 수 있습니다. 그들은 다음과 같습니다-
- 수동 설치
- Composer 기반 설치
이 두 가지 설치에 대해 자세히 설명하겠습니다.
수동 설치
다음 링크를 방문하여 최신 버전의 Zend Framework를 다운로드하십시오. https://framework.zend.com/downloads/archives
보관하려는 폴더에 다운로드 한 아카이브 파일의 내용을 추출합니다. 로컬 컴퓨터에서 사용할 수있는 Zend Framework의 복사본이 있으면 Zend Framework 기반 웹 애플리케이션이 프레임 워크 클래스에 액세스 할 수 있습니다. 이를 달성하는 방법에는 여러 가지가 있지만 PHPinclude_path배포판의 / library 디렉토리 아래에 Zend Framework 클래스에 대한 경로를 포함해야합니다. 이 방법은 Zend Framework 버전 2.4 이하에만 적용됩니다.
Composer 기반 설치
Zend Framework를 쉽게 설치하려면 Composer 도구를 사용하십시오. 이것은 최신 버전의 Zend Framework를 설치하는 데 선호되는 방법입니다. Zend Framework의 모든 구성 요소를 설치하려면 다음 Composer 명령을 사용하십시오.
$ composer require zendframework/zendframework
각 Zend Framework 모듈 / 구성 요소도 개별적으로 설치할 수 있습니다. 예를 들어,MVC component Zend Framework의 다음을 사용하십시오. composer 명령-
$ composer require zendframework/zend-mvc
Zend Framework MVC 레이어 및 모듈 시스템을 사용하여 스켈레톤 애플리케이션을 생성 해 보겠습니다.
Composer를 사용하여 설치
새로운 Zend Framework 프로젝트를 만드는 가장 쉬운 방법은 Composer를 사용하는 것입니다. 다음과 같이 정의됩니다-
$ cd /path/to/install $ composer create-project -n -sdev zendframework/skeleton-application myapp
화면에 다음 결과가 표시됩니다.
Installing zendframework/skeleton-application (dev-master
941da45b407e4f09e264f000fb537928badb96ed)
- Installing zendframework/skeleton-application (dev-master master)
Cloning master
Created project in myapp
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
- Installing zendframework/zend-component-installer (0.3.0)
Loading from cache
- Installing zendframework/zend-stdlib (3.0.1)
Loading from cache
- Installing zendframework/zend-config (2.6.0)
Loading from cache
- Installing zendframework/zend-loader (2.5.1)
Loading from cache
- Installing zendframework/zend-eventmanager (3.0.1)
Loading from cache
- Installing zendframework/zend-view (2.8.0)
Loading from cache
- Installing container-interop/container-interop (1.1.0)
Loading from cache
- Installing zendframework/zend-servicemanager (3.1.0)
Loading from cache
- Installing zendframework/zend-validator (2.8.1)
Loading from cache
- Installing zendframework/zend-escaper (2.5.1)
Loading from cache
- Installing zendframework/zend-uri (2.5.2)
Loading from cache
- Installing zendframework/zend-http (2.5.4)
Loading from cache
- Installing zendframework/zend-router (3.0.2)
Loading from cache
- Installing zendframework/zend-modulemanager (2.7.2)
Loading from cache
- Installing zendframework/zend-mvc (3.0.1)
Loading from cache
- Installing zendframework/zend-skeleton-installer (0.1.3)
Loading from cache
- Installing zfcampus/zf-development-mode (3.0.0)
Loading from cache
zendframework/zend-config suggests installing zendframework/zend-filter
(Zend\Filter component)
zendframework/zend-config suggests installing zendframework/zend-i18n
(Zend\I18n component)
zendframework/zend-config suggests installing zendframework/zend-json
(Zend\Json to use the Json reader or writer classes)
zendframework/zend-view suggests installing zendframework/zend-authentication
(Zend\Authentication component)
zendframework/zend-view suggests installing zendframework/zend-feed
(Zend\Feed component)
zendframework/zend-view suggests installing zendframework/zend-filter
(Zend\Filter component)
zendframework/zend-view suggests installing zendframework/zend-i18n
(Zend\I18n component)
zendframework/zend-view suggests installing zendframework/zend-json
(Zend\Json component)
zendframework/zend-view suggests installing zendframework/zend-navigation
(Zend\Navigation component)
zendframework/zend-view suggests installing zendframework/zend-paginator
(Zend\Paginator component)
zendframework/zend-view suggests installing zendframework/zend-permissions-acl
(Zend\Permissions\Acl component)
zendframework/zend-servicemanager suggests installing ocramius/proxy-manager
(ProxyManager 1.* to handle lazy initialization of services)
zendframework/zend-validator suggests installing zendframework/zend-db
(Zend\Db component)
zendframework/zend-validator suggests installing zendframework/zend-filter
(Zend\Filter component, required by the Digits validator)
zendframework/zend-validator suggests installing zendframework/zend-i18n
(Zend\I18n component to allow translation of validation error messages as well as
to use the various Date validators)
zendframework/zend-validator suggests installing zendframework/zend-i18nresources
(Translations of validator messages)
zendframework/zend-validator suggests installing zendframework/zend-math
(Zend\Math component)
zendframework/zend-validator suggests installing zendframework/zend-session
(Zend\Session component)
zendframework/zend-router suggests installing zendframework/zend-i18n
(^2.6, if defining translatable HTTP path segments)
zendframework/zend-modulemanager suggests installing zendframework/zend-console
(Zend\Console component)
zendframework/zend-mvc suggests installing zendframework/zend-json ((^2.6.1 ||
^3.0) To auto-deserialize JSON body content in AbstractRestfulController
extensions, when json_decode is unavailable)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-console
(zend-mvc-console provides the ability to expose zend-mvc as a console application)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-i18n
(zendmvc-i18n provides integration with zend-i18n, including a translation bridge
and translatable route segments)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-pluginfileprg
(To provide Post/Redirect/Get functionality around forms that container
file uploads)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-pluginflashmessenger
(To provide flash messaging capabilities between requests)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-pluginidentity
(To access the authenticated identity (per zend-authentication) in controllers)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-prg
(To provide Post/Redirect/Get functionality within controllers)
zendframework/zend-mvc suggests installing zendframework/zend-psr7bridge
((^0.2) To consume PSR-7 middleware within the MVC workflow)
zendframework/zend-mvc suggests installing zendframework/zend-servicemanager-di
(zend-servicemanager-di provides utilities for integrating zend-di and
zendservicemanager in your zend-mvc application)
Generating autoload files
Removing optional packages from composer.json
Updating composer.json
Removing zendframework/zend-skeleton-installer...
- Removing zendframework/zend-skeleton-installer (0.1.3)
Removed plugin zendframework/zend-skeleton-installer.
Removing from composer.json
Complete!
> zf-development-mode enable
You are now in development mode.
이제 응용 프로그램이 설치되었으므로 다음을 사용하여 즉시 테스트 할 수 있습니다. PHP's built-in web server −
$ cd path/to/install/myapp $ composer serve
그러면 다음 응답이 표시됩니다.
> php -S 0.0.0.0:8080 -t public/ public/index.php
그러면 포트 8080에서 PHP 내장 CLI 서버가 시작됩니다. 개발 서버가 시작되면 다음 사이트를 방문 할 수 있습니다. (http://localhost:8080/). 내장 된 CLI 서버는 개발 전용입니다.
단위 테스트
스켈레톤 단위 테스트를 실행하려면 터미널에 다음 명령을 입력하십시오.
$ composer require --dev zendframework/zend-test
다음 응답을 생성합니다-
Using version ^3.0 for zendframework/zend-test
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing zendframework/zend-dom (2.6.0)
Loading from cache
- Installing zendframework/zend-console (2.6.0)
Loading from cache
- Installing sebastian/version (2.0.1)
Loading from cache
- Installing symfony/yaml (v3.2.1)
Downloading: 100%
- Installing sebastian/resource-operations (1.0.0)
Loading from cache
- Installing sebastian/recursion-context (2.0.0)
Loading from cache
- Installing sebastian/object-enumerator (2.0.0)
Loading from cache
- Installing sebastian/global-state (1.1.1)
Loading from cache
- Installing sebastian/exporter (2.0.0)
Loading from cache
- Installing sebastian/environment (2.0.0)
Loading from cache
- Installing sebastian/diff (1.4.1)
Loading from cache
- Installing sebastian/comparator (1.2.2)
Loading from cache
- Installing phpunit/php-text-template (1.2.1)
Loading from cache
- Installing doctrine/instantiator (1.0.5)
Loading from cache
- Installing phpunit/phpunit-mock-objects (3.4.3)
Downloading: 100%
- Installing phpunit/php-timer (1.0.8)
Loading from cache
- Installing phpunit/php-file-iterator (1.4.2)
Loading from cache
- Installing sebastian/code-unit-reverse-lookup (1.0.0)
Loading from cache
- Installing phpunit/php-token-stream (1.4.9)
Loading from cache
- Installing phpunit/php-code-coverage (4.0.4)
Downloading: 100%
- Installing webmozart/assert (1.2.0)
Loading from cache
- Installing phpdocumentor/reflection-common (1.0)
Loading from cache
- Installing phpdocumentor/type-resolver (0.2.1)
Loading from cache
- Installing phpdocumentor/reflection-docblock (3.1.1)
Loading from cache
- Installing phpspec/prophecy (v1.6.2)
Loading from cache
- Installing myclabs/deep-copy (1.5.5)
Loading from cache
- Installing phpunit/phpunit (5.7.4)
Downloading: 100%
- Installing zendframework/zend-test (3.0.2)
Loading from cache
zendframework/zend-console suggests installing zendframework/zend-filter
(To support DefaultRouteMatcher usage)
symfony/yaml suggests installing symfony/console (For validating YAML files
using the lint command)
sebastian/global-state suggests installing ext-uopz (*)
phpunit/phpunit-mock-objects suggests installing ext-soap (*)
phpunit/php-code-coverage suggests installing ext-xdebug (>=2.4.0)
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
phpunit/phpunit suggests installing ext-xdebug (*)
zendframework/zend-test suggests installing zendframework/zend-mvc-console
(^1.1.8, to test MVC <-> console integration)
Writing lock file
Generating autoload files
이제 테스트 지원이 활성화되어 다음 명령을 사용하여 테스트를 실행할 수 있습니다.
$ ./vendor/bin/phpunit
Apache 웹 서버
프로덕션 환경에서 Zend Framework 기반 애플리케이션을 호스팅하는 것은 매우 간단하고 간단합니다. 그냥VirtualHost Apache 구성 파일에서 DocumentRoot ~로 Public Zend Framework 애플리케이션의 폴더.
샘플 구성 (myapp)은 다음과 같습니다.
<VirtualHost *:80>
ServerName myapp.localhost
DocumentRoot /path/to/install/myapp/public
<Directory /path/to/install/myapp/public>
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>
</VirtualHost>
이 장을 진행하기 전에 MVC에 대해 간략하게 이해하겠습니다. ㅏModel View Controller프리젠 테이션에서 애플리케이션 로직을 분리하는 소프트웨어 접근 방식입니다. 실제로는 프리젠 테이션이 그것과 분리되어 있기 때문에 웹 페이지에 최소한의 PHP 스크립팅을 포함 할 수 있습니다.
MVC 구성 요소에 대한 간략한 설명은 다음과 같습니다.
Model− 모델은 애플리케이션 데이터의 구조를 나타냅니다. 일반적으로 모델 클래스에는retrieve, insert 과 update business data 백엔드 데이터베이스 (MySQL, PostgreSQL 등).
View−보기는 MVC 응용 프로그램의 표시 계층입니다. 컨트롤러를 통해 모델 데이터를 가져와 필요에 따라 표시합니다. 그것은 느슨하게 결합됩니다Controller 그리고 Model 따라서 모델과 컨트롤러에 영향을주지 않고 변경할 수 있습니다.
Controller− 컨트롤러는 MVC 아키텍처의 주요 구성 요소입니다. 모든 요청은 먼저 컨트롤러에 도달합니다. 즉, 컨트롤러는 모든 요청을 처리하고 Model, View 및 기타 필요한 리소스 간의 중개자 역할을합니다.process the HTTP request 응답을 생성합니다.
다음 장에서는 Zend 프레임 워크의 다양한 개념을 이해할 것입니다.
Zend Framework는 60 개 이상의 구성 요소 모음입니다. 그들은 서로 느슨하게 연결되어 있습니다. 이들은 독립형 구성 요소뿐만 아니라 단일 장치로 작동하는 구성 요소 그룹으로도 사용할 수 있습니다.
Zend Framework는 세 가지 가장 중요한 구성 요소를 제공합니다.
- zend-servicemanager
- zend-eventmanager 및
- zend-modulemanager.
Zend 구성 요소에 다른 구성 요소와 효율적으로 통합 할 수있는 기능을 제공합니다.
Event Manager− 이벤트 기반 프로그래밍을 생성하는 기능을 제공합니다. 이는 새로운 이벤트를 생성, 주입 및 관리하는 데 도움이됩니다.
Service Manager − 어느 곳에서나 약간의 노력으로 모든 서비스 (PHP 클래스)를 사용할 수 있습니다.
Module Manager − 유사한 기능을 가진 PHP 클래스 모음을 a라는 단일 단위로 변환하는 기능 module. 새로 생성 된 모듈은 단일 장치로 사용, 유지 관리 및 구성 할 수 있습니다.
이 개념은 다음 장에서 자세히 다룰 것입니다.
Zend Framework에는 다음과 같은 강력한 서비스 로케이터 패턴 구현이 포함되어 있습니다. zend-servicemanager. Zend 프레임 워크는 모든 기능에 대해 서비스 관리자를 광범위하게 사용합니다. Service Manager는 Zend 프레임 워크에 대한 높은 수준의 추상화를 제공합니다. 또한 Zend Framework의 다른 모든 구성 요소와 잘 통합됩니다.
Service Manager 설치
Service Manager 구성 요소는 다음을 사용하여 설치할 수 있습니다. composer 수단.
composer require zendframework/zend-servicemanager
예
먼저 모든 서비스를 서비스 관리자에 등록해야합니다. 서비스가 서버 관리자 시스템에 등록되면 최소한의 노력으로 언제든지 액세스 할 수 있습니다. 서비스 관리자는 서비스 등록을위한 많은 옵션을 제공합니다. 간단한 예는 다음과 같습니다.
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Factory\InvokableFactory;
use stdClass;
$serviceManager = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class,],
]);
위의 코드는 stdClass 사용하여 시스템에 Factory선택권. 이제 우리는 언제든지 stdClass의 인스턴스를 얻을 수 있습니다.get() 아래와 같이 서비스 관리자의 방법.
use Zend\ServiceManager\ServiceManager;
$object = $serviceManager->get(stdClass::class);
get () 메서드는 검색된 객체를 공유하므로 get () 메서드를 여러 번 호출하여 반환 된 객체는 하나의 동일한 인스턴스입니다. 매번 다른 인스턴스를 얻기 위해 서비스 관리자는 다른 방법을 제공합니다.build() 방법.
use Zend\ServiceManager\ServiceManager;
$a = $serviceManager->build(stdClass::class); $b = $serviceManager->build(stdClass::class);
서비스 관리자 등록
서비스 관리자는 구성 요소를 등록하기위한 일련의 메소드를 제공합니다. 가장 중요한 방법 중 일부는 다음과 같습니다.
- 공장 방법
- 추상 팩토리 방법
- 이니셜 라이저 방법
- 위임자 팩토리 방법
다음 장에서 각각에 대해 자세히 설명합니다.
공장 방법
팩토리는 기본적으로 모든 호출 가능 또는 FactoryInterface (Zend \ ServiceManager \ Factory \ FactoryInterface).
FactoryInterface에는 단일 메소드가 있습니다.
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
FactoryInterface의 인수 세부 사항은 다음과 같습니다.
container (ContainerInterface)− ServiceManager의 기본 인터페이스입니다. 다른 서비스를받을 수있는 옵션을 제공합니다.
requestedName − 서비스 이름입니다.
options − 서비스에 필요한 추가 옵션을 제공합니다.
FactoryInterface를 구현하는 간단한 클래스를 만들고 클래스를 등록하는 방법을 살펴 보겠습니다.
클래스 테스트-검색 할 개체
use stdClass;
class Test {
public function __construct(stdClass $sc) { // use $sc
}
}
그만큼 Test 클래스는 stdClass에 따라 다릅니다.
Class TestFactory-테스트 객체를 초기화하는 클래스
class TestFactory implements FactoryInterface {
public function __invoke(ContainerInterface $container, $requestedName,
array $options = null) { $dep = $container->get(stdClass::class); return new Test($dep);
}
}
TestFactory는 컨테이너를 사용하여 stdClass를 검색하고 Test 클래스의 인스턴스를 만든 다음 반환합니다.
Zend 프레임 워크의 등록 및 사용
이제 Zend 프레임 워크를 등록하고 사용하는 방법을 이해하겠습니다.
serviceManager $sc = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class, Test::class => TestFactory::class] ]); $test = $sc->get(Test::class);
서비스 관리자는 InvokableFactory종속성이없는 클래스를 검색합니다. 예를 들어stdClass stdClass는 다른 클래스에 종속되지 않으므로 InvokableFactory를 사용하여 구성 할 수 있습니다.
serviceManager $sc = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class]
]);
$stdC = $sc->get(stdClass::class);
구현하지 않고 객체를 검색하는 또 다른 방법 FactoryInterface 또는 사용 InvokableFactory 아래와 같이 인라인 방식을 사용하고 있습니다.
$serviceManager = new ServiceManager([ 'factories' => [ stdClass::class => InvokableFactory::class, Test::class => function(ContainerInterface $container, $requestedName) { $dep = $container->get(stdClass::class); return new Test($dep);
},
],
]);
추상 팩토리 방법
때로는 런타임에만 알게되는 객체를 만들어야 할 수도 있습니다. 이 상황은 다음을 사용하여 처리 할 수 있습니다.AbstractFactoryInterface, FactoryInterface에서 파생됩니다.
AbstractFactoryInterface는 요청 된 인스턴스에서 개체를 만들 수 있는지 여부를 확인하는 메서드를 정의합니다. 개체 생성이 가능하면 다음을 사용하여 개체를 생성합니다.__invokemethod FactoryInterface의 및 반환합니다.
AbstractFactoryInterface의 서명은 다음과 같습니다.
public function canCreate(ContainerInterface $container, $requestedName)
이니셜 라이저 방법
Initializer Method는 이미 생성 된 서비스에 대한 추가 종속성을 주입하는 특수 옵션입니다. 그것은InitializerInterface 사용 가능한 유일한 방법의 서명은 다음과 같습니다.
public function(ContainerInterface $container, $instance)
function(ContainerInterface $container, $instance) {
if (! $instance instanceof EventManagerAwareInterface) { return; } $instance->setEventManager($container->get(EventManager::class));
}
위의 예에서 메서드는 인스턴스가 EventManagerAwareInterface 유형인지 확인합니다. 유형 인 경우EventManagerAwareInterface, 이벤트 관리자 개체를 설정합니다. 그렇지 않으면 설정하지 않습니다. 메서드는 종속성을 설정하거나 설정하지 않을 수 있으므로 신뢰할 수 없으며 많은 런타임 문제가 발생합니다.
위임자 팩토리 방법
Zend Framework는 다음을 통해 위임자 패턴을 지원합니다. DelegatorFactoryInterface. 서비스를 장식하는 데 사용할 수 있습니다.
이 함수의 서명은 다음과 같습니다.
public function __invoke(ContainerInterface $container,
$name, callable $callback, array $options = null
);
여기, $callback 서비스 인스턴스 장식을 담당합니다.
게으른 서비스
Lazy 서비스는 생성시 완전히 초기화되지 않는 서비스 중 하나입니다. 그들은 단지 참조되고 실제로 필요할 때만 초기화됩니다. 가장 좋은 예 중 하나는 모든 위치에서 필요하지 않을 수있는 데이터베이스 연결입니다. 비용이 많이 드는 리소스 일뿐만 아니라 생성하는 데 시간이 많이 걸리는 프로세스가 있습니다. Zend 프레임 워크는LazyServiceFactory 에서 파생 된 DelegatorFactoryInterface의 도움으로 게으른 서비스를 생성 할 수 있습니다. Delegator 개념과 제 3 자 프록시 관리자가 있습니다. ocramius proxy manager.
플러그인 관리자
플러그인 관리자는 서비스 관리자를 확장하고 인스턴스 유효성 검사와 같은 추가 기능을 제공합니다. Zend Framework는 플러그인 관리자를 광범위하게 사용합니다.
예를 들어 모든 유효성 검사 서비스는 ValidationPluginManager.
구성 옵션
서비스 관리자는 서비스 관리자의 기능을 확장하는 몇 가지 옵션을 제공합니다. 그들은shared, shared_by_default 과 aliases. 앞에서 논의했듯이 검색된 객체는 기본적으로 요청 된 객체간에 공유되며build()별개의 객체를 얻는 방법. 우리는 또한 사용할 수 있습니다shared공유 할 서비스를 지정하는 옵션입니다. 그만큼shared_by_default 다음과 같다 shared 모든 서비스에 적용되는 것을 제외하고 기능.
$serviceManager = new ServiceManager([
'factories' => [
stdClass::class => InvokableFactory::class
],
'shared' => [
stdClass::class => false // will not be shared
],
'shared_by_default' => false, // will not be shared and applies to all service
]);
그만큼 aliases옵션을 사용하여 등록 된 서비스에 대체 이름을 제공 할 수 있습니다. 여기에는 장단점이 있습니다. 긍정적 인 측면에서는 서비스에 대한 대체 짧은 이름을 제공 할 수 있습니다. 그러나 동시에 이름이 문맥에서 벗어나 버그를 유발할 수 있습니다.
aliases' => ['std' => stdClass::class, 'standard' => 'std']
모든 최신 애플리케이션에는 견고하고 유연한 이벤트 구성 요소가 필요합니다. Zend Framework는 이러한 구성 요소 중 하나를 제공합니다.zend-eventmanager. zend-eventmanager는 높은 수준의 아키텍처를 설계하고 주제 / 관찰자 패턴 및 측면 지향 프로그래밍을 지원합니다.
이벤트 관리자 설치
이벤트 관리자는 다음을 사용하여 설치할 수 있습니다. Composer 아래에 명시된대로-
composer require zendframework/zend-eventmanager
이벤트 관리자의 개념
이벤트 관리자의 핵심 개념은 다음과 같습니다.
Event − 이벤트는 임의로 이름이 지정된 작업입니다. greet.
Listener− 모든 PHP 콜백. 이벤트에 연결되고 이벤트가 트리거 될 때 호출됩니다. 리스너의 기본 서명은 다음과 같습니다.
function(EventInterface $e)
EventInterface Class− 이벤트 자체를 지정합니다. 이름 (set / getName), 대상 (get / setTarget) 및 매개 변수 (get / setParams)와 같은 이벤트 정보를 설정하고 가져 오는 메소드가 있습니다.
EventManager class− EventManager의 인스턴스는 응용 프로그램과 해당 리스너에서 정의 된 모든 이벤트를 추적합니다. EventManager는 메소드를 제공합니다.attach 이벤트에 리스너를 연결하고 메서드를 제공합니다. trigger사전 정의 된 이벤트를 트리거합니다. 트리거가 호출되면 EventManager는 연결된 리스너를 호출합니다.
EventManagerAwareInterface− 클래스가 이벤트 기반 프로그래밍을 지원하려면 EventManagerAwareInterface를 구현해야합니다. 두 가지 방법을 제공합니다.setEventManager 과 getEventManager 이벤트 관리자를 가져오고 설정합니다.
예
이벤트 관리자 개념을 이해하기 위해 간단한 PHP 콘솔 애플리케이션을 작성해 보겠습니다. 아래 단계를 따르십시오.
"eventapp"폴더를 만듭니다.
설치 zend-eventmanager 작곡가를 사용하여.
PHP 파일 만들기 Greeter.php "eventapp"폴더 안에 있습니다.
수업 만들기 Greeter 및 구현 EventManagerAwareInterface.
require __DIR__ . '/vendor/autoload.php';
class Greeter implements EventManagerAwareInterface {
// code
}
여기, require Composer가 설치된 모든 구성 요소를 자동로드하는 데 사용됩니다.
쓰기 setEventManager 수업 방법 Greeter 아래와 같이-
public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers([ __CLASS__, get_called_class(),]);
$this->events = $events;
return $this;
}
이 메서드는 현재 클래스를 지정된 이벤트 관리자 ($ events 인수)로 설정 한 다음 로컬 변수에 이벤트 관리자를 설정합니다. $events.
다음 단계는 getEventManager 수업 방법 Greeter 아래와 같이-
public function getEventManager() {
if (null === $this->events) {
$this->setEventManager(new EventManager()); } return $this->events;
}
메서드는 지역 변수에서 이벤트 관리자를 가져옵니다. 사용할 수없는 경우 이벤트 관리자의 인스턴스를 만들고 반환합니다.
방법 작성, greet, 클래스 Greeter.
public function greet($message) { printf("\"%s\" from class\n", $message);
$this->getEventManager()->trigger(__FUNCTION__, $this, $message ]);
}
이 메서드는 이벤트 관리자를 가져와 연결된 이벤트를 발생 / 트리거합니다.
다음 단계는 Greeter 클래스를 만들고 리스너를 메서드에 연결합니다. greet.
$greeter = new Greeter();
$greeter->getEventManager()->attach('greet', function($e) {
$event_name = $e->getName();
$target_name = get_class($e->getTarget());
$params_json = json_encode($e->getParams());
printf("\"%s\" event of class \"%s\" is called." .
" The parameter supplied is %s\n",
$event_name, $target_name,
$params_json);
});
리스너 콜백은 이벤트, 대상 및 제공된 매개 변수의 이름 만 인쇄합니다.
의 전체 목록 Greeter.php 다음과 같습니다-
<?php
require __DIR__ . '/vendor/autoload.php';
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
class Greeter implements EventManagerAwareInterface {
protected $events;
public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers([__CLASS__, get_called_class(), ]);
$this->events = $events;
return $this; } public function getEventManager() { if (null === $this->events) {
$this->setEventManager(new EventManager()); } return $this->events;
}
public function greet($message) { printf("\"%s\" from class\n", $message);
$this->getEventManager()->trigger(__FUNCTION__, $this, [$message ]); } } $greeter = new Greeter();
$greeter->greet("Hello"); $greeter->getEventManager()->attach('greet', function($e) { $event_name = $e->getName(); $target_name = get_class($e->getTarget()); $params_json = json_encode($e->getParams()); printf("\"%s\" event of class \"%s\" is called." . " The parameter supplied is %s\n", $event_name,
$target_name, $params_json);
});
$greeter->greet("Hello");
이제 명령 프롬프트 php에서 응용 프로그램을 실행하십시오. Greeter.php 결과는 다음과 같습니다.
"Hello" from class
"Hello" from class
"greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]
위의 샘플 애플리케이션은 이벤트 관리자의 기본 사항 만 설명합니다. 이벤트 관리자는 다음과 같은 더 많은 고급 옵션을 제공합니다.Listener Priority, Custom Callback Prototype / Signature, Short Circuiting, 등. 이벤트 관리자는 Zend MVC 프레임 워크에서 광범위하게 사용됩니다.
Zend 프레임 워크는 강력한 모듈 시스템을 제공합니다. 모듈 시스템에는 세 가지 구성 요소가 있습니다. 그들은 다음과 같습니다-
Module Autoloader− Module Autoloader는 다양한 소스에서 모듈을 찾고로드하는 역할을합니다. 다음과 같이 패키징 된 모듈을로드 할 수 있습니다.Phar archives게다가. 모듈 자동 로더의 구현은 myapp / vendor / zendframework / zend-loader / src / ModuleAutoloader.php에 있습니다.
Module Manager− 모듈 자동 로더가 모듈을 찾으면 모듈 관리자는 각 모듈에 대한 일련의 이벤트를 발생시킵니다. 모듈 관리자의 구현은 myapp / vendor / zendframework / zendmodulemanager / src / ModuleManager.php에 있습니다.
Module Manager Listeners− 모듈 관리자에 의해 발생한 이벤트에 첨부 될 수 있습니다. 모듈 관리자의 이벤트에 연결하여 모듈 해결 및로드부터 각 모듈에 대한 복잡한 작업 수행까지 모든 작업을 수행 할 수 있습니다.
MVC 웹 모듈 시스템
Zend Framework의 MVC 웹 애플리케이션은 일반적으로 모듈로 작성됩니다. 단일 웹 사이트에는 기능별로 그룹화 된 하나 이상의 모듈이 포함될 수 있습니다. MVC 지향 모듈의 권장 구조는 다음과 같습니다.
module_root/
Module.php
autoload_classmap.php
autoload_function.php
autoload_register.php
config/
module.config.php
public/
images/
css/
js/
src/
<module_namespace>/
<code files>
test/
phpunit.xml
bootstrap.php
<module_namespace>/
<test code files>
view/
<dir-named-after-module-namespace>/
<dir-named-after-a-controller>/
<.phtml files>
구조는 이전 장에서 설명한 것과 동일하지만 여기서는 일반적입니다. 그만큼autoload_ files 고급을 사용하지 않고 모듈에서 사용 가능한 클래스를 자동로드하기위한 기본 메커니즘으로 사용할 수 있습니다. Module Manager 사용 가능 zend-modulemanager.
autoload_classmap.php − 클래스 이름의 배열과 해당 파일 이름을 반환합니다.
autoload_function.php− PHP 콜백을 반환합니다. 이것은 autoload_classmap.php에서 반환 된 클래스를 활용할 수 있습니다.
autoload_register.php − autoload_function.php에서 반환하는 PHP 콜백을 등록합니다.
이러한 자동로드 파일은 필수는 아니지만 권장됩니다. 스켈레톤 애플리케이션에서 우리는autoload_ files.
모듈 클래스
Module 클래스의 이름은 Module 모듈 클래스의 네임 스페이스는 Module name. 이렇게하면 Zend 프레임 워크가 모듈을 쉽게 해결하고로드 할 수 있습니다. 그만큼Application 스켈레톤 (myapp) 애플리케이션, myapp / module / Application / src / Module.php의 모듈 코드는 다음과 같습니다.
namespace Application;
class Module {
const VERSION = '3.0.2dev';
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
Zend Framework 모듈 관리자는 getConfig() 자동으로 작동하고 필요한 단계를 수행합니다.
이 장에서는 Zend Framework 애플리케이션의 구조를 이해하겠습니다. 의 구조myapp 응용 프로그램은 다음과 같습니다-
├── composer.json
├── composer.lock
├── CONDUCT.md
├── config
│ ├── application.config.php
│ ├── autoload
│ │ ├── development.local.php
│ │ ├── development.local.php.dist
│ │ ├── global.php
│ │ ├── local.php.dist
│ │ ├── README.md
│ │ └── zend-developer-tools.local-development.php
│ ├── development.config.php
│ ├── development.config.php.dist
│ └── modules.config.php
├── CONTRIBUTING.md
├── data
│ └── cache
│ └── module-classmap-cache.application.module.cache.php ├── docker-compose.yml
├── Dockerfile
├── LICENSE.md
├── module
│ └── Application
│ ├── config
│ ├── src
│ ├── test
│ └── view
├── phpcs.xml
├── phpunit.xml.dist
├── public
│ ├── css
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ ├── bootstrap.min.css
│ │ ├── bootstrap.min.css.map
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap-theme.css.map
│ │ ├── bootstrap-theme.min.css
│ │ ├── bootstrap-theme.min.css.map
│ │ └── style.css
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── img
│ │ ├── favicon.ico
│ │ └── zf-logo-mark.svg
│ ├── index.php
│ ├── js
│ │ ├── bootstrap.js
│ │ ├── bootstrap.min.js
│ │ └── jquery-3.1.0.min.js
│ └── web.config
├── README.md
├── TODO.md
├── Vagrantfile
└── vendor
├── autoload.php
├── bin
│ ├── phpunit -> ../phpunit/phpunit/phpunit
│ ├── templatemap_generator.php -> ../zendframework/zend-
view/bin/templatemap_generator.php
│ └── zf-development-mode -> ../zfcampus/zf-development-mode/bin/zf-
development-mode
├── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
├── container-interop
│ └── container-interop
├── doctrine
│ └── instantiator
├── myclabs
│ └── deep-copy
├── phpdocumentor
│ ├── reflection-common
│ ├── reflection-docblock
│ └── type-resolver
├── phpspec
│ └── prophecy
├── phpunit
│ ├── php-code-coverage
│ ├── php-file-iterator
│ ├── php-text-template
│ ├── php-timer
│ ├── php-token-stream
│ ├── phpunit
│ └── phpunit-mock-objects
├── sebastian
│ ├── code-unit-reverse-lookup
│ ├── comparator
│ ├── diff
│ ├── environment
│ ├── exporter
│ ├── global-state
│ ├── object-enumerator
│ ├── recursion-context
│ ├── resource-operations
│ └── version
├── symfony
│ └── yaml
├── webmozart
│ └── assert
├── zendframework
│ ├── zend-component-installer
│ ├── zend-config
│ ├── zend-console
│ ├── zend-dom
│ ├── zend-escaper
│ ├── zend-eventmanager
│ ├── zend-http
│ ├── zend-loader
│ ├── zend-modulemanager
│ ├── zend-mvc
│ ├── zend-router
│ ├── zend-servicemanager
│ ├── zend-stdlib
│ ├── zend-test
│ ├── zend-uri
│ ├── zend-validator
│ └── zend-view
└── zfcampus
└── zf-development-mode
73 directories, 55 files
Zend Framework 애플리케이션은 서로 다른 폴더로 구성됩니다. 그들은 다음과 같습니다-
Application−이 디렉토리에는 응용 프로그램이 포함되어 있습니다. MVC 시스템은 물론 구성, 사용 된 서비스 및 부트 스트랩 파일을 수용합니다.
Config −이 디렉토리에는 응용 프로그램의 구성 파일이 포함되어 있습니다.
Data −이 디렉토리는 일시적이고 일시적 일 수있는 애플리케이션 데이터를 저장할 장소를 제공합니다.
Module − 모듈을 통해 개발자는 관련 컨트롤러 세트를 논리적으로 구성된 그룹으로 그룹화 할 수 있습니다.
Public− 이것은 응용 프로그램의 문서 루트입니다. Zend 응용 프로그램을 시작합니다. 또한 JavaScript, CSS, 이미지 등과 같은 응용 프로그램의 자산을 포함합니다.
Vendor −이 디렉토리에는 작곡가 종속성이 포함되어 있습니다.
애플리케이션 모듈의 구조
이것은 애플리케이션의 기본 디렉토리입니다. Zend Framework 2는 애플리케이션을 효율적으로 구성하기 위해 강력하고 유연한 모듈 시스템을 도입합니다. 그만큼Application스켈레톤 애플리케이션 (myapp) 의 모듈은 전체 애플리케이션에 대한 부트 스트랩, 오류 및 라우팅 구성을 제공합니다. 의 구조Application 모듈은 다음과 같습니다-
├── module
│ └── Application
│ ├── config
│ │ └── module.config.php
│ ├── src
│ │ ├── Controller
│ │ │ └── IndexController.php
│ │ └── Module.php
│ ├── test
│ │ └── Controller
│ │ └── IndexControllerTest.php
│ └── view
│ ├── application
│ │ └── index
│ │ └── index.phtml
│ ├── error
│ │ ├── 404.phtml
│ │ └── index.phtml
│ └── layout
│ └── layout.phtml
각 모듈 디렉토리를 자세히 다루겠습니다.
Application− 이것은 모듈의 루트 디렉토리입니다. 폴더 이름은 모듈 이름과 일치하며 이름은 모듈 내부에 정의 된 모든 클래스의 PHP 네임 스페이스로도 사용됩니다. MVC 시스템은 물론 구성, 사용 된 서비스 및 부트 스트랩 파일을 수용합니다.
Config − 모듈의 독립적 구성.
Src − 애플리케이션의 주요 비즈니스 로직.
View− 디자인 / 프레젠테이션 (HTML) 파일이 포함되어 있습니다. 예를 들면 index.phtml입니다.
src/Module.php− 모듈의 핵심입니다. 모듈의 "전면 컨트롤러"로 작동합니다. 젠드 프로세스src/Module.php file before processing any PHP Classes in this module.
Application/config/module.config.php − It is implemented for the router configuration and auto loading files.
Application/view/layout − Layouts represent the common parts of multiple views. For example, page header and footer. By default, layouts should be stored in the views/layoutsfolder.
모든 모듈은 위의 Application 모듈 과 동일하거나 유사한 구조를 공유합니다 .
이 장에서는 Zend 프레임 워크에서 MVC 기반 모듈을 만드는 방법을 배웁니다. 다음과 같은 모듈을 생성하겠습니다.Tutorial 모듈 생성 프로세스를 이해합니다.
라는 새 PHP 클래스를 만듭니다. Module –myapp / module / Tutorial / src / 디렉토리 내부에서 ConfigProviderInterface를 구현합니다.
세트 Tutorial 에 대한 네임 스페이스로 Module 수업.
공용 함수 작성 getConfig 에 Module 클래스에 대한 구성 파일을 반환합니다. Tutorial 기준 치수.
에 대한 완전한 코드 Module 클래스는 다음과 같습니다-
<?php
namespace Tutorial;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
구성 Tutorial 모듈 composer.json 아래의 autoload 다음 코드를 사용하여 섹션.
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Tutorial\\": "module/Tutorial/src/"
}
}
작성기를 사용하여 애플리케이션 업데이트 update 아래와 같이 명령.
composer update
그만큼 composer 명령은 응용 프로그램에 필요한 변경을 수행하고 아래와 같이 명령 프롬프트에 로그를 표시합니다.
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Removing zendframework/zend-component-installer (0.3.0)
- Installing zendframework/zend-component-installer (0.3.1)
Downloading: 100%
- Removing zendframework/zend-stdlib (3.0.1)
- Installing zendframework/zend-stdlib (3.1.0)
Loading from cache
- Removing zendframework/zend-eventmanager (3.0.1)
- Installing zendframework/zend-eventmanager (3.1.0)
Downloading: 100%
- Removing zendframework/zend-view (2.8.0)
- Installing zendframework/zend-view (2.8.1)
Loading from cache
- Removing zendframework/zend-servicemanager (3.1.0)
- Installing zendframework/zend-servicemanager (3.2.0)
Downloading: 100%
- Removing zendframework/zend-escaper (2.5.1)
- Installing zendframework/zend-escaper (2.5.2)
Loading from cache
- Removing zendframework/zend-http (2.5.4)
- Installing zendframework/zend-http (2.5.5)
Loading from cache
- Removing zendframework/zend-mvc (3.0.1)
- Installing zendframework/zend-mvc (3.0.4)
Downloading: 100%
- Removing phpunit/phpunit (5.7.4)
- Installing phpunit/phpunit (5.7.5)
Downloading: 100%
Writing lock file
Generating autoload files
다음 위치에서 모듈 구성 파일“module.config.php”를 만듭니다. /config/ 다음 코드로-
<?php
namespace Tutorial;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [Controller\TutorialController::class => InvokableFactory::class,],
],
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
],
];
구성 파일은 세 부분으로 구성되며 다음과 같습니다.
Controller configuration − 모듈 내에서 사용 가능한 컨트롤러를 지정합니다.
Routing configuration − 모듈의 컨트롤러를 URL로 해석하는 방법을 지정합니다.
View configuration −보기 위치 등 엔진보기와 관련된 구성을 지정합니다.
구성 Tutorial 응용 프로그램 수준 구성 파일의 모듈 – myapp / config / modules.config.php.
return ['Zend\Router', 'Zend\Validator', 'Application', 'Tutorial'];
다음을 실행하여 응용 프로그램을 실행하십시오. composer serve 응용 프로그램 폴더의 루트에 있습니다.
새 모듈을 성공적으로 추가했지만 여전히 추가해야합니다. Controller, Routing 과 Views 성공적으로 실행하려면 Tutorial 기준 치수.
앞서 논의했듯이 controllerZend MVC 프레임 워크에서 중요한 역할을합니다. 애플리케이션의 모든 웹 페이지는 컨트롤러에서 처리해야합니다.
Zend MVC 프레임 워크에서 컨트롤러는 Zend / Stdlib / DispatchableInterface를 구현하는 개체입니다. 그만큼DispatchableInterface 단일 방법이 있습니다. dispatch, 가져옵니다 Request 개체를 입력으로, 일부 논리를 수행하고 Response 출력으로 객체.
dispatch(Request $request, Response $response = null)
"Hello World"를 반환하는 Controller 객체의 간단한 예는 다음과 같습니다.
use Zend\Stdlib\DispatchableInterface;
use Zend\Stdlib\RequestInterface as Request;
use Zend\Stdlib\ResponseInterface as Response;
class HelloWorld implements DispatchableInterface {
public function dispatch(Request $request, Response $response = null) { $response->setContent("Hello World!");
}
}
그만큼 DispatchableInterface기본이며 높은 수준의 컨트롤러를 작성하려면 다른 많은 인터페이스가 필요합니다. 이러한 인터페이스 중 일부는 다음과 같습니다.
InjectApplicationEventInterface − 이벤트 주입에 사용 (Zend EventManager)
ServiceLocatorAwareInterface − 서비스를 찾는 데 사용 (Zend ServiceManager)
EventManagerAwareInterface − 이벤트 관리에 사용 (Zend EventManager)
이러한 점을 염두에두고 Zend 프레임 워크는 이러한 인터페이스를 구현하는 많은 기성 컨트롤러를 제공합니다. 가장 중요한 컨트롤러는 다음과 같습니다.
AbstractActionController
AbstractActionController (Zend / Mvc / Controller / AbstractActionController)는 Zend MVC 프레임 워크에서 가장 많이 사용되는 컨트롤러입니다. 일반적인 웹 페이지를 작성하는 데 필요한 모든 기능이 있습니다. 라우트 (라우팅은 요청 URL을 컨트롤러 및 해당 메소드 중 하나에 일치)가action. 일치하면 컨트롤러가 작업 이름을 따서 명명 된 메서드를 호출합니다.
예를 들어, 경로가 test 일치하고 경로, test 보고 hello 행동을 위해 helloAction 메소드가 호출됩니다.
우리를 쓰자 TutorialController 사용하여 AbstractActionController.
라는 새 PHP 클래스를 만듭니다. TutorialController 확장하여 AbstractActionController 그리고 그것을 module/Tutorial/src/Controller/ 예배 규칙서.
설정 Tutorial\Controller 네임 스페이스로.
쓰기 indexAction 방법.
반환 ViewModel 의 개체 indexAction방법. 그만큼ViewModel object는 컨트롤러에서 뷰 엔진으로 데이터를 보내는 데 사용됩니다. 다음 장에서 살펴 보겠습니다.
전체 코드 목록은 다음과 같습니다.
?php
namespace Tutorial\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TutorialController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
우리는 성공적으로 새로운 TutorialController.
AbstractRestfulController
AbstractRestfulController (Zend \ Mvc \ Controller \ AbstractRestfulController)는 HTTP를 검사합니다. method HTTP 메서드를 고려하여 작업 (메서드)과 일치합니다.
예를 들어 GET HTTP 메서드를 사용한 요청은 getList() 방법 또는 get() 방법, 경우 id 매개 변수가 요청에 있습니다.
AbstractConsoleController
AbstractConsoleController (Zend \ Mvc \ Controller \ AbstractConsoleController)는 브라우저가 아닌 콘솔 환경에서만 실행된다는 점을 제외하면 AbstractActionController와 비슷합니다.
라우팅 맵 Request URI특정 컨트롤러의 방법에. 이 장에서는 Zend 프레임 워크에서 경로를 구현하는 방법을 살펴 보겠습니다.
일반적으로 모든 URI는 세 부분으로 구성됩니다.
- 호스트 이름 세그먼트,
- 경로 세그먼트 및
- 쿼리 세그먼트.
예를 들어, URI / URL- http://www.example.com/index?q=data, www.example.com 호스트 이름 세그먼트입니다. index 경로 세그먼트이고 q=data쿼리 세그먼트입니다. 일반적으로 라우팅은Page segment일련의 제약에 대해. 제약 조건이 일치하면 값 집합을 반환합니다. 주요 가치 중 하나는 컨트롤러입니다.
라우팅은 또한 특정 상황에서 호스트 세그먼트, 쿼리 세그먼트, 요청 HTTP 메서드, 요청 HTTP 헤더 등을 확인합니다.
경로 및 RouteStack
Route는 라우팅의 주요 개체입니다. Zend Framework에는 경로 객체를위한 특수 인터페이스가 있습니다.RouteInterface. 모든 경로 개체는 RouteInterface를 구현해야합니다. RouteInterface의 전체 목록은 다음과 같습니다.
namespace Zend\Mvc\Router;
use Zend\Stdlib\RequestInterface as Request;
interface RouteInterface {
public static function factory(array $options = []); public function match(Request $request);
public function assemble(array $params = [], array $options = []);
}
주요 방법은 match. 이 일치 메소드는 정의 된 제한에 대해 주어진 요청을 확인합니다. 일치하는 항목이 있으면RouteMatch목적. 이 RouteMatch 객체는 일치하는 요청의 세부 정보를 매개 변수로 제공합니다. 이러한 매개 변수는 다음에서 추출 할 수 있습니다.RouteObject 사용하여 getParams 방법.
RouteObject의 전체 목록은 다음과 같습니다.
namespace Zend\Mvc\Router;
class RouteMatch {
public function __construct(array $params); public function setMatchedRouteName($name);
public function getMatchedRouteName();
public function setParam($name, $value);
public function getParams();
public function getParam($name, $default = null);
}
일반적으로 일반적인 MVC 응용 프로그램에는 많은 경로가 있습니다. 각 경로는 LIFO 순서로 처리되며 단일 경로가 일치하여 반환됩니다. 일치 / 반환 된 경로가 없으면 응용 프로그램은 "페이지를 찾을 수 없음"오류를 반환합니다. Zend Framework는 경로를 처리하는 인터페이스를 제공합니다.RouteStackInterface. 이 RouteStackInterface에는 경로를 추가 / 제거하는 옵션이 있습니다.
RouteStackInterface의 전체 목록은 다음과 같습니다.
namespace Zend\Mvc\Router;
interface RouteStackInterface extends RouteInterface {
public function addRoute($name, $route, $priority = null); public function addRoutes(array $routes);
public function removeRoute($name); public function setRoutes(array $routes);
}
Zend 프레임 워크는 RouteStack 인터페이스는 다음과 같습니다-
- SimpleRouteStack
- TreeRouteStack
경로 유형
Zend 프레임 워크는 "Zend \ Mvc \ Router \ Http"네임 스페이스 아래의 모든 상황에 대해 준비된 많은 경로 개체를 제공합니다. 주어진 상황에 맞는 경로 객체를 선택하고 사용하는 것으로 충분합니다.
사용 가능한 경로는 다음과 같습니다-
Hostname − URI의 호스트 부분을 일치시키는 데 사용됩니다.
Literal − 정확한 URI를 일치시키는 데 사용됩니다.
Method − 들어오는 요청의 HTTP 방식을 일치시키는 데 사용됩니다.
Part − 사용자 정의 논리를 사용하여 URI 경로 세그먼트의 일부를 일치시키는 데 사용됩니다.
Regex − 정규식 패턴으로 URI 경로 세그먼트를 일치시키는 데 사용됩니다.
Schema − http, https 등과 같은 URI 스키마를 일치시키는 데 사용됩니다.
Segment − URI 경로를 여러 세그먼트로 분할하여 일치시키는 데 사용됩니다.
가장 일반적으로 사용되는 리터럴 및 세그먼트 경로를 작성하는 방법을 살펴 보겠습니다. 경로는 일반적으로 각 모듈의 구성 파일에 지정됩니다.module.config.php.
리터럴 루트
일반적으로 경로는 LIFO 순서로 쿼리됩니다. Literal 경로는 URI 경로를 정확히 일치시키기위한 것입니다.
다음과 같이 정의됩니다.
$route = Literal::factory(array(
'route' => '/path',
'defaults' => array('controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
위의 경로는 /path 요청 URL 및 반환 index 로 action 과 IndexController 컨트롤러로.
구간 경로
세그먼트 경로는 URL에 변수 매개 변수가 포함되어야 할 때마다 사용됩니다.
다음과 같이 설명됩니다.
$route = Segment::factory(array(
'route' => '/:controller[/:action]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
),
'defaults' => array(
'controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
여기서 세그먼트는 콜론으로 표시되고 그 뒤에 영숫자 문자가옵니다. 유지하는 세그먼트는 선택 사항 인 경우 대괄호로 묶입니다. 각 세그먼트에는 연관된 제약 조건이있을 수 있습니다. 각 제약은 정규식입니다.
자습서 모듈에서 경로 구성
Tutorial 모듈에 세그먼트 경로를 추가하겠습니다. 튜토리얼 모듈 구성 파일 업데이트 –module.config.php 사용 가능 myapp/module/Tutorial/config.
<?php
namespace Tutorial;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\TutorialController::class => InvokableFactory::class,
],
],
'router' => [
'routes' => [
'tutorial' => [
'type' => Segment::class,
'options' => [
'route' => '/tutorial[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\TutorialController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
],
];
우리는 라우팅을 성공적으로 추가했습니다. Tutorial기준 치수. 우리는 튜토리얼 모듈을 완료하는 데 한 단계 뒤쳐져 있습니다. 우리는 추가해야합니다View 우리 모듈에 대해서는 다음 장에서 배울 것입니다.
보기 계층은 MVC 응용 프로그램의 표시 계층입니다. 애플리케이션 로직과 프리젠 테이션 로직을 분리합니다. 일반적인 PHP 웹 애플리케이션에서는 모든 비즈니스 로직과 디자인이 혼합되어 있습니다. 혼합은 소규모 프로젝트에서 더 빠른 개발을 가능하게합니다. 그러나 높은 수준의 아키텍처가 많이 관련된 대규모 프로젝트에서는 비참하게 실패합니다. 웹 애플리케이션의 디자인을 변경하려면 개발자도 비즈니스 로직에 대해 작업해야합니다. 이로 인해 비즈니스 로직이 손상 될 수 있습니다.
Zend Framework는 잘 생각하고 깨끗하며 유연하며 확장 가능한 뷰 레이어를 제공합니다. View 레이어는 별도의 모듈로 사용할 수 있습니다.Zend/View 그리고 잘 통합 Zend/Mvc기준 치수. Zend View Layer는 서로 멋지게 상호 작용하는 여러 구성 요소로 분리됩니다.
다양한 구성 요소는 다음과 같습니다-
Variables Containers − 뷰 레이어의 데이터를 보관합니다.
View Models − 가변 컨테이너 및 디자인 템플릿을 보관합니다.
Renderers − View Model에서 데이터와 템플릿을 처리하고 최종 HTML 출력과 같은 디자인 표현을 출력합니다.
Resolvers − 렌더러가 사용할 수있는 방식으로 View Model에서 사용 가능한 템플릿을 해결합니다.
View (Zend\View\View) − 요청을 렌더러에 매핑 한 다음 렌더러를 응답에 매핑합니다.
Rendering Strategies − View에서 렌더러에 요청을 매핑하는 데 사용됩니다.
Response Strategies − View에서 렌더러를 응답에 매핑하는 데 사용됩니다.
뷰 레이어, View 처리 ViewModel,는 Resolver, 사용하여 렌더링 Rendering Strategy 마지막으로 Response Renderer.
레이어 구성보기
컨트롤러와 마찬가지로보기 계층은 다음과 같은 모듈의 구성 파일에서 구성 할 수 있습니다. module.config.php. 기본 구성은 템플릿을 배치 할 위치를 지정하는 것입니다. "module.config.php"에 다음 구성을 추가하여 수행 할 수 있습니다.
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
]
기본적으로 View 레이어에는 모든 구성 요소에 대한 기본 동작이 있습니다. 예를 들어,ViewModel"lowercase-module-name / lowercase-controller-name / lowercase-action-name"규칙에 따라 템플릿 루트 내에서 컨트롤러 작업의 템플릿 이름을 확인합니다. 그러나 이것은setTemplate() ViewModel의 메소드.
컨트롤러 및 뷰 레이어
기본적으로 컨트롤러는 뷰 레이어에 데이터를 보낼 필요가 없습니다. 적절한 위치에 템플릿을 작성하는 것으로 충분합니다.
예를 들어,이 예에서는 TutorialController, 템플릿은 myapp/module/Tutorial/view/tutorial/tutorial/index.phtml. 그만큼index.phtmlPHP 기반 템플릿을 참조하며 PHPRenderer에 의해 렌더링됩니다. 다음과 같은 다른 렌더러가 있습니다.JsonRenderer ...에 대한 json 출력 및 FeedRenderer ...에 대한 rss 과 atom 산출.
전체 목록은 다음과 같습니다-
<?php
namespace Tutorial\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TutorialController extends AbstractActionController {
public function indexAction() {
}
}
Zend 애플리케이션 템플릿
<div class = "row content">
<h3>This is my first Zend application</h3>
</div>
마지막으로 우리는 성공적으로 Tutorial 모듈과 URL을 사용하여 액세스 할 수 있습니다. http://localhost:8080/tutorial.
뷰 레이어에 데이터 전달
데이터를 뷰 레이어로 보내는 가장 간단한 방법은 ViewModel인수. 변경indexAction 방법은 다음과 같습니다-
public function indexAction() {
$view = new ViewModel([ 'message' => 'Hello, Tutorial' ]); return $view;
}
이제 index.phtml 다음과 같이 파일-
<div class = "row content">
<h3>This is my first Zend application</h3>
<h4><?php echo $this->message?></h4>
</div>
도우미보기
View Helper는 템플릿에서 사용할 작은 원자 함수를 작성하는 데 사용됩니다. Zend 프레임 워크는 표준보기 도우미를 작성하기 위해 Zend \ View \ Helper \ HelperInterface 인터페이스를 제공합니다.
HelperInterface에는 두 가지 방법 만 있습니다.
setView() −이 메서드는 Zend \ View \ Renderer \ RendererInterface 인스턴스 / 구현을 허용합니다.
getView() − 해당 인스턴스를 검색하는 데 사용됩니다.
전체 코드 목록 HelperInterface 다음과 같습니다-
namespace Zend\View\Helper;
use Zend\View\Renderer\RendererInterface as Renderer;
interface HelperInterface {
/**
* Set the View object
*
* @param Renderer $view
* @return HelperInterface
*/
public function setView(Renderer $view);
/**
* Get the View object
*
* @return Renderer
*/
public function getView();
}
보기 스크립트에서 도우미를 사용하려면 다음을 사용하여 액세스하십시오. $this->helperName().
내장 도우미
Zend Framework는 다양한 목적을 위해 많은 내장 도우미 기능을 제공합니다. 일부보기 도우미는zend-mvc 다음과 같습니다-
URL
URL 도우미는 애플리케이션에 정의 된 경로와 일치하는 URL을 생성하는 데 사용됩니다.
URL 도우미의 정의는 다음과 같습니다.
$this->url($name, $params, $options, $reuseMatchedParameters)
예를 들어, 튜토리얼 모듈에서 경로 이름은 다음과 같습니다. tutorial 두 개의 매개 변수가 있습니다. action 과 id. URL 도우미를 사용하여 아래와 같이 두 개의 다른 URL을 생성 할 수 있습니다.
<a href = "<? = $this->url('tutorial'); ?>">Tutorial Index</a>
<a href = "<? = $this->url('tutorial', ['action' => 'show', 'id' =>10]); ?>">
Details of Tutorial #10
</a>
결과는 다음과 같습니다.
<a href = "/tutorial">Tutorial Index</a>
<a href = "/tutorial/show/10"> Details of Tutorial #10</a>
자리 표시 자
플레이스 홀더 도우미는보기 스크립트와보기 인스턴스간에 콘텐츠를 유지하는 데 사용됩니다. 초기에 데이터를 설정 한 후 이후 단계에서 사용하는 옵션을 제공합니다.
예를 들어 다음과 같이 설정할 수 있습니다. company name 다른 모든 곳에서 사용합니다.
<?php $this->placeholder('companyname')->set("TutorialsPoint") ?>
<?= $this->placeholder('companyname'); ?>
자리 표시자는 PHP 배열 및 개체에서 복잡한 콘텐츠를 생성하는 몇 가지 고급 옵션을 제공합니다. 또한 템플릿 자체의 특정 섹션을 캡처하는 옵션이 있습니다.
예를 들어 다음 코드는 그 사이에 템플릿 결과를 캡처하고 productlist 자리 표시 자.
Class – Product
class Product {
public $name;
public $description;
}
Controller
$p1 = new Product();
$p1->name = 'Car'; $p1->description = 'Car';
$p2 = new Product(); $p2->name = 'Cycle';
$p2->description = 'Cycle'; $view = new ViewModel(['products' => $products]);
Template
<!-- start capture -->
<?php $this->placeholder('productlist')->captureStart();
foreach ($this->products as $product): ?>
<div>
<h2><?= $product->name ?></h2> <p><?= $product->description ?></p>
</div>
<?php endforeach; ?>
<?php $this->placeholder('productlist')->captureEnd() ?> <!-- end capture --> <?= $this->placeholder('productlist') ?>
Result
<div class = "foo">
<h2>Car</h2>
<p>Car</p>
</div>
<div class = "foo">
<h2>Cycle</h2>
<p>Cycle</p>
</div>
문서 유형
Doctype 도우미는 다양한 html doctype을 생성하는 데 사용됩니다. 의 구체적인 구현입니다Placeholder돕는 사람. doctype은 부트 스트랩 파일 및 구성 파일에서 설정할 수 있습니다.
기본 사용법은 다음과 같습니다.
Application Bootstrap file
use Zend\View\Helper\Doctype;
$doctypeHelper = new Doctype(); $doctypeHelper->doctype('XHTML5');
Module Configuration
// module/Application/config/module.config.php:
return [
/* ... */
'view_manager' => [
'doctype' => 'html5',
/* ... */
],
];
Template
<?php echo $this->doctype() ?>
HeadTitle
HeadTitle 도우미는 html 제목 요소를 생성하는 데 사용됩니다. 구체적인 구현입니다Placeholder돕는 사람. Zend는 모듈 구성 파일에 제목을 설정하는 옵션을 제공하며 사이트, 모듈, 컨트롤러, 액션 등과 같은 모든 수준에서 설정할 수 있습니다. HeadTitle에 대한 부분 코드는 다음과 같습니다.
Module
headTitleHelper->append($action);
$headTitleHelper->append($controller);
$headTitleHelper->append($module);
$headTitleHelper->append($siteName);
Template
<?= $this->headTitle() ?>
Result
action - controller - module - Zend Framework
HeadMeta
HeadMeta 도우미는 html 메타 태그를 생성하는 데 사용됩니다. Placeholder 도우미의 구체적인 구현입니다.
Template −
<?php
$this->headMeta()->appendName('keywords', 'turorialspoint, zend framework, php');
echo $this->headMeta()
?>
Result
<meta name = "keywords" content = "tutorialspoint, zend framework, php" />
HeadLink
HeadLink 도우미는 외부 리소스를 포함하는 html 링크를 생성하는 데 사용됩니다. 자리 표시 자 도우미의 구체적인 구현입니다.
Template
<?php
// setting links in a view script:
$this->headLink(['rel' => 'icon', 'href' => '/img/favicon.ico'], 'PREPEND')
->appendStylesheet('/styles/site.css')
->prependStylesheet('/styles/mystyle.css', 'screen', true, ['id' => 'mystyle']);
// rendering the links from the layout:
echo $this->headLink();
?>
Result
<link href = "/styles/mystyle.css" media = "screen" rel = "stylesheet"
type = "text/css" id = "mystyle">
<link href = "/img/favicon.ico" rel = "icon">
<link href = "/styles/site.css" media = "screen" rel = "stylesheet" type = "text/css">
HeadStyle
HeadStyle 도우미는 인라인 CSS 스타일을 생성하는 데 사용됩니다. 자리 표시 자 도우미의 구체적인 구현입니다.
Template
<?php $this->headStyle()->appendStyle($styles); ?> <?php echo $this->headStyle() ?>
HeadScript
HeadScript는 인라인 스크립트를 생성하거나 외부 스크립트를 포함하는 데 사용됩니다. 자리 표시 자 도우미의 구체적인 구현입니다.
Template
<? $this->headScript()->appendFile(‘/js/sample.js’);?> <?php echo $this->headScript() ?>
InlineScript
InlineScript는 html 템플릿의 head 및 body 섹션에서 스크립트를 생성하는 데 사용됩니다. HeadScript에서 파생되었습니다.
HTMLList
HTMLList는 정렬 된 목록과 정렬되지 않은 목록을 생성하는 데 사용됩니다. HTMLList의 정의는 다음과 같습니다-
Definition
htmlList($items, $ordered, $attribs, $escape)
Template
$items = [ '2015', ['March', 'November'], '2016', ]; echo $this->htmlList($items);
Result
<ul>
<li>2015
<ul>
<li>March</li>
<li>November</li>
</ul>
</li>
<li>2016</li>
</ul>
주기
사이클은 루프 환경에서 대안을 생성하는 데 사용됩니다. 할당, 다음 및 이전 기능이 있습니다.
Controller
$view = new ViewModel(['message' => 'Hello, Tutorial', 'data' => array('One', 'Two')]);
Template
<?php $this->cycle()->assign(['#F0F0F0', '#FFF'], 'colors'); ?> <table> <?php foreach ($this->data as $datum): ?> <tr style = "background-color: <?= $this->cycle()->setName('colors')>next() ?>">
<td><?= $this->escapeHtml($datum) ?></td>
</tr>
<?php endforeach ?>
</table>
Result
<table>
<tr style = "background-color: #F0F0F0">
<td>One</td>
</tr>
<tr style = "background-color: #FFF">
<td>Two</td>
</tr>
</table>
몇 가지 다른 중요한 내장 도우미는 다음과 같습니다.
BasePath − BasePath는 애플리케이션 루트의 공용 폴더 경로를 생성하는 데 사용됩니다.
Partial − 부분은 자체 변수 범위에서 특정 템플릿을 렌더링하는 데 사용됩니다.
PartialLoop − PartialLoop은 Partial과 비슷하지만 루핑 환경에서 사용됩니다.
Identity − ID는 인증 서비스에서 로그인 한 사용자의 ID를 검색하는 데 사용됩니다.
JSON− JSON은 출력이 JSON 형식 인 편안한 환경에서 사용됩니다. 적절한 HTTP 헤더를 내보내고 레이아웃 개념을 비활성화합니다.
Zend Framework에는 여전히 다음과 같은 많은 도우미가 있습니다. i18n helper, form helpers, pagination helpers, navigation helpers등
보기 도우미 만들기
Zend 프레임 워크는 AbstractHelper 구현 HelperInterface 뷰 헬퍼를 작성합니다.
새 도우미를 작성하는 단계는 다음과 같습니다.
Step 1 − Zend \ View \ Helper \ AbstractHelper 클래스를 확장합니다.
Step 2 − 재정의 __invoke() 함수.
Step 3 −에서 구성을 설정합니다. module.config.php file.
Step 4 −보기 스크립트에서보기 도우미를 사용합니다.
이제 TestHelper
다음 위치에 도우미 폴더 만들기 myapp/module/Tutorial/src/View directory. 쓰다TestHelper Helper 디렉토리 내부, TestHelper.php.
전체 목록은 다음과 같습니다-
<?php
namespace Tutorial\View\Helper;
use Zend\View\Helper\AbstractHelper;
class TestHelper extends AbstractHelper {
public function __invoke() {
$output = "I am from test helper"; return htmlspecialchars($output, ENT_QUOTES, 'UTF-8');
}
}
구성 설정 module.config.php.
'view_helpers' => [
'aliases' => [
'testHelper' => View\Helper\TestHelper::class,
],
'factories' => [
View\Helper\TestHelper::class => InvokableFactory::class,
],
],
새로 만든 사용 TestHelper 에 about 스크립트보기.
<?= $this->testHelper() ?>
레이아웃은 여러보기의 공통 부분 (예 : 페이지 머리글 및 바닥 글)을 나타냅니다. 기본적으로 레이아웃은view/layout 폴더.
레이아웃 구성은 view_manager module.config.php의 섹션.
스켈레톤 애플리케이션의 기본 구성은 다음과 같습니다.
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
여기, template_map레이아웃을 지정하는 데 사용됩니다. 레이아웃을 찾을 수 없으면 오류를 반환합니다. 스켈레톤 애플리케이션의 기본 레이아웃을 살펴 보겠습니다.
Layout.phtml
<?= $this->doctype() ?>
<html lang = "en">
<head>
<meta charset = "utf-8">
<?= $this->headTitle('ZF Skeleton Application')->setSeparator(' - ')> setAutoEscape(false) ?> <?= $this->headMeta()
->appendName('viewport', 'width = device-width, initial-scale = 1.0')
->appendHttpEquiv('X-UA-Compatible', 'IE = edge')
?>
<!-- Le styles -->
<?= $this->headLink(['rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/img/favicon.ico'])
->prependStylesheet($this->basePath('css/style.css')) ->prependStylesheet($this->basePath('css/bootstraptheme.min.css'))
->prependStylesheet($this->basePath('css/bootstrap.min.css')) ?> <!-- Scripts --> <?= $this->headScript()
->prependFile($this->basePath('js/bootstrap.min.js')) ->prependFile($this->basePath('js/jquery-3.1.0.min.js'))
?>
</head>
<body>
<nav class = "navbar navbar-inverse navbar-fixed-top" role = "navigation">
<div class = "container">
<div class = "navbar-header">
<button type = "button" class = "navbar-toggle" data-
toggle = "collapse" data-target = ".navbar-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</button>
<a class = "navbar-brand" href = "<?= $this->url('home') ?>"> <img src = "<?= $this->basePath('img/zf-logo-mark.svg') ?>
" height = "28" alt = "Zend Framework <?= \Application\Module::
VERSION ?>"/> Skeleton Application
</a>
</div>
<div class = "collapse navbar-collapse">
<ul class = "nav navbar-nav">
<li class = "active"><a href = "<?=
$this->url('home') ?>">Home</a></li> </ul> </div> </div> </nav> <div class = "container"> <?= $this->content ?>
<hr>
<footer>
<p>© 2005 - <?= date('Y') ?> by Zend Technologies Ltd.
All rights reserved.</p>
</footer>
</div>
<?= $this->inlineScript() ?>
</body>
</html>
레이아웃을 분석 할 때 주로 이전 장에서 논의한 뷰 도우미를 사용합니다. 자세히 살펴보면 레이아웃은 특수 변수를 사용합니다.$this->content. 이 변수는 실제 요청 된 페이지의보기 스크립트 (템플릿)로 대체되므로 중요합니다.
새 레이아웃 만들기
Tutorial 모듈을위한 새로운 레이아웃을 만들어 보겠습니다.
우선, tutorial.css file "public / css"디렉토리 아래에 있습니다.
body {
background-color: lightblue;
}
h1 {
color: white;
text-align: center;
}
새 레이아웃 파일 만들기 newlayout.phtml/ myapp / module / Tutorial / view / layout /에서 기존 레이아웃에서 콘텐츠를 복사합니다. 그런 다음tutorial.css 스타일 시트를 사용하는 HeadLink 레이아웃 헤드 섹션 내의 도우미 클래스.
<?php echo $this->headLink()->appendStylesheet('/css/tutorial.css');?>
새로 추가 about 탐색 섹션에서 링크를 사용하여 URL 돕는 사람.
<li><a href = "<?= $this->url('tutorial', ['action' => 'about']) ?>">About</a></li>
이 레이아웃 페이지는 튜토리얼 모듈 애플리케이션에 공통입니다. 업데이트view_manager 튜토리얼 모듈 구성 파일의 섹션.
'view_manager' => array(
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/newlayout.phtml'),
'template_path_stack' => array('tutorial' => __DIR__ . '/../view',),
)
추가 aboutAction 기능 TutorialController.
public function aboutAction() {
}
추가 about.phtml myapp / module / Tutorial / view / tutorial / tutorial /에 다음 내용이 있습니다.
<h2>About page</h2>
이제 마지막으로 응용 프로그램을 실행할 준비가되었습니다. http://localhost:8080/tutorial/about.
이 장에서는 Zend Framework의 다양한 모델과 데이터베이스에 대해 설명합니다.
Zend Framework의 모델
모델은 애플리케이션의 논리적 데이터 표현을 정의합니다. 예를 들어 쇼핑 카트 애플리케이션에서 제품, 고객, 카트 및 주문은 모델입니다. 보유하고있는 엔티티의 속성을 정의합니다. 모델의 개념 중 일부는 다음과 같습니다.
컨트롤러는 모델과 통신하고 필요한 정보를 검색하도록 요청합니다. 이 검색된 정보는 컨트롤러에 의해 뷰로 전달됩니다. 마지막으로 View는 모델을 사용자가 사용할 수있는 프리젠 테이션 데이터로 렌더링합니다.
모델이 뷰와 직접 상호 작용하는 경우는 매우 드물지만 때때로 발생할 수 있습니다.
모델은 서로 대화 할 수 있으며 독립적이지 않습니다. 그들은 서로 관계가 있습니다. 이러한 관계는 다른 모델과 상호 작용할 필요가 없기 때문에 컨트롤러가 정보를 더 쉽고 빠르게 얻을 수 있도록합니다. 모델이 스스로 할 수 있습니다.
간단한 모델을 살펴 보겠습니다. MyModel
<?php
namespace Tutorial\Model;
class Book {
public $id; public $author;
public $title;
}
Zend Framework의 데이터베이스
Zend 프레임 워크는 간단하고 기능이 풍부한 클래스 인 Zend \ Db \ TableGateway \ TableGateway를 제공하여 데이터베이스 테이블에서 데이터를 찾고, 삽입하고, 업데이트하고, 삭제할 수 있습니다.
연결하는 방법을 보자 MySqlservice Zend 프레임 워크에서 PHP의 PDO 드라이버를 통해 다음 단계를 수행합니다.
1 단계 : MySQL에서 데이터베이스 생성
데이터베이스 생성 tutorials로컬 MySQL 서버에서. 우리는 사용할 수 있습니다phpmyadmin또는이 목적을위한 다른 MySQL GUI 도구. 사용하자MySQL client명령 프롬프트에서. mysql 서버에 연결하고 다음 명령을 실행하여tutorial 데이터 베이스.
create database tutorials
2 단계 : 자습서 DB에서 테이블 만들기
이제 데이터베이스를 생성하겠습니다. book 에 tutorials 다음 SQL 명령을 사용하여 db.
use tutorials;
CREATE TABLE book (
id int(11) NOT NULL auto_increment,
author varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
3 단계 : 책 테이블에 데이터 채우기
채우기 book샘플 데이터가있는 테이블. 다음 SQL 명령을 사용하십시오.
INSERT INTO book (author, title) VALUES ('Dennis Ritchie', 'C Programming');
INSERT INTO book (author, title) VALUES ('James gosling', 'Java Programming');
INSERT INTO book (author, title) VALUES ('Rasmus Lerdorf', 'Programming PHP');
4 단계 : 데이터베이스 연결 업데이트
글로벌 구성 파일 (myapp / config / autoload / global.php)을 필요한 데이터베이스 드라이브 정보로 업데이트하십시오.
<?php
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname = tutorials;host = localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
),
),
);
5 단계 : 데이터베이스 자격 증명 업데이트
로컬 구성 파일 (myapp / config / autoload / local.php)에서 데이터베이스 자격 증명을 업데이트합니다. 이러한 방식으로 로컬 및 라이브 데이터베이스 연결 자격 증명을 분리 할 수 있습니다.
<?php
return array(
'db' => array(
'username' => '<user_name>',
'password' => '<password>',
),
);
6 단계 : 도서 용 모델 생성
모델을 만들어 보겠습니다. Book 우리 모듈에서 src예배 규칙서. 일반적으로 모델은 Model 폴더 (/myapp/module/Tutorial/src/Model/Book.php) 아래에 그룹화됩니다.
<?php
namespace Tutorial\Model;
class Book {
public $id;
public $author; public $title;
}
7 단계 : 책 모델에서 exchangeArray 구현
그만큼 TableGateway 통해 모델과 상호 작용 exchangeArray함수. exchangeArray 함수의 표준 인수는 PHP 배열로 저장된 데이터베이스 결과 집합입니다. 사용exchangeArrayfunction, 모델의 속성을 해당 데이터베이스 테이블과 쉽게 동기화 할 수 있습니다.
모델 업데이트, Book 아래와 같이-
<?php
namespace Tutorial\Model;
class Book {
public $id; public $author;
public $title; public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null; $this->Author = (!empty($data['author'])) ? $data['author'] : null;
$this->Title = (!empty($data['title'])) ? $data['title'] : null;
}
}
8 단계 : TableGateway를 사용하여 책 가져 오기
수업을 만들고, BookTable데이터베이스에서 책 정보를 가져옵니다. 클래스, BookTable을 만듭니다.Model 폴더 자체.
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway;
public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet;
}
}
우리는 사용했습니다 select()TableGateway 클래스의 메서드를 사용하여 데이터베이스에서 책 정보를 가져옵니다. 그러나 우리는 표에 대한 어떤 참조도 사용하지 않았습니다.book코드에서. TableGateway는 본질적으로 일반적이며 특정 구성을 사용하여 모든 테이블에서 데이터를 가져올 수 있습니다. 일반적으로 이러한 구성은module.config.php 이 파일은 후속 단계에서 설명합니다.
9 단계 : BookTable 클래스 구성
튜토리얼 모듈을 업데이트합니다. Module.php 와 더불어 getServiceConfig() 방법.
<?php
namespace Tutorial;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
public function getServiceConfig() {
return [
'factories' => [
Model\BookTable::class => function ($container) { $tableGateway = $container->get(Model\BookTableGateway::class); $table = new Model\BookTable($tableGateway); return $table;
},
Model\BookTableGateway::class => function ($container) { $dbAdapter = $container->get(AdapterInterface::class); $resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Model\Book()); return new TableGateway('book', $dbAdapter, null, $resultSetPrototype);
},
],
];
}
}
여기에서 우리는 BookTable서비스 관리자를 사용하는 클래스. BookTable 클래스는 책 정보를 가져 오는 데 사용되며이를 등록하면 필요할 때마다 액세스 할 수 있습니다. 등록 된 서비스가 공유되기 때문에 성능이 향상되고 메모리 사용량이 감소합니다.
또 다른 항목 인 Model \ BookTableGateway :: class는 다음을 위해 특수화 된 TableGateway 개체입니다. Book 모델이며 BookTable.
10 단계 : TutorialController 구성 업데이트
우리는 BookTable가이드 컨트롤러의 서비스를 사용하여 책 정보를 가져옵니다. BookTable 서비스를 가져 오려면 TutorialController에서 생성자 종속성으로 등록하십시오.
이 생성자 종속성은 컨트롤러 자체가 초기화 단계에있는 동안 BookTable 서비스를 가져 오는 데 도움이됩니다. 튜토리얼 모듈 구성의 컨트롤러 섹션을 업데이트합니다.module.config.php 아래 그림과 같이.
'controllers' => [
'factories' => [
Controller\TutorialController::class => function($container) {
return new Controller\TutorialController(
$container->get(Model\BookTable::class)
);
},
],
],
11 단계 : 튜토리얼 컨트롤러 업데이트
이것은 다음 세 단계를 준수하여 수행됩니다.
- BookTable 을 인수로 사용 하여 생성자를 추가합니다 .
private $table;
public function __construct(BookTable $table) { $this->table = $table;
}
다음을 사용하여 도서 정보를 가져옵니다. BookTable's fetchAll() 메서드를 사용하고 뷰에 등록합니다.
public function indexAction() {
$view = new ViewModel([
'data' => $this->table->fetchAll(), ]); return $view;
}
보기 스크립트에 책 정보를 표시합니다.
<table class = "table">
<tr>
<th>Author</th>
<th>Title</th>
<th> </th>
</tr>
<?php foreach ($data as $sampledata) : ?>
<tr>
<td><?php echo $this->escapeHtml($data->author);?></td>
<td><?php echo $this->escapeHtml($data->title);?></td>
</tr>
<?php endforeach ?>
</table>
12 단계 : 애플리케이션 실행
실행하여 응용 프로그램을 확인하십시오- http://localhost:8080/tutorial.
지난 장에서 논의했듯이 Zend 프레임 워크는 다음을 사용하여 데이터베이스에 액세스하는 일반적인 방법을 제공합니다. Database Driver개념. 데이터베이스 작업은 전적으로 드라이버 정보에 의존하므로 다른 데이터베이스와 연결하려면 드라이버 정보 만 변경하면됩니다.
이제 우리는 book 에 연결하는 예 postgresql 다음 단계로 데이터베이스.
Step 1 − 다음 명령을 사용하여 로컬 postgresql 데이터베이스에 데이터베이스, 자습서 생성 −
CREATE DATABASE tutorials
Step 2 − 추가 book표. 새 데이터베이스로 이동하여 테이블 생성 스크립트를 실행합니다.
\c tutorials
CREATE TABLE book (
id SERIAL NOT NULL,
author varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
Step 3 − 다음 스크립트를 사용하여 샘플 북 정보 추가 −
INSERT INTO book (author, title) VALUES ('Dennis Ritchie', 'C Programming');
INSERT INTO book (author, title) VALUES ('James gosling', 'Java Programming');
INSERT INTO book (author, title) VALUES ('Rasmus Lerdorf', 'Programming PHP');
Step 4 − 드라이버 정보를 global.config file.
<?php
return array (
'db' => array (
'driver' => 'Pdo',
'dsn' => 'pgsql:dbname = tutorials;host = localhost',
'driver_options' => array (
),
),
);
Step 5 −에서 데이터베이스 자격 증명을 변경합니다. local.config 파일.
return array (
'db' => array(
'username' => '<username>',
'password' => '<password>',
),
);
Step 6 − 마지막으로 애플리케이션을 실행합니다. http://localhost:8080/tutorial. 결과는 MySQL 애플리케이션과 동일합니다.
Zend Framework는 별도의 구성 요소를 제공합니다. zend-form양식 생성 및 유효성 검사 프로세스를 가속화합니다. 모델과 뷰 레이어를 연결합니다. 사전 정의 된 모델에서 본격적인 HTML 양식을 생성하기위한 양식 요소 세트를 제공합니다.InputFilter 클래스를 사용하여 양식에 대해 모델의 유효성을 검사하고 양식에서 모델로 또는 그 반대로 데이터를 바인딩하는 옵션을 제공합니다.
양식 구성 요소 설치
Zend 양식 구성 요소는 다음을 사용하여 설치할 수 있습니다. Composer 아래에 지정된 명령-
composer require zendframework/zend-form
Zend 양식 프레임 워크에는 양식을 관리하기위한 세 가지 하위 구성 요소가 있습니다. 아래에 자세히 설명되어 있습니다.
Elements − 모델의 속성에 매핑 된 단일 html 입력 컨트롤을 정의하는 데 사용됩니다.
Fieldset − 요소 및 기타 그룹화에 사용 fieldset 중첩 방식으로.
Form − HTML 양식을 생성하는 데 사용되며 요소와 필드 세트로 구성됩니다.
Zend Forms는 일반적으로 module//src/Form 예배 규칙서.
예
이제 추가 할 간단한 양식을 만들어 보겠습니다. book데이터베이스에. 이렇게하려면 다음 단계를 따라야합니다.
1 단계 : BookForm 생성
* myapp / module / Tutorial / src / Form "디렉토리 아래에"BookForm.php "를 만듭니다. 파일에 다음 변경 사항을 추가하십시오-
<?php
namespace Tutorial\Form;
use Zend\Form\Form;
class BookForm extends Form {
public function __construct($name = null) { parent::__construct('book'); $this->add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array( 'name' => 'author', 'type' => 'Text', 'options' => array( 'label' => 'Author', ), )); $this->add(array(
'name' => 'title',
'type' => 'Text',
'options' => array(
'label' => 'Title',
),
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'attributes' => array(
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
}
그만큼 Form 클래스는 add method모델 및 해당 양식 세부 정보를 매핑합니다. 우리는BookForm 확장하여 Form 클래스에 대한 양식 세부 정보를 추가했습니다. Book 모델.
2 단계 : 도서 모델 인 Book.php 업데이트
모델 업데이트, ‘Book’ 아래에 지정된 필터 및 유효성 검사와 함께-
<?php
namespace Tutorial\Model;
use Zend\InputFilter\InputFilterInterface;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilter;
class Book implements InputFilterAwareInterface {
public $id;
public $author; public $title;
protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) { $inputFilter = new InputFilter();
$inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array(
'name' => 'author',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array( 'name' => 'title', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $this->inputFilter = $inputFilter; } return $this->inputFilter;
}
public function exchangeArray($data) { $this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->author = (!empty($data['author'])) ? $data['author'] : null; $this->title = (!empty($data['title'])) ? $data['title'] : null;
}
}
각 모델은 InputFilterAwareInterface. InputFilterAwareInterface는 두 가지 방법을 제공합니다.setInputFilter() 과 getInputFilter().
getInputFilter는 모델의 유효성 검사 세부 정보를 가져 오는 데 사용됩니다. Zend 프레임 워크는 양식의 유효성을 검사하기위한 다양한 필터 및 유효성 검사기를 제공합니다. 책 모델에서 사용되는 일부 필터 및 유효성 검사기는 다음과 같습니다.
StripTags − 원하지 않는 HTML을 제거합니다.
StringTrim − 불필요한 공백을 제거하십시오.
StringLength validator − 사용자가 지정된 제한보다 많은 문자를 입력하지 않도록하십시오.
3 단계 : BookTable 클래스 업데이트
포함 saveBook 책을 데이터베이스에 추가하는 방법.
BookTable.php
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway; public function __construct(TableGatewayInterface $tableGateway) {
$this->tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet; } public function getBook($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) {
throw new \Exception("Could not find row $id"); } return $row;
}
public function saveBook(Book $book) { $data = array (
'author' => $book->author, 'title' => $book->title,
);
$id = (int) $book->id;
if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getBook($id)) { $this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Book id does not exist');
}
}
}
}
4 단계 : TutorialController 클래스 업데이트
튜토리얼 컨트롤러 (myapp / module / Tutorial / src / Controller / TutorialController.php)에 새 액션 addAction을 추가합니다.
public function addAction() {
$form = new BookForm(); $form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) { $book = new Book();
$form->setInputFilter($book->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) { $book->exchangeArray($form->getData()); $this->bookTable->saveBook($book); // Redirect to list of Tutorial return $this->redirect()->toRoute('tutorial');
}
}
return array('form' => $form);
}
그만큼 addAction 방법은 다음 프로세스를 수행합니다-
요청 개체를 가져옵니다.
요청의 http 메소드가 post 방법.
요청의 http 메소드가 아닌 경우 post, 템플릿을 렌더링하고 add.phtml
요청의 http 메소드가 post, 그런 다음 inputfilter, 요청 데이터를 가져 와서 inputfiler에 설정합니다.
양식이 유효한지 확인합니다. isValid() Form 클래스의 메서드.
양식이 유효하지 않으면 다시 템플릿을 렌더링합니다. add.phtml
양식이 유효하면 책을 데이터베이스에 저장하고 홈 페이지로 리디렉션합니다.
5 단계 : add.phtml 템플릿 추가
템플릿 만들기 – myapp / module / Tutorial / view / tutorial / tutorial / add.phtml 아래에 add.phtml
Add.phtml
<?php
$title = 'Add new Book';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
<?php
if(!empty($form)) { $form->setAttribute('action', $this->url('tutorial', array('action' => 'add'))); $form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('author'))."<br>";
echo $this->formRow($form->get('title'))."<br>";
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
}
여기에서 우리는 Form 예, $form.
6 단계 : 애플리케이션 실행
이제 애플리케이션을 실행할 수 있습니다. http://localhost:8080/tutorial/add.
Form Page
Validate Error Page
파일 업로드는 양식 프로그래밍의 주요 개념 중 하나입니다. Zend 프레임 워크는 다음을 통해 파일을 업로드하는 데 필요한 모든 항목을 제공합니다.zend-form 그리고 zend-inputfilter 구성 요소.
FileInput 클래스
zend-inputfilter 구성 요소는 html 파일 입력 요소를 처리하기 위해 Zend \ InputFilter \ FileInput 클래스를 제공합니다. <input type = 'file' />. 그만큼FileInput몇 가지 예외를 제외하고는 다른 입력 필터와 같습니다. 그들은 다음과 같습니다-
PHP는 업로드 된 파일 세부 정보를 $_FILES 전역 배열에서 FileInput은 $ _FILES를 통해서만 업로드 된 파일 정보를 수집합니다.
FileInput 클래스가 데이터를 처리하기 전에 유효성 검사를 수행해야합니다. 다른 입력 필터의 반대 동작입니다.
Zend \ Validator \ File \ UploadFile이 사용되는 기본 유효성 검사기입니다. 그만큼UploadFile 파일 입력 세부 정보의 유효성을 검사합니다.
양식에 파일 업로드 유형을 추가하려면 입력 유형을 사용해야합니다. File. 부분 코드는 다음과 같습니다.
$form->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array('label' => 'Picture',),
));
파일 업로드에 사용되는 또 다른 클래스는 Zend \ Filter \ File \ RenameUpload입니다. 그만큼RenameUpload업로드 된 파일을 원하는 위치로 이동하는 데 사용됩니다. 파일 필터를 사용하는 부분 클래스는 다음과 같습니다.
$file = new FileInput('imagepath');
$file->getValidatorChain()->attach(new UploadFile()); $file->getFilterChain()->attach(
new RenameUpload([
'target' => './public/tmpuploads/file',
'randomize' => true,
'use_upload_extension' => true
]));
$inputFilter->add($file);
여기에서 옵션 RenameUpload 다음과 같습니다-
target − 업로드 된 파일의 대상 경로.
randomize − 업로드 된 파일의 중복을 방지하기 위해 임의의 문자열을 추가합니다.
use_upload_extension − 대상에 업로드 된 파일에 파일 확장자를 추가합니다.
파일 업로드 – 작업 예
튜토리얼 모듈을 수정하고 사진 업로드 기능을 포함하겠습니다.
데이터베이스 테이블 수정
추가하겠습니다 imagepath 다음 SQL 명령을 실행하여 책 테이블에 열-
ALTER TABLE `book` ADD `imagepath` VARCHAR(255) NOT NULL AFTER 'imagepath';
BookForm.php 업데이트
책 형식 (myapp / module / Tutorial / src / Model / BookForm.php)으로 그림을 업로드하려면 파일 입력 요소를 추가합니다.
다음 코드를 __constructmethod BookForm 클래스의.
$this->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array ('label' => 'Picture',),
));
Book.php 업데이트
Book 클래스에서 myapp / module / Tutorial / src / Model / Book.php를 다음과 같이 변경합니다.
새 속성 추가 imagepath 그림을 위해.
public $imagepath;
업데이트 getInputFilter 아래와 같이 방법-
추가 FileInput 파일 입력 요소에 대한 필터.
설정 UploadFile 파일 입력 요소의 유효성을 검사합니다.
구성 RenameUpload 업로드 된 파일을 적절한 대상으로 이동합니다.
부분 코드 목록은 다음과 같습니다-
$file = new FileInput('imagepath'); $file->getValidatorChain()->attach(new UploadFile());
$file->getFilterChain()->attach( new RenameUpload([ 'target' => './public/tmpuploads/file', 'randomize' => true, 'use_upload_extension' => true ])); $inputFilter->add($file);
업데이트 exchangeArray 포함하는 방법 imagepath특성. 이미지 경로는 양식 또는 데이터베이스에서 가져올 수 있습니다. 이미지 경로가 형식에서 오는 경우 형식은 다음 사양의 배열이됩니다.
array(1) {
["imagepath"] => array(5) {
["name"] => string "myimage.png"
["type"] => string "image/png"
["tmp_name"] => string
"public/tmpuploads/file_<random_string>.<image_ext>"
["error"] => int <error_number>
["size"] => int <size>
}
}
이미지 경로가 데이터베이스에서 가져온 경우 단순한 문자열이됩니다. 이미지 경로를 구문 분석하는 부분 코드 목록은 다음과 같습니다.
if(!empty($data['imagepath'])) {
if(is_array($data['imagepath'])) { $this->imagepath = str_replace("./public", "", $data['imagepath']['tmp_name']); } else { $this->imagepath = $data['imagepath']; } } else { $data['imagepath'] = null;
}
의 전체 목록 Book 모델은 다음과 같습니다-
<?php
namespace Tutorial\Model;
use Zend\InputFilter\InputFilterInterface;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\Filter\File\RenameUpload;
use Zend\Validator\File\UploadFile;
use Zend\InputFilter\FileInput;
use Zend\InputFilter\InputFilter;
class Book implements InputFilterAwareInterface {
public $id; public $author;
public $title; public $imagepath;
protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) { $inputFilter = new InputFilter();
$inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array(
'name' => 'author',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array( 'name' => 'title', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $file = new FileInput('imagepath');
$file->getValidatorChain()->attach(new UploadFile()); $file->getFilterChain()->attach(
new RenameUpload([
'target' => './public/tmpuploads/file',
'randomize' => true,
'use_upload_extension' => true
]));
$inputFilter->add($file);
$this->inputFilter = $inputFilter;
}
return $this->inputFilter; } public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null; $this->author = (!empty($data['author'])) ? $data['author'] : null;
$this->title = (!empty($data['title'])) ? $data['title'] : null; if(!empty($data['imagepath'])) {
if(is_array($data['imagepath'])) { $this->imagepath = str_replace("./public", "",
$data['imagepath']['tmp_name']); } else { $this->imagepath = $data['imagepath']; } } else { $data['imagepath'] = null;
}
}
}
BookTable.php 업데이트
우리는 업데이트했습니다 BookForm 그리고 Book model. 이제 우리는BookTable 및 수정 saveBook방법. 이것은 데이터 배열에 이미지 경로 항목을 포함하기에 충분합니다.$data.
부분 코드 목록은 다음과 같습니다-
$data = array('author' => $book->author, 'title' => $book->title,
'imagepath' => $book->imagepath
);
전체 코드 목록 BookTable 클래스는 다음과 같습니다-
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway;
public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet;
}
public function getBook($id) { $id = (int) $id; $rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) { throw new \Exception("Could not find row $id");
}
return $row; } public function saveBook(Book $book) {
$data = array ( 'author' => $book->author,
'title' => $book->title, 'imagepath' => $book->imagepath
);
$id = (int) $book->id;
if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getBook($id)) { $this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Book id does not exist');
}
}
}
}
Update addAction in the TutorialController.php: 파일 업로드 정보는 $_FILES 전역 배열을 사용하여 액세스 할 수 있습니다. Request's getFiles()방법. 따라서 아래와 같이 게시 된 데이터와 파일 업로드 정보를 모두 병합합니다.
$post = array_merge_recursive(
$request->getPost()->toArray(), $request->getFiles()->toArray()
);
의 전체 목록 addAction() 방법은 다음과 같습니다-
public function addAction() {
$form = new BookForm(); $form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) { $book = new Book();
$form->setInputFilter($book->getInputFilter());
$post = array_merge_recursive( $request->getPost()->toArray(),
$request->getFiles()->toArray() ); $form->setData($post); if ($form->isValid()) {
$book->exchangeArray($form->getData());
$this->bookTable->saveBook($book);
// Redirect to list of Tutorial
return $this->redirect()->toRoute('tutorial'); } } return array('form' => $form);
}
add.phtml의보기 업데이트
마지막으로 "add.phtml"을 변경하고 아래와 같이 이미지 경로 파일 입력 요소를 포함합니다.
echo $this->formRow($form->get('imagepath'))."<br>";
전체 목록은 다음과 같습니다-
<?php
$title = 'Add new Book'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php if(!empty($form)) {
$form->setAttribute('action', $this->url('tutorial', array('action' => 'add')));
$form->prepare(); echo $this->form()->openTag($form); echo $this->formHidden($form->get('id')); echo $this->formRow($form->get('author'))."<br>"; echo $this->formRow($form->get('title'))."<br>"; echo $this->formRow($form->get('imagepath'))."<br>"; echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag();
}
애플리케이션 실행
마지막으로 응용 프로그램을 http://localhost:8080/tutorial/add 새 레코드를 추가하십시오.
결과는 다음 스크린 샷과 같습니다.
Form Page
Index Page
AJAX는 웹 프로그래밍의 최신 기술입니다. 페이지를 새로 고치지 않고 웹 페이지에서 비동기 적으로 데이터를 보내고받는 옵션을 제공합니다. Zend 프레임 워크는json 모델을 통해 zend-view 과 zend-json구성 요소. 이 장에서 Zend AJAX 프로그래밍에 대해 알아 보겠습니다.
json 구성 요소 설치
Zend json 구성 요소는 다음을 사용하여 설치할 수 있습니다. Composer 아래에 지정된 명령-
composer require zendframework/zend-json
개념
Zend 프레임 워크는 AJAX 지원 웹 애플리케이션을 쉽게 작성할 수있는 두 가지 방법을 제공합니다. 그들은 다음과 같습니다-
그만큼 isXmlHttpRequest() 방법 Requestobject – AJAX 요청이 이루어지면 요청 객체의 isXmlHttpRequest () 메서드가 true를 반환하고 그렇지 않으면 false를 반환합니다. 이 메소드는 서버 측에서 AJAX 요청을 적절하게 처리하는 데 사용됩니다.
if ($request->isXmlHttpRequest()) {
// Ajax request
} else {
// Normal request
}
Zend / View / Model / JsonModel – JsonModel 에 대한 대안입니다 ViewModelAJAX 및 REST API 시나리오에만 사용됩니다. JsonModel과 함께JsonStrategy (모듈의 뷰 관리자 블록에서 구성) 모델 데이터를 Json 뷰 (phtml) 대신 응답으로 반환합니다.
AJAX – 작업 예
새로운 ajax 페이지를 추가하겠습니다. ajax튜토리얼 모듈에서 책 정보를 비동기 적으로 가져옵니다. 이렇게하려면 다음 단계를 따라야합니다.
1 단계 : 모듈 구성에 JsonStrategy 추가
튜토리얼 모듈 구성 파일 (myapp / module / Tutorial / config / module.config.php)에서보기 관리자 블록을 업데이트합니다. 그때,JsonStrategy 함께 일할 것이다 JsonModel json 데이터를 인코딩하고 보냅니다.
'view_manager' => [
'template_map' => array
('layout/layout' => __DIR__ . '/../view/layout/newlayout.phtml'),
'template_path_stack' => [
'tutorial' => __DIR__ . '/../view',
],
'strategies' => array('ViewJsonStrategy',),
],
2 단계 : TutorialController.php에 ajaxAction 메서드 추가
다음 코드로 TutorialController.php에 ajaxAction 메소드를 추가합니다.
public function ajaxAction() {
$data = $this->bookTable->fetchAll(); $request = $this->getRequest(); $query = $request->getQuery(); if ($request->isXmlHttpRequest() || $query->get('showJson') == 1) { $jsonData = array();
$idx = 0; foreach($data as $sampledata) { $temp = array(
'author' => $sampledata->author, 'title' => $sampledata->title,
'imagepath' => $sampledata->imagepath ); $jsonData[$idx++] = $temp;
}
$view = new JsonModel($jsonData);
$view->setTerminal(true); } else { $view = new ViewModel();
}
return $view;
}
여기서 ajaxAction은 들어오는 요청이 AJAX인지 여부를 확인합니다. 수신 요청이 AJAX이면JsonModel생성됩니다. 그렇지 않으면 정상ViewModel 생성됩니다.
두 경우 모두 도서 정보는 데이터베이스에서 가져와 모델에 채워집니다. 모델이 JsonModel이면JsonStrategy 호출되고 데이터를 json으로 인코딩하고 응답으로 반환합니다.
그만큼 $query->get('showJson') == 1디버깅 목적으로 사용됩니다. 그냥 추가showJson=1 URL과 페이지에 json 데이터가 표시됩니다.
3 단계 : ajax.phtml 추가
이제보기 스크립트를 추가하십시오. ajax.phtmlajaxAction 메소드의 경우. 이 페이지에는 레이블이있는 링크가 있습니다.Load book information.
해당 링크를 클릭하면 AJAX 요청이 수행되어 도서 정보를 Json 데이터로 가져오고 도서 정보를 형식이 지정된 테이블로 표시합니다. AJAX 처리는JQuery.
전체 코드 목록은 다음과 같습니다.
<a id = "loadbook" href = "#">Load book information</a>
</br> </br>
<table class = "table">
<tbody id = "book">
</tbody>
</table>
<script language = "javascript">
$(document).ready(function(){ $("#loadbook").on("click", function(event){
$.ajax({ url: '/tutorial/ajax', type: 'POST', dataType: 'json', async: true, success: function(data, status) { var e = $('<tr><th>Author</th><th>Title</th><th>Picture</th></tr>');
$('#book').html(''); $('#book').append(e);
for(i = 0; i < data.length; i++) {
book = data[i];
var e = $('<tr><td id = "author"></td><td id = "title"></td> <td id="imagepath"><img src = ""/></td></tr>'); $('#author', e).html(book['author']);
$('#title', e).html(book['title']); $('#imagepath img', e).attr('src', book['imagepath']);
$('#book').append(e);
}
},
error : function(xhr, textStatus, errorThrown) {
alert('Ajax request failed.');
}
});
});
});
</script>
4 단계 : 애플리케이션 실행
마지막으로 응용 프로그램을 실행하십시오. http://localhost:8080/tutorial/ajax 책 정보로드 링크를 클릭합니다.
결과는 다음과 같습니다.
Ajax Page −
Ajax Page with Book Information
Ajax page with debugging information
쿠키는 웹 애플리케이션에서 매우 중요한 개념입니다. 일반적으로 제한된 기간 동안 브라우저 자체의 작은 정보 인 사용자 데이터를 유지하는 옵션을 제공합니다.
쿠키는 웹 애플리케이션의 상태를 유지하는 데 사용됩니다. Zend 프레임 워크는 내부에 쿠키 모듈을 제공합니다.zend-http구성 요소. 이 zend-http는 HTTP 추상화와 구현을 제공합니다.
HTTP 구성 요소 설치
HTTP 구성 요소는 다음을 사용하여 쉽게 설치할 수 있습니다. Composer 아래 코드에 지정된대로.
composer require zendframework/zend-http
개념
zend-http는 Zend\Http\Cookies쿠키를 관리하는 클래스. 그것은 함께 사용됩니다Zend\Http\Client클래스는 웹 서버에 요청을 보내는 데 사용됩니다. 쿠키는 아래 코드와 같이 초기화 할 수 있습니다.
use Zend\Http\Cookies
$c = new Cookies();
HTTP 클라이언트 (Zend \ Http \ Client)가 웹 서버에 URI 요청을 처음 보낼 때 쿠키가 없습니다. 웹 서버에서 요청을 받으면 응답 개체에 쿠키를HTTP Header, Set-CookieHTTP 클라이언트로 보냅니다. HTTP 클라이언트는 http 응답에서 쿠키를 추출하고 후속 요청에서 동일한 HTTP 헤더로 다시 보냅니다. 일반적으로 각 쿠키는 도메인과 도메인 경로에 매핑됩니다.
사용 가능한 방법 Cookies 클래스는 다음과 같습니다-
addCookie(uri) − 주어진 URI의 요청 객체에 쿠키를 추가하는 데 사용됩니다.
getCookie(cookieName, $cookieForm) − 주어진 URI에서 사용 가능한 $ cookieName 쿠키를 가져 오는 데 사용됩니다. $uri. 세 번째 인수는 쿠키가 반환되는 방법 (문자열 또는 배열)입니다.
fromResponse(uri) − 주어진 URI의 응답 객체에서 쿠키를 추출하는 데 사용됩니다.
addCookiesFromResponse − fromResponse와 동일하지만 추출하여 주어진 URI의 요청 객체에 다시 추가합니다.
isEmpty() − 주어진 여부를 찾는 데 사용됩니다. Cookie 개체에 쿠키가 있는지 여부.
reset() − 주어진 URI의 모든 쿠키를 삭제하는 데 사용됩니다.
다음 장에서는 Zend Framework의 세션 관리에 대해 논의 할 것입니다.
세션은 웹 애플리케이션에서 매우 중요한 개념입니다. 제한된 기간 동안 웹 서버에 사용자 데이터를 유지하는 옵션을 제공합니다. Zend 프레임 워크는 별도의 구성 요소를 제공합니다.zend-session 세션 정보를 처리합니다.
세션 구성 요소 설치
세션 구성 요소는 다음을 사용하여 설치할 수 있습니다. Composer 아래에 명시된대로-
composer require zendframework/zend-session
세션 구성 요소
Zend 프레임 워크는 세션 관리를 처리하기위한 6 가지 구성 요소를 제공합니다. 이 모든 구성 요소는 아래에 설명되어 있습니다.
Zend\Session\Container − 세션 정보를 읽고 쓰는 메인 API.
Zend\Session\SessionManager − 세션의 전체 라이프 사이클을 관리하는 데 사용됩니다.
Zend\Session\Storage − 세션 데이터가 메모리에 저장되는 방식을 지정하는 데 사용됩니다.
Zend\Session\SaveHandler − RDBMS, Redis, MangoDB 등과 같은 물리적 위치에 세션 데이터를 저장하고 검색하는 데 사용됩니다.
Zend\Session\Validator − 초기 및 후속 요청의 원격 주소와 사용자 에이전트를 교차 확인하여 세션 하이재킹으로부터 세션을 보호하는 데 사용됩니다.
Zend\Session\Config\SessionConfig − 세션 동작 방식을 설정하는 데 사용됩니다.
기본 구성은 세션 작업에 충분합니다. 위의 구성 요소를 사용하면 세션의 모든 측면을 쉽게 처리 할 수 있습니다.
세션 구성 요소 예
Zend 프레임 워크의 세션을 이해하기위한 새 페이지를 만들기 위해 다음 사항을 따르십시오. 기본적으로 인스턴스를 생성하는 것으로 충분합니다.Container 세션을 관리하는 클래스.
새로운 액션을 만들고, sessionAction 에 TutorialController.
초기화 Container 목적.
$c = new Container();
임의 키 여부 확인 count존재합니다. 키를 사용할 수없는 경우count 값 1로 사용할 수있는 경우 다음 코드에 표시된대로 값을 증가시킵니다.
if (!isset($c->count)) { $c->count = 0;
} else {
$c->count++;
}
ViewModel에 카운트를 등록합니다.
myapp / module / Tutorial / view / tutorial / tutorial / session.phtml에서 sessionAction, session.phtml에 대한 템플릿 파일을 만든 다음 count 값.
페이지를 새로 고침하면 count세션에서. 전체 목록은 다음과 같습니다-
TutorialController.php
public function sessionAction() {
$c = new Container();
if (!isset($c->count)) { $c->count = 0;
} else {
$c->count++; } $view = new ViewModel([
'count' => $c->count, ]); return $view;
}
session.pthml
Session data, COUNT = <?= $this->count ?>
Sample Result
Session data, Count = 5
인증은 모든 웹 애플리케이션에서 가장 중요하고 필수 기능 중 하나입니다. Zend Framework는 인증을 처리하기위한 별도의 구성 요소를 제공합니다.zend-authentication.
인증 구성 요소 설치
인증 구성 요소는 다음을 사용하여 설치할 수 있습니다. Composer 명령.
composer require zendframework/zend-authentication
개념
일반적으로 개발자는 데이터 소스에 대해 사용자 세부 정보를 인증하는 php 함수를 작성합니다. 인증이 완료되면 인증 세부 정보가 후속 요청에 대해 유지됩니다. Zend Framework는이 개념을 일반화하고 아래에 설명 된 두 가지 클래스를 제공합니다.
클래스 1 Zend \ Authentication \ Adaptor \ AdaptorInterface
이 클래스는 단일 메서드를 제공합니다. authenticate인증 로직을 작성합니다. 인증 메서드는 다음 인스턴스를 반환합니다.Zend\Authentication\Result 수업.
이 Result객체는 인증 상태를 보유합니다. 인증이 성공하면 ID를, 인증이 실패하면 오류 메시지를 표시합니다. 인증 인터페이스 및 결과 클래스의 서명은 다음과 같습니다.
AdaptorInterface
namespace Zend\Authentication\Adaptor;
public function authenticate() {
// code
}
Result class
namespace Zend\Authentication;
class Result {
public function __construct($code, $identity, array $messages = []);
}
Zend 프레임 워크는 데이터베이스, ldap, http 기본 및 다이제스트 자격 증명에 대해 인증하는 기본 구현을 제공합니다. 안Adaptor 인증하지만 향후 요청에 대한 세부 정보를 유지하지 않습니다.
클래스 2 Zend \ Authentication \ AuthenticationService
AuthenticationService는 인증 목적으로 이미 구성된 어댑터를 사용하는 기본 구성 요소입니다. 인증이 완료되면 인증 세부 정보를 유지하고 방법을 제공합니다.hasIdentity() 신원이 있는지 확인하려면 getIdentity() 인증 세부 정보를 얻고 clearIdentity() 인증 세부 정보를 지우려면
이 AuthenticationService를 사용하는 부분 코드 목록은 다음과 같습니다.
$adap = new Adapter($username, $password); $auth = new AuthenticationService();
$result = $auth->authenticate($adap); if($result->isValid) {
$identity = $auth->getIdentity();
} else {
// process $result->getMessages() } // clear $auth->clearIdentity();
인증과 관련된 항목은 두 개의 개별 모듈로 패키지화되어 있습니다. zend-permissions-acl 과 zend-permissions-rbac. zend-permissions-acl은 액세스 제어 목록을 기반으로하고 zend-permissions-rbac는 역할 기반 액세스 제어 목록을 기반으로합니다. ACL 및 RBAC 개념의 높은 수준의 추상화를 제공하고 엔터프라이즈 급 애플리케이션 작성을 지원합니다.
Zend Framework는 다음과 같은 별도의 구성 요소를 제공합니다. zend-mail이메일 메시지를 보냅니다. zend-mail 구성 요소는 텍스트 및 html 형식의 첨부 파일이있는 이메일 메시지를 읽고 쓰는 옵션도 제공합니다. Zend에서 이메일을 보내는 것은 훨씬 쉽고 간단하게 구성 할 수 있습니다.
이 장에서 전자 메일 개념, 기본 설정, SMTP 전송과 같은 고급 설정을 살펴 보겠습니다.
메일 구성 요소 설치
다음 Composer 명령을 사용하여 메일 구성 요소를 설치할 수 있습니다.
composer require zendframework/zend-mail
기본 이메일 구성
기본 이메일은 하나 이상의 수신자, 제목, 본문 및 보낸 사람으로 구성됩니다. Zend는Zend\Mail\Message클래스를 사용하여 새 이메일 메시지를 만듭니다. 다음을 사용하여 이메일을 보내려면zend-mail, 하나 이상의 수신자와 메시지 본문을 지정해야합니다.
새 메일 메시지를 만드는 부분 코드는 다음과 같습니다.
use Zend\Mail;
$mail = new Mail\Message(); $mail->setSubject('Zend email sample');
$mail->setBody('This is content of the mail message'); $mail->setFrom('[email protected]', "sender-name");
$mail->addTo('[email protected]', "recipient-name");
Zend는 Zend \ Mail \ Sendmail 클래스를 제공하여 메일 메시지를 보냅니다. Sendmail PHP 네이티브 메일 기능을 사용합니다. mail 메일 메시지를 보내려면 php 구성 파일을 사용하여 전송 계층을 구성 할 수 있습니다.
Sendmail을 사용한 부분 코딩은 다음과 같습니다.
$transport = new Mail\Transport\Sendmail();
$transport->send($mail);
그만큼 zend-mail 많은 전송 레이어를 제공하며 각각은 사용자 이름, 비밀번호 등과 같은 많은 추가 매개 변수를 요구할 수 있습니다.
이메일 관리 방법
주목할만한 이메일 관리 방법 중 일부는 다음과 같습니다.
isValid − '보낸 사람'주소가없는 메시지는 유효하지 않습니다.
isValid() : bool
setEncoding − 메시지 인코딩을 설정합니다.
setEncoding(string $encoding) : void
getEncoding − 메시지 인코딩을 가져옵니다.
getEncoding() : string
setHeaders − 헤더를 작성합니다.
setHeaders(Zend\Mail\Headers $headers) : void
getHeaders − 헤더 컬렉션에 액세스합니다.
getHeaders() : Zend\Mail\Headers
setFrom− From 주소를 설정 (덮어 쓰기)합니다. 여기에는 키가 사람이 읽을 수있는 이름이고 값이 이메일 주소 인 키 / 값 쌍이 포함됩니다.
setFrom(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressList, string|null $name
) : void
addFrom − 'From'주소를 추가합니다.
addFrom(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressOrList, string|null $name
) : void
getFrom − '보낸 사람'발신자 목록을 검색합니다.
getFrom() : AddressList
setTo - Overwrite the address list in the To recipients.
setTo(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressList, null|string $name
) : void
setSubject − 메시지 제목 헤더 값을 설정합니다.
setSubject(string $subject) :void
setBody − 메시지 본문을 설정합니다.
setBody(null|string|Zend\Mime\Message|object $body) : void
SMTP 전송 계층
그만큼 zend-mail 다음을 통해 SMTP 서버를 사용하여 이메일을 보내는 옵션을 제공합니다. Zend\Mail\Transport\Smtpclass. 그것은 같다Sendmail SMTP 호스트, 포트, 사용자 이름, 비밀번호 등을 구성하는 몇 가지 추가 옵션이 있다는 점을 제외하고
부분 코드는 다음과 같습니다.
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
$transport = new SmtpTransport(); $options = new SmtpOptions([
'name' => 'localhost',
'host' =>'smtp.gmail.com',
'port' => 465,
]);
$transport->setOptions($options);
여기,
name − SMTP 호스트의 이름.
host − 원격 호스트 이름 또는 IP 주소.
port − 원격 호스트가 수신하는 포트.
메일 개념 – 예
메일 개념을 이해하기 위해 간단한 PHP 콘솔 애플리케이션을 작성하려면 다음 사항을 따르십시오.
"mailapp"폴더를 만듭니다.
설치 zend-mail 작곡가 도구를 사용합니다.
PHP 파일 만들기 Mail.php "mailapp"폴더 안에 있습니다.
다음을 사용하여 메시지를 만듭니다. Zend\Mail\Message.
$message = new Message(); $message->addTo('[email protected]');
$message->addFrom('[email protected]'); $message->setSubject('Hello!');
$message->setBody("My first Zend-mail application!");
SMTP 전송 계층을 만들고 필요한 구성을 추가합니다.
// Setup SMTP transport using LOGIN authentication
$transport = new SmtpTransport();
$options = new SmtpOptions([ 'name' => 'localhost', 'host' => 'smtp.gmail.com', // or any SMTP server 'port' => 465, // port on which the SMTP server is listening 'connection_class' => 'login', 'connection_config' => [ username' => '<your username>', 'password' => '<your password>', 'ssl' => 'ssl'], ]); $transport->setOptions($options);
다음을 사용하여 이메일을 보냅니다. send 방법.
$transport->send($message);
전체 목록 인 Mail.php 는 다음과 같습니다.
<?php
require __DIR__ . '/vendor/autoload.php';
use Zend\Mail\Message;
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
$message = new Message();
$message->addTo('[email protected]'); $message->addFrom('[email protected]');
$message->setSubject('Hello!'); $message->setBody("My first Zend-mail application!");
// Setup SMTP transport using LOGIN authentication
$transport = new SmtpTransport(); $options = new SmtpOptions([
'name' => 'localhost',
'host' => 'smtp.gmail.com', // or any SMTP server
'port' => 465, // port on which the SMTP server is listening
'connection_class' => 'login',
'connection_config' => [
'username' => '<your username>', 'password' => '<your password>',
'ssl' => 'ssl'],
]);
$transport->setOptions($options);
$transport->send($message);
이제 명령 프롬프트에서 응용 프로그램을 실행하십시오. php Mail.php. 그러면 응용 프로그램에 구성된대로 메일이 전송됩니다.
일반적으로 다음을 사용하여 PHP 애플리케이션을 디버깅 할 수 있습니다. advanced debugger tool 또는 다음과 같은 간단한 명령을 사용하여 echo 과 die. 웹 시나리오에서는 비즈니스 로직과 프리젠 테이션 레이어를 테스트해야합니다. 웹 애플리케이션의 양식은 관련 테스트 데이터를 입력하여 테스트하여 양식이 예상대로 작동하는지 확인할 수 있습니다.
웹 사이트의 디자인은 브라우저를 사용하여 수동으로 테스트 할 수 있습니다. 이러한 유형의 테스트 프로세스는 단위 테스트를 사용하여 자동화 할 수 있습니다. 대규모 프로젝트에서는 단위 테스트가 필수적입니다. 이러한 단위 테스트는 테스트 프로세스를 자동화하고 문제가 발생하면 개발자에게 경고하는 데 도움이됩니다.
PHPUnit 설정
Zend 프레임 워크는 PHPUnit 단위 테스트 프레임 워크와 통합됩니다. Zend 프레임 워크에 대한 단위 테스트를 작성하려면 다음 Composer 명령을 사용하여 쉽게 수행 할 수있는 PHPUnit을 설정해야합니다.
$ composer require --dev phpunit/phpunit
위의 명령을 실행하면 다음 코드 블록과 같은 응답을 받게됩니다.
Using version ^5.7 for phpunit/phpunit
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
이제“composer.json”파일을 열면 다음과 같은 변경 사항을 볼 수 있습니다.
"require-dev": {
"phpunit/phpunit": "^5.7"
}
TestCase 및 어설 션
Zend 프레임 워크는 컨트롤러를 단위 테스트하기위한 도우미 클래스를 제공합니다. 그만큼TestCase 의 주요 구성 요소입니다 PHPUnit 테스트 케이스를 작성하기위한 프레임 워크와 Zend 프레임 워크는 TestCase의 추상적 인 구현을 제공합니다. AbstractHttpControllerTestCase.
이 AbstractHttpControllerTestCase는 다양한 Assert기능별로 그룹화 할 수 있습니다. 그들은 다음과 같습니다-
Request Assertions− http 요청을 주장하는 데 사용됩니다. 예를 들어 assertControllerName입니다.
CSS Select Assertions − HTML DOM 모델을 사용하여 응답 HTML을 확인하는 데 사용됩니다.
XPath Assertions − XPath를 기반으로하는 CSS 선택 어설 션에 대한 대안.
Redirect Assertions − 페이지 리디렉션을 확인하는 데 사용됩니다.
Response Header Assertions − 상태 코드 (assertResponseStatusCode)와 같은 응답 헤더 확인에 사용
테스트 디렉토리 생성
단위 테스트는 각 모듈에 대해 별도로 작성할 수 있습니다. 모든 테스트 관련 코딩은test 모듈의 루트 디렉토리 아래에있는 폴더.
예를 들어 Tutorial 모듈에서 사용할 수있는 TutorialController에 대한 테스트를 작성하려면 테스트 클래스를 myapp / module / Tutorial / test / Controller / 디렉터리에 배치해야합니다.
예
단위 테스트를위한 테스트 클래스를 작성하겠습니다. TutorialController.
먼저 TutorialControllerTest라는 클래스를 작성하고 AbstractHttpControllerTestCase로 확장해야합니다.
다음 단계는 Setup테스트 환경을 설정하는 방법. 이것은 다음을 호출하여 수행 할 수 있습니다.setApplicationConfig 메소드 및 기본 애플리케이션 구성 파일 myapp / config / application.config.php 전달
public function setUp() {
$configOverrides = [];
$this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides
));
parent::setUp();
}
하나 이상의 메서드를 작성하고 요구 사항에 따라 다양한 assert 메서드를 호출합니다.
$this->assertMatchedRouteName('tutorial');
우리는 테스트 클래스를 작성했으며 전체 목록은 다음과 같습니다.
<?php
namespace TutorialTest\Controller;
use Tutorial\Controller\TutorialController;
use Zend\Stdlib\ArrayUtils;
use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;
class TutorialControllerTest extends AbstractHttpControllerTestCase {
public function setUp() {
$configOverrides = [];
$this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides
));
parent::setUp();
}
public function testIndexActionCanBeAccessed() {
$this->dispatch('/tutorial', 'GET'); $this->assertResponseStatusCode(200);
$this->assertModuleName('tutorial'); $this->assertControllerName(TutorialController::class);
$this->assertControllerClass('TutorialController'); $this->assertMatchedRouteName('tutorial');
}
}
이제 명령 프롬프트를 열고 응용 프로그램 루트 디렉토리로 이동하여 phpunit 내부에서 사용할 수있는 실행 파일 vendor 폴더.
cd /path/to/app
./vendor/bin/phpunit ./vendor/bin/phpunit module/
Tutorial/test/Controller/TutorialControllerTest.php
결과는 다음 코드 블록과 같습니다.
PHPUnit 5.7.5 by Sebastian Bergmann and contributors.
.1 / 1 (100%)
Time: 96 ms, Memory: 8.00MB
OK (1 test, 5 assertions)
시스템의 원활한 운영을 위해서는 시스템 장애를 효과적으로 처리해야합니다. Zend 프레임 워크에는default error trapping오류가 발생할 때이를 인쇄하고 기록합니다. 이 동일한 오류 처리기가Exceptions.
오류 처리기는 디버그가 참이면 오류를 표시하고 디버그가 거짓이면 오류를 기록합니다. Zend Framework에는 몇 가지 예외 클래스가 있으며 내장 된 예외 처리는 잡히지 않은 예외를 캡처하고 유용한 페이지를 렌더링합니다.
기본 오류 처리
애플리케이션 구성 파일 myapp / module / Application / config / module.config.php에서 기본 오류 설정을 구성 할 수 있습니다.
부분 코드 샘플은 다음과 같습니다.
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
],
여기서 display_exception, not_found_template, exception_template, error / 404 및 오류 / 색인은 오류 관련 구성 항목이며 자명합니다.
이들 중 가장 중요한 것은 error/index. 시스템에서 예외가 발생할 때 표시되는 템플릿입니다. 이 템플릿 myapp / module / Application / view / error / index.phtml을 수정하여 표시 할 오류의 양을 제어 할 수 있습니다.
이 장에서는 Zend Framework에서 완전한 MVC 기반 직원 애플리케이션을 만드는 방법을 배웁니다. 아래 단계를 따르십시오.
1 단계 : Module.php
먼저-myapp / module / Employee / src / 디렉터리 내에 Employee 모듈을 만든 다음 ConfigProviderInterface 인터페이스를 구현해야합니다.
Module 클래스의 전체 코드는 다음과 같습니다.
<?php
namespace Employee;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
2 단계 : composer.json
구성 Tutorial 모듈 composer.json 다음 코드를 사용하여 자동로드 섹션에서.
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Tutorial\\": "module/Tutorial/src/",
"Employee\\": "module/Employee/src/"
}
}
이제 composer update 명령을 사용하여 애플리케이션을 업데이트하십시오.
composer update
Composer 명령은 애플리케이션에 필요한 변경을 수행하고 아래 명령 프롬프트에 표시된대로 로그를 표시합니다.
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Removing zendframework/zend-component-installer (0.3.0)
- Installing zendframework/zend-component-installer (0.3.1)
Downloading: 100%
- Removing zendframework/zend-stdlib (3.0.1)
- Installing zendframework/zend-stdlib (3.1.0)
Loading from cache
- Removing zendframework/zend-eventmanager (3.0.1)
- Installing zendframework/zend-eventmanager (3.1.0)
Downloading: 100%
- Removing zendframework/zend-view (2.8.0)
- Installing zendframework/zend-view (2.8.1)
Loading from cache
- Removing zendframework/zend-servicemanager (3.1.0)
- Installing zendframework/zend-servicemanager (3.2.0)
Downloading: 100%
- Removing zendframework/zend-escaper (2.5.1)
- Installing zendframework/zend-escaper (2.5.2)
Loading from cache
- Removing zendframework/zend-http (2.5.4)
- Installing zendframework/zend-http (2.5.5)
Loading from cache
- Removing zendframework/zend-mvc (3.0.1)
- Installing zendframework/zend-mvc (3.0.4)
Downloading: 100%
- Removing phpunit/phpunit (5.7.4)
- Installing phpunit/phpunit (5.7.5)
Downloading: 100%
Writing lock file
Generating autoload files
3 단계 : Employee 모듈 용 module.config.php
myapp / module / Employee / config 아래에 다음 코드를 사용하여 모듈 구성 파일“module.config.php”를 생성합니다.
<?php
namespace Employee;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\EmployeeController::class => InvokableFactory::class,
],
],
'view_manager' => [
'template_path_stack' => ['employee' => __DIR__ . '/../view',],
],
];
이제 애플리케이션 수준 구성 파일 (myapp / config / modules.config.php)에서 Employee 모듈을 구성합니다.
return ['Zend\Router', 'Zend\Validator', 'Application', 'Tutorial', 'Employee'];
4 단계 : EmployeeController
AbstractActionController를 확장하여 새 PHP 클래스 인 EmployeeController를 만들고 myapp / module / Employee / src / Controller 디렉토리에 배치합니다.
전체 코드 목록은 다음과 같습니다.
<?php
namespace Employee\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class EmployeeController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
5 단계 : 라우터 구성
Employee 모듈에 세그먼트 경로를 추가하겠습니다. myapp / module / Employee / config에있는 직원 모듈 구성 파일 module.config.php를 업데이트합니다.
<?php
namespace Employee;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\EmployeeController::class => InvokableFactory::class,
],
],
'router' => [
'routes' => [
'employee' => [
'type' => Segment::class,
'options' => [
'route' => '/employee[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\EmployeeController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => [
'employee' => __DIR__ . '/../view',
],
],
];
Employee 모듈에 대한 라우팅을 성공적으로 추가했습니다. 다음 단계는 Employee 애플리케이션에 대한보기 스크립트를 만드는 것입니다.
6 단계 : ViewModel 생성
myapp / module / Employee / view / employee / employee 디렉터리 아래에 "index.phtml"이라는 파일을 만듭니다.
파일에 다음 변경 사항을 추가하십시오-
<div class = "row content">
<h3>This is my first Zend application</h3>
</div>
Move to “EmployeeController.php” file and edit the following changes,
<?php
namespace Employee\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class EmployeeController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
마지막으로 Employee 모듈을 성공적으로 완료했습니다. 다음 URL을 사용하여 액세스 할 수 있습니다.http://localhost:8080/employee.
결과
다음 단계에서는 add, edit 과 delete직원 애플리케이션의 데이터 작업. 이러한 작업을 수행하려면 먼저 데이터베이스 모델을 만들어야합니다. 다음 단계에서 설명합니다.
7 단계 : 모델 생성
모듈에서 Employee라는 모델을 만들어 보겠습니다. src directory. 일반적으로 모델은 Model 폴더 (myapp / module / Employee / src / Model / Employee.php) 아래에 그룹화됩니다.
<?php
namespace Employee\Model;
class Employee {
public $id; public $emp_name;
public $emp_job;
}
8 단계 : MySQL 테이블
다음과 같은 데이터베이스 만들기 tutorials 다음 명령을 사용하여 로컬 MYSQL 서버에서-
create database tutorials;
다음과 같은 이름의 테이블을 생성하겠습니다. employee 다음 SQL 명령을 사용하여 데이터베이스에서-
use tutorials;
CREATE TABLE employee (
id int(11) NOT NULL auto_increment,
emp_name varchar(100) NOT NULL,
emp_job varchar(100) NOT NULL,
PRIMARY KEY (id)
);
데이터를 employee 다음 쿼리를 사용하는 테이블-
INSERT INTO employee (emp_name, emp_job) VALUES ('Adam', 'Tutor');
INSERT INTO employee (emp_name, emp_job) VALUES ('Bruce', 'Programmer');
INSERT INTO employee (emp_name, emp_job) VALUES ('David', 'Designer');
9 단계 : 데이터베이스 구성 업데이트
글로벌 구성 파일 myapp / config / autoload / global.php를 필요한 데이터베이스 드라이브 정보로 업데이트하십시오.
return [
'db' => [
'driver' => 'Pdo',
'dsn' => 'mysql:dbname = tutorials;host=localhost',
'driver_options' => [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''],
],
];
이제 로컬 구성 파일 (myapp / config / autoload / local.php)에서 데이터베이스 자격 증명을 업데이트합니다. 이러한 방식으로 로컬 및 라이브 데이터베이스 연결 자격 증명을 분리 할 수 있습니다.
<?php
return array(
'db' => array('username' => '<user_name>', 'password' => '<password>',),
);
10 단계 : exchangeArray 구현
Employee 모델에서 exchangeArray 함수를 구현합니다.
<?php
namespace Employee\Model;
class Employee {
public $id;
public $emp_name; public $emp_job;
public function exchangeArray($data) { $this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->emp_name = (!empty($data['emp_name'])) ? $data['emp_name'] : null; $this->emp_job = (!empty($data['emp_job'])) ? $data['emp_job'] : null;
}
}
11 단계 : TableGateway를 사용하여 직원 데이터 가져 오기
Model 폴더 자체에 EmployeeTable 클래스를 만듭니다. 다음 코드 블록에 정의되어 있습니다.
<?php
namespace Employee\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class EmployeeTable {
protected $tableGateway; public function __construct(TableGatewayInterface $tableGateway) {
$this->tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet;
}
}
12 단계 : EmployeeTable 클래스 구성
getServiceConfig () 메서드를 사용하여 Module.php 에서 직원 서비스 업데이트
<?php
namespace Employee;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
public function getServiceConfig() {
return [
'factories' => [
Model\EmployeeTable::class => function ( $container) {
$tableGateway = $container>get( Model\EmployeeTableGateway::class);
$table = new Model\EmployeeTable($tableGateway);
return $table; }, Model\EmployeeTableGateway::class => function ($container) {
$dbAdapter = $container->get(AdapterInterface::class);
$resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Model\Employee());
return new TableGateway('employee', $dbAdapter, null, $resultSetPrototype);
},
],
];
}
}
13 단계 : 컨트롤러에 직원 서비스 추가
아래와 같이 myapp / module / config / module.config.php에서 Employee 모듈 구성의 컨트롤러 섹션을 업데이트하십시오.
'controllers' => [
'factories' => [
Controller\EmployeeController::class => function($container) { return new Controller\EmployeeController( $container->get(Model\EmployeeTable::class)
);
},
],
]
14 단계 : EmployeeController의 생성자 추가
생성자 추가 EmployeeTable 인수로 다음 변경 사항을 편집하십시오.
<?php
namespace Employee\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Employee\Model\Employee;
use Employee\Model\EmployeeTable;
class EmployeeController extends AbstractActionController {
private $table; public function __construct(EmployeeTable $table) {
$this->table = $table;
}
public function indexAction() {
$view = new ViewModel([ 'data' => $this->table->fetchAll(),
]);
return $view;
}
}
15 단계 :보기 스크립트 "index.phtml"에 직원 정보 표시
파일로 이동- index.phtml 다음과 같이 변경하십시오.
<?php
$title = 'Employee application';
$this->headTitle($title);
?>
<table class="table">
<tr>
<th>Employee Name</th>
<th>Employee Job</th>
<th>Edit/Delete operations</th>
</tr>
<?php foreach ($data as $empdata) : ?>
<tr>
<td><?php echo $this->escapeHtml($empdata->emp_name);?></td>
<td><?php echo $this->escapeHtml($empdata->emp_job);?></td>
<td>
<a href="<?php echo $this->url('employee', array('action'=>'edit', 'id' =>$empdata->id));?>">Edit</a>
<a href="<?php echo $this->url('employee', array('action'=>'delete', 'id' => $empdata->id));?>">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</table>
이제 데이터베이스 모델을 성공적으로 생성했으며 애플리케이션 내에서 레코드를 가져올 수 있습니다.
URL을 사용하여 신청 요청- http://localhost:8080/employee.
결과
다음 단계에서는 insert, edit 과 delete 직원 모듈의 데이터 작업.
16 단계 : 직원 양식 만들기
라는 파일을 만듭니다. EmployeeForm.phpmyapp / module / Employee / src / Form 디렉토리에 있습니다. 아래 코드 블록에 설명되어 있습니다.
<?php
namespace Employee\Form;
use Zend\Form\Form;
class EmployeeForm extends Form {
public function __construct($name = null) { / / we want to ignore the name passed parent::__construct('employee'); $this->add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array( 'name' => 'emp_name', 'type' => 'Text', 'options' => array( 'label' => 'Name', ), )); $this->add(array(
'name' => 'emp_job',
'type' => 'Text',
'options' => array(
'label' => 'Job',
),
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'attributes' => array(
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
}
17 단계 : 직원 모델 업데이트
직원 모델을 업데이트하고 InputFilterAwareInterface를 구현하십시오. myapp / module / Employee / src / Employee / Model 디렉터리로 이동하고 다음 변경 사항을Employee.phpfile.
<?php
namespace Employee\Model;
// Add these import statements
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
class Employee implements InputFilterAwareInterface {
public $id;
public $emp_name; public $emp_job;
protected $inputFilter; public function exchangeArray($data) {
$this->id = (isset($data['id'])) ? $data['id'] : null; $this->emp_name = (isset($data['emp_name'])) ? $data['emp_name'] : null;
$this->emp_job = (isset($data['emp_job'])) ? $data['emp_job'] : null; } // Add content to these methods: public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) { $inputFilter = new InputFilter();
$inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array(
'name' => 'emp_name',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array('name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 50,
),
),
),
));
$inputFilter->add(array( 'name' => 'emp_job', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array('name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 50, ), ), ), )); $this->inputFilter = $inputFilter; } return $this->inputFilter;
}
}
18 단계 : 직원 컨트롤러에 addAction 추가
다음 변경 사항을 EmployeeController 수업.
<?php
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Employee\Model\Employee;
use Employee\Model\EmployeeTable;
use Employee\Form\EmployeeForm;
public function addAction() {
$form = new EmployeeForm(); $form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) { $employee = new Employee();
$form->setInputFilter($employee->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) { $employee->exchangeArray($form->getData()); $this->table->saveEmployee($employee); // Redirect to list of employees return $this->redirect()->toRoute('employee');
}
}
return array('form' => $form);
}
19 단계 : EmployeeTable 클래스에 저장 기능 추가
EmployeeTable 클래스에 다음 두 함수를 추가합니다. myapp / module / Employee / src / Model / EmployeeTable.php
public function getEmployee($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) {
throw new \Exception("Could not find row $id"); } return $row;
}
public function saveEmployee(Employee $employee) { $data = array (
'emp_name' => $employee->emp_name, 'emp_job' => $employee->emp_job,
);
$id = (int) $employee->id;
if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getEmployee($id)) { $this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Employee id does not exist');
}
}
}
20 단계 : AddAction 메서드 Add.phtml에 대한 View 스크립트 만들기
myapp / module / view / employee / employee의“Add.phtml”파일에 다음 변경 사항을 추가합니다.
<?php
$title = 'Add new employee'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php $form->setAttribute('action', $this->url('employee', array('action' => 'add'))); $form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('emp_name'))."<br>";
echo $this->formRow($form->get('emp_job'))."<br>";
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
Request the application using the url, http://localhost:8080/employee/add
결과
데이터가 추가되면 홈 페이지로 리디렉션됩니다.
21 단계 : 직원 레코드 편집
Employee 모듈에서 데이터 편집 작업을 수행하겠습니다. 다음 변경 사항을Employeecontroller.php.
public function editAction() {
$id = (int) $this->params()->fromRoute('id', 0); if (!$id) {
return $this->redirect()->toRoute('employee', array( 'action' => 'add' )); } try { $employee = $this->table->getEmployee($id);
} catch (\Exception $ex) { return $this->redirect()->toRoute('employee', array(
'action' => 'index'
));
}
$form = new EmployeeForm(); $form->bind($employee); $form->get('submit')->setAttribute('value', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) { $form->setInputFilter($employee->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) {
$this->table->saveEmployee($employee);
// Redirect to list of employees
return $this->redirect()->toRoute('employee'); } } return array('id' => $id, 'form' => $form,);
}
여기에서 우리는 id, 일치하는 경로에있는 다음 편집 작업에 대한 직원 세부 정보를로드합니다.
22 단계 : Employee.php
이제 myapp / module / Employee / src / Employee / Model / 디렉토리에있는“Employee.php”파일에 다음 변경 사항을 추가하십시오.
public function getArrayCopy() {
return get_object_vars($this);
}
여기서 Zend \ Stdlib \ Hydrator \ ArraySerializable은 모델에서 두 가지 메서드를 찾을 것으로 예상합니다. getArrayCopy() 과 exchangeArray().
여기서 exchangeArray ()는 반복에 사용됩니다. 이 함수는 직원 테이블의 데이터를 바인딩하는 데 사용됩니다.
이제보기 스크립트를 생성해야합니다. editAction().
23 단계 : Edit.phtml 만들기
module / Employee / view / employee / employee / edit.phtml에보기 스크립트 파일을 만듭니다.
<?php
$title = 'Edit employee records'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php $form = $this->form; $form->setAttribute('action', $this->url( 'employee', array('action' => 'edit', 'id' => $this->id,)
));
$form->prepare(); echo $this->form()->openTag($form); echo $this->formHidden($form->get('id')); echo $this->formRow($form->get('emp_name'))."<br>"; echo $this->formRow($form->get('emp_job'))."<br>"; echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag();
직원 세부 정보 편집은 다음 스크린 샷에 표시됩니다.
데이터가 편집되면 홈 페이지로 리디렉션됩니다.
24 단계 : deleteEmployee 메서드 추가
EmployeeTable 클래스 – myapp / module / Employee / src / Model / EmployeeTable.php에 deleteEmployee 메서드를 추가합니다.
public function deleteEmployee($id) { $this->tableGateway->delete(['id' => (int) $id]);
}
25 단계 : 직원 레코드 삭제
이제 Employee 모듈에서 데이터 삭제 작업을 수행하겠습니다. 다음 방법을 추가하십시오.deleteAction EmployeeController 클래스에서.
public function deleteAction() {
$id = (int) $this->params()->fromRoute('id', 0); if (!$id) {
return $this->redirect()->toRoute('employee'); } $request = $this->getRequest(); if ($request->isPost()) {
$del = $request->getPost('del', 'No');
if ($del == 'Yes') { $id = (int) $request->getPost('id'); $this->table->deleteEmployee($id); } return $this->redirect()->toRoute('employee');
}
return array(
'id' => $id, 'employee' => $this->table->getEmployee($id)
);
}
여기서 deleteEmployee () 메서드는 id 직원 목록 페이지 (홈 페이지)로 리디렉션됩니다.
이제 deleteAction () 메서드에 해당하는보기 스크립트를 생성 해 보겠습니다.
26 단계 :보기 스크립트 생성
에 delete.phtml라는 이름의 파일을 생성 - MyApp를 / 모듈 / 직원 /보기 / 직원 / 직원 / delete.phtml을 그 안에 다음 코드를 추가합니다.
<?php
$title = 'Delete an employee record';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
'<?php echo $this->escapeHtml($employee->emp_name); ?>' by
'<?php echo $this->escapeHtml($employee->emp_job); ?&'?
<?php
$url = $this->url('employee', array('action' => 'delete', 'id' => $this->id,)); ?> <form action ="<?php echo $url; ?>" method = "post">
<div>
<input type = "hidden" name = "id" value = "<?php echo (int) $employee->id; ?>" />
<input type = "submit" name = "del" value = "Yes" />
<input type = "submit" name = "del" value = "No" />
</div>
</form>
이제 edit 링크를 클릭하면 결과는 다음 스크린 샷과 같습니다.
결과
필요한 모든 기능을 구현하여 Employee 모듈을 성공적으로 완료했습니다.
결론
현재 경쟁 환경에서 Zend 프레임 워크는 개발자가 최고의 자리에 있습니다. PHP 언어로 된 모든 프로그램 또는 모든 유형의 응용 프로그램에 대한 추상화를 제공합니다. 성숙 된 프레임 워크이며 최신 PHP 언어 기능을 지원합니다. 재미 있고 전문적이며 진화하고 현재 기술에 보조를 맞추고 있습니다.