momente şi schiţe de informatică şi matematică
anti point—and—click

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

Bash | Linux | PHP | symfony
2010 jul

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.

vezi Cărţile mele (de programare)

docerpro | Prev | Next