Script Bash pentru generarea modulelor într-o aplicaţie symfony

PHP | symfony | Bash | Linux

symfony oferă un script PHP prin care se poate genera automat scheletul de bază pentru proiect, aplicaţie a proiectului, modul al aplicaţiei; de obicei, proiectul angajează o bază de date, iar scriptul respectiv poate genera modulele (desigur, câte unul) în concordanţă cu schema acesteia.

A vedea eventual, Introducere elementară în framework-ul PHP symfony.

Să presupunem însă un caz "extrem": baza de date conţine câteva zeci de tabele şi relaţii şi vrem să generăm toate modulele de administrare aferente acestora. Atunci, în loc să invocăm direct scriptul menţionat - pentru fiecare tabel, de atâtea ori - va fi preferabil să concepem un script Bash care să ambaleze invocarea php symfony într-un "for lista modulelor de creat":

#!/bin/bash

for file_php in `ls lib/model/doctrine/base`     # BaseModel.class.php
do
    base_model=${file_php/%.class.php/}          # BaseModel 
    modul=${base_model/#Base/}                   # Model
    php symfony doctrine:generate-admin --env="prod" frontend $modul
done

ls generează lista fişierelor din subdirectorul indicat, lib/model/doctrine/base. Numele fiecăruia dintre aceste fişiere este constituit concatenând "Base" cu Nume-tabel şi ".class.php" ("BaseModel.class.php"). Apoi, variabila file_php va prelua pe rând fiecare dintre aceste nume.

Fişierele lib/model/doctrine/base/Base*.class.php sunt create prin invocarea php symfony doctrine:build --all; fiecare dintre aceste fişiere corespunde câte unuia dintre tabelele definite în baza de date, reprezentându-l (împreună cu relaţiile aferente) ca obiect PHP.

${file_php/%.class.php/} elimină sufixul ".class.php" din conţinutul curent al file_php, iar apoi, ${base_model/#Base/} elimină şi prefixul "Base" - rezultând în final denumirea de modul necesară.

Spre deosebire de uzanţele obişnuite, ar fi greşită o scriere ca modul = ${base_model/#Base/}; în Bash nu trebuie lăsat spaţiu în jurul semnului "=" (altfel, se produce un mesaj de eroare).

Apoi, pentru denumirea curentă obţinută în variabila modul - este invocat scriptul PHP symfony pentru "task"-ul doctrine:generate-admin, obţinând modulul corespunzător: un subdirector apps/frontend/modules/modul/ (unde "modul" este conţinutul variabilei modul), care la rândul său conţine şi subdirectoarele actions/ ("acţiunile" posibil de lansat prin accesarea modulului respectiv) şi templates/ (pentru "şabloanele de pagină" aferente acţiunilor preconizate).

Interesul pentru generarea automată a acestor module stă în faptul că doctrine:generate-admin produce automat fişierele PHP pentru "acţiuni" şi pentru "şabloane de pagină" (vizând desigur, operaţiile CRUD - de bază pentru oricare tabel al bazei de date); ulterior, n-avem decât să adaptăm aceste fişiere, corespunzător necesităţilor proprii.

Scriptul de mai sus vizează toate tabelele; dar într-o aplicaţie reală, pentru unele tabele nu avem nevoie de module corespunzătoare (de exemplu, pentru că ele servesc pentru relaţionarea altor tabele). Atunci putem proceda astfel: întâi constituim un fişier "all_models.txt", conţinând toate numele de fişier din /model/doctrine/base (folosind operatorul de "redirecţionare a ieşirii" >)

     ls lib/model/doctrine/base > all_models.txt

Edităm apoi acest fişier, ştergând numele corespunzătoare tabelelor cărora nu vrem să le asociem module. Apoi, înlocuim prima linie (şi-atât) din scriptul de mai sus cu:

    for file_php in `cat all_models.txt`

cat produce (într-un subshell, datorită invocării sub operatorul "backquotes" `...`) conţinutul fişierului indicat, astfel că acum variabila file_php va parcurge numai numele care au rămas neşterse în lista iniţială a tuturor fişierelor noastre.

Obs. O alternativă "nativă" (faţă de scriptul Bash de mai sus) constă în extinderea clasei PHP sfDoctrineGenerateModuleTask (din symfony/lib/plugins/sfDoctrinePlugin/lib/task) - vezi Generate modules from all available doctrine models (ianuarie 2011). Dar lucrând sub Linux, n-ai decât de câştigat folosind direct (şi învăţând să foloseşti, în diverse împrejurări) "instrumentele" puternice puse la dispoziţie, iar unul dintre acestea este Bash.

Comentarii

adaugă Comentariu

Media dinamică

Linux şi aplicaţii Web
în 24 de ore

Orar şcolar
documentaţie Sphinx

ŞahStartTemp

25
32
17
4
19
34
14
3
26
33
16
5
31
24
15
18
35
20
2
13
27
6
9
23
30
11
8
21
28
12
22
29
10
7