Bagaimana cara menggunakan kembali kode dengan bundel symfony 5? Bagian 2. Kami mengeluarkan kode dalam bundel

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. ,


All Articles