Mari kita bicara tentang cara menghentikan copy-paste antara proyek dan mentransfer kode ke bundel plug-in yang dapat digunakan kembali Symfony 5. Serangkaian artikel yang merangkum pengalaman saya dengan bundel akan dilakukan dalam praktik dari membuat bundel minimal dan refactoring aplikasi demo untuk pengujian dan siklus rilis bundel.
Pada artikel sebelumnya, kami membuat bundel minimal dua file dan memasukkannya ke dalam proyek.
Dalam artikel ini:
- Kode porting ke bundel
- Dependency Injection: mendaftarkan layanan bundel dalam wadah DI
- Memigrasi pengontrol dan menyiapkan perutean
- Mekanisme Penentuan Jalur Sumber Daya
- Mentransfer template ke bundel
Jika Anda tidak menyelesaikan tutorial secara berurutan, maka unduh aplikasi dari repositori dan alihkan ke cabang 1-bundle-mockup .
Petunjuk untuk menginstal dan memulai proyek dalam file README.md
.
Anda akan menemukan versi final kode untuk artikel ini di cabang 2-dasar-refactoring .
Mari kita lanjutkan ke refactoring.
Kami memindahkan file utama
Satu bundel dapat berisi semuanya sama dengan aplikasi Symfony biasa: entitas, pengontrol dan perintah, templat, aset, tes, dan kode lainnya.
, , 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. ,