рдкреЛрд╕реНрдЯ
рдЗрд╕ рдкреНрд░рд╢реНрди рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕рд┐рдореНрдлрдиреА рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рддреЛ рдХреИрд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░реЗрдЧрд╛:
- рдирд┐рдпрдВрддреНрд░рдХ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЬрд╛рдХреНрд╕ рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдПрдВ
- рд╣рдо рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред
- рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рдЪрдпрдирд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ
рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ, рдХреЛрдб рд╕рд╣реА рд╣реЛрдиреЗ рдХрд╛ рдирд╛рдЯрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╣реВрдВрдЧрд╛), рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╕рдордЭ рдореЗрдВ рдЖ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ Symfony2 рдЗрдВрдЯрд░рдиреЗрд╢рдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ, рдЪрд▓реЛред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдиреЛрдЯреЗрд╢рди рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
namespace SomeNamespace\SomeBundle\Annotations; class Ajax { public $contentType; public $parameters; public function __construct($data) { if (isset($data['value'])) { $this->contentType = $data['value']; } if (isset($data['parameters'])) { $this->parameters = $data['parameters']; } } public function setContentType($contentType) { $this->contentType = $contentType; } public function getContentType() { return $this->contentType; } }
рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдирд┐рдпрдВрддреНрд░рдХ рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рдПрдХ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдмрдирд╛рдПрдВ:
namespace SomeNamespace\SomeBundle\Event; use Symfony\Component\HttpKernel\Event\KernelEvent; use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; use Doctrine\Common\Annotations\Reader; use Symfony\Component\HttpFoundation\Response; class ControllerListener { private $container; private $parameters; private $annotationReader;
рдФрд░ рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:
#SomeBundle\Resources\config\services.yml services: my.ajax.listener: class: "SomeNamespace\SomeBundle\Event\ControllerListener" tags: [{name: kernel.event_listener, event: kernel.response, method: onKernelResponse, priority: -128}, {name: kernel.event_listener, event: kernel.request, method: onKernelRequest}, {name: kernel.event_listener, event: kernel.view, method: onKernelView, priority: -128}, {name: kernel.event_listener, event: kernel.controller, method: onKernelController}] arguments: [@service_container, @annotation_reader]
рдПрдХ рдФрд░ рддрд░реНрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдкреНрд░рд╛рдердорд┐рдХрддрд╛ред рдпрд╣ рдШрдЯрдирд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рддрдп рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рджреНрд░реБрдкрд╛рд▓ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╡рдЬрди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдмрд╕ рд╡рд┐рдкрд░реАрддред рджреНрд░реБрдкрд╛рд▓ рдореЗрдВ, рдЕрдзрд┐рдХ рд╡рдЬрди, рдмрд╛рдж рдореЗрдВ рд╣реБрдХ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╕рд┐рдореНрдлрдиреА рдореЗрдВ, рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╣реЛрдЧреА, рдкрд╣рд▓реЗ рдХреА рдШрдЯрдирд╛ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреНрдпрд╛ рджрд┐рдЦрддреА рд╣реИ:
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ:
namespace SomeNamespace\SomeBundle\Core; interface ContentTypeInterface { public static function getName(); public function encodeParameters($data); public function decodeParameters($data); public function hookPre($request); public function hookPost($response); }
рдФрд░ рдЕрдм рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛:
- encodeParameters - рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдХрдВрдЯреЗрдВрдЯ-рдЯрд╛рдЗрдк (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдХреЗ рд▓рд┐рдП рдпрд╣ jsonnencode рд╣реЛрдЧрд╛) рдореЗрдВ рдПрдирдХреЛрдб рдХрд░рддрд╛ рд╣реИред
- decodeParameters - рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдХреЗ рд▓рд┐рдП рдпрд╣ json_decode рд╣реЛрдЧрд╛) рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрдм рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдбреЗрдЯрд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА POST рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ рд╣реА рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
- рд╣реБрдХрдкреНрд░реЗ - рдЬрдм рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдЕрдиреБрд░реЛрдз рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ
- рд╣реБрдХрдкреЛрд╕реНрдЯ - рдЬрдм рдирд┐рдпрдВрддреНрд░рдХ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ:
namespace SomeNamespace\SomeBundle\Core; class ContentType implements ContentTypeInterface { protected $container; protected $parameters; public function __construct($container, $params = array()){ $this->container = $container; $this->parameters = $params; } public static function getName() { return 'contentType'; } public function encodeParameters($data) { return $data; } public function decodeParameters($data) { return $data; } public function hookPre($request) { } public function hookPost($response) { return $response; } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ ContentTypeInterface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдВрдЯреЗрдВрдЯ-рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдкрдирд╛ json рдХрдВрдЯреЗрдВрдЯ-рдЯрд╛рдЗрдк рджреВрдВрдЧрд╛:
namespace SomeNamespace\SomeBundle\Core\ContentTypes; use SomeNamespace\SomeBundle\Core\ContentType; class JSONContentType extends ContentType { private $params; public static function getName() { return "json"; } public function hookPost($response) { return $response; } public function encodeParameters($data) { return json_encode($data); } public function decodeParameters($data) { return json_decode($data); } }
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рджреВрдВрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рд░реНрдЧреЛрдВ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдФрд░ рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА:
(function () { SF = function () { }; SF.prototype.fn = SF.prototype; SF = new SF(); SF.fn.Storage = {}; SF.fn.hasValue = function (name) { return this.Storage[name] !== undefined; }; SF.fn.getValue = function (name) { if (this.hasValue(name)) { return this.Storage[name]; } else { return void 0; } }; SF.fn.getAllValues = function () { return this.Storage }; SF.fn.loggingEnabled = function () { return this.parameters.debug; }; SF.fn.messagingEnabled = function () { return this.parameters.messaging !== undefined && this.parameters.messaging; }; SF.fn.getMessages = function () { return !this.framework || this.framework.messaging === undefined ? { } : this.framework.messaging; };
рдЦреИрд░, рдЕрдм, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдПрдБ:
рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧреА:
{ a: "b", d: "c" }
рднреА, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг:
SF.l(SF.path('JSBundle_ajax', {'key': 'asd'}));
рдпрджрд┐ Symfony рдореЗрдВ рдбрд┐рдмрдЧ рдЕрдХреНрд╖рдо рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдкреНрд░рд┐рдВрдЯ рд╣реЛрдЧрд╛:
/ рдЕрдЬрд╛рдХреНрд╕ / рдЕрд╕рдж
PS рдРрдб-рдСрди рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдореБрдЭреЗ рдЪрддреБрд░ рд╡рд┐рдЪрд╛рд░ рд╕реБрдирдХрд░ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛрдЧреАред