Lassen Sie uns darüber sprechen, wie Sie das Kopieren und Einfügen zwischen Projekten stoppen und den Code in ein wiederverwendbares Symfony 5-Plug-In-Bundle übertragen können. Eine Reihe von Artikeln, die meine Erfahrungen mit Bundles zusammenfassen, führen in der Praxis von der Erstellung eines minimalen Bundles und der Umgestaltung einer Demo-Anwendung zu Tests und dem Bundle-Release-Zyklus.
Im vorherigen Artikel haben wir ein minimales Bündel von zwei Dateien erstellt und in das Projekt aufgenommen.
In diesem Artikel:
- Portierungscode zum Bündeln
- Abhängigkeitsinjektion: Registrieren von Bundle-Diensten in einem DI-Container
- Controller migrieren und Routing einrichten
- Mechanismus zur Bestimmung des Ressourcenpfads
- Vorlagen in Bundles übertragen
Wenn Sie das Lernprogramm nicht nacheinander abschließen, laden Sie die Anwendung aus dem Repository herunter und wechseln Sie zum Zweig 1-Bundle-Mockup .
Anweisungen zum Installieren und Starten des Projekts in einer Datei README.md
.
Die endgültige Version des Codes für diesen Artikel finden Sie im Zweig 2-basic-refactoring .
Fahren wir mit dem Refactoring fort.
Wir verschieben die Hauptdateien
Ein Bundle kann dieselben Elemente wie normale Symfony-Anwendungen enthalten: Entitäten, Controller und Befehle, Vorlagen, Assets, Tests und anderen Code.
, , bundles/CalendarBundle/src
( ):
# Crate dirs
cd bundles/CalendarBundle/src/
mkdir Controller Entity Service
cd ../../../src
# Move files
mv Form Repository ../bundles/CalendarBundle/src/
mv Controller/EditorController.php Controller/EventController.php ../bundles/CalendarBundle/src/Controller
mv Entity/Event.php ../bundles/CalendarBundle/src/Entity
mv Service/EventExporter ../bundles/CalendarBundle/src/Service/EventExporter
mv Twig ../bundles/CalendarBundle/src/Twig

, . namespace
use
App\
bravik\CalendarBundle\
.
App\
: .
IDE .
IDE PhpStorm Ctrl/Cmd + Shift + R
.
use App\Repository\EventRepository
SiteController

.
:

SiteController
: EventRepository
. autowiring Symfony typehints DI-.
src/Services
, .
Dependency Injection
, DI- , .
, .
, Symfony- services.yaml
, DI-.
src
config/services.yaml
:
parameters:
#
services:
#
_defaults:
#
# typehints ( )
# https://symfony.com/doc/current/service_container.html#the-autowire-option
autowire: true
# :
#
# https://symfony.com/doc/current/service_container.html#the-autoconfigure-option
autoconfigure: true
# DI-
bravik\CalendarBundle\Repository\EventRepository: ~
bravik\CalendarBundle\Controller\EventController: ~
bravik\CalendarBundle\Controller\EditorController: ~
3 .
- config/services.yaml
, .
@todo
:
# Twig
bravik\CalendarBundle\Twig\TwigRuDateFilter: ~
# EventExporter DI-
bravik\CalendarBundle\Service\EventExporter\:
resource: '../src/Service/EventExporter/*'
# ExporterProvider DI-
# 2
bravik\CalendarBundle\Service\EventExporter\ExporterManager:
arguments:
$exporters:
- '@bravik\CalendarBundle\Service\EventExporter\Exporters\GoogleCalendarExporter'
- '@bravik\CalendarBundle\Service\EventExporter\Exporters\ICalendarExporter'
, , . , . src
DependencyInjection/CalendarExtension.php
:
<?php
namespace bravik\CalendarBundle\DependencyInjection;
use Exception;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
class CalendarExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
}
}
. <BundleName>Extension
, src/DependencyInjection
Symfony\Component\DependencyInjection\Extension\Extension
.
Symfony DI-, Extension-. , Extension::load()
.
, . , PHP-. .
services.yaml
:
public function load(array $configs, ContainerBuilder $container)
{
$loader = new YamlFileLoader(
$container,
new FileLocator(__DIR__.'/../../config')
);
$loader->load('services.yaml');
}
, :

.
Symfony :
config/routes.yaml #
config/routes/annotations.yaml # ,
#
. annotations.yaml
:
controllers: #
type: annotation #
resource: ../../src/Controller/ # ,
: config/routes.yaml
.
calendar_routes:
type: annotation
resource: '../src/Controller/'
config/routes/annotations.yaml
.
:
calendar_bundle:
resource: '@CalendarBundle/config/routes.yaml'
.
@CalendarBundle
— .
Symfony .
, /admin
- : /admin ?
, :
calendar_bundle:
resource: '@CalendarBundle/config/routes.yaml'
prefix: /admin
name_prefix: cms.
security
. , .
, Symfony vendor_name_
. .
, Twig «» .
:
@<BundleName>Bundle/path/to/config
—@<BundleName>/path/to/template
— .
Symfony « ». . .
./src
. , Symfony 4 src/Resources
. 4 Symfony , — . , .
CalendarBundle
getPath()
:
public function getPath(): string
{
return dirname(__DIR__);
}
@CalendarBundle
.
, !

? .
. , , -.
templates
templates/event
:
mkdir bundles/CalendarBundle/templates
mv templates/event/* bundles/CalendarBundle/templates
— , . .
« » IDE . event/
@Calendar/
.

@Calendar
Twig , namespace Twig. templates
, Symfony namespace, templates
Resources/views
( ).
site/index.html.twig
twig-. :

, — .
: base.html.twig
-:
{% extends 'base.html.twig' %}
.
, , DI-. Example Project 2-basic-refactoring.
- , — namespace .
App
- , — Extension-. DI- . , .
- . . .
- , , .., «» , . .
, JS -.
:
1.
2.
3. : , , JS
4.
5.
6. ,
7. ,