Jump to content
php.lv forumi

Laravel programmētāji


ViktorsN

Recommended Posts

Ka symfony menedžē environment konfigurāciju? Teiksim, dev`am vajag braintree sandbox key'us.

 

Ar flagiem un konfigurācijas failiem.

 

Realitātē, izskatās apmēram tā:

> config.yml
>> config_dev.yml
>> config_test.yml
>> config_prod.yml
> parameters.yml
>> parameters_dev.yml
>> parameters_test.yml
>> parameters_prod.yml

Būtībā, visi {config|parameters}_{dev|test|prod} faili "extends" no {config|parameters}.yml. Var definēt kādas un cik vien vēlies vides. Reizēm piemēram _test extends no _dev, kas extends no _prod utt utjp. Konfigurācijām no environment variabļiem ir iespēja injicēt konteinerī parametrus ar prefiksiem.

 

Tavi keji vispirms tiktu definēti parameters_prod.yml (produkcijai), pēc tam _prod tiktu iekļauts _dev un tur vari definēt dev keys. 

Link to comment
Share on other sites

  • Replies 300
  • Created
  • Last Reply

Top Posters In This Topic

Tie config faili atrodas versiju kontrolē?

 

Normālā gadījumā visi faili no konfiga ir versiju kontrolē kaut kādā formā, dev un test parasti satur "sensible defaults" ko minēja daGrevis, lai arī tā pat faili atrodas VC, jo freima izpratnē konkrētajā env citi config izņemot tos, kas paredzēti dotajai env un tie, kurus dotās env konfigs ielādē, neeksistē. Var jau arī būt _dev.yml kas vienkārši ielādē _prod.yml. Prodā tomēr ir nedaudz savādāk, visbiežāk viens no šiem 3 variantiem:

 

1. parameters_prod.yml.dist ar "sensible defaults" un bez, piemēram, DB konekciju info atrodas VC un parameters.yml ir gitignorē. Produkcijā parameters.yml atrodas kaut kur failu sistēmā, pie deployment simlinko uz /app/config. Devā ielinko un aizpilda manuāli, vai ielinko ar composer tasku/git hūku, vai arī izmanto https://github.com/Incenteev/ParameterHandler. Šādā veidā tev ir gan atskaites punkts VC un nedaudz privātuma. Mīnuss šeit ir turēt gan .dist gan produkciju "on the same page", lai gan tam lieliski der konfiga menedžeri utml tūļi.

 

2. parameters.yml ir VC vienmēr. Parametru vērtības tiek saņemtas no ENV. ENV menedžē ar tūli (puppet, cap, ansible, whatever). Mans personiskais favorite.

 

3. parameters.yml ir VC ar visām parolēm. Dens Kaminskis berzē rokas.

Un vēl viena nianse. config.yml ir paredzēts konfigurācijai kā servisi un servisu linkošana, kā arī konfigurē kādi parametri kur kādam servisam padodami. parameters.yml pamatā satur 1 līdz N dimensionālu masīvu ar skalārām vērtībām, kas ir konfigurācijas mainīgie - DB hosti, paroles, keyi, utt utjp. Labā prakse ir nebāzt abus kopā.

Edited by F3llony
Link to comment
Share on other sites

Jūs te sarakstījuši esat tā, ka aizraujas elpa lasot. Diezgan interesanti, bet... Manuprāt, tas viss ir diezgan specifiskas detaļas, kuras ir jāanalizē jau ir PĒC tam, kad FW ir izvēlēts. Visu to pašu varēja arī ZF 1. versijā izdarīt, ne 1:1, kā te aprakstīts, bet ļoti līdzīgi. Un citur, kur, kur ir pārdomāta konfigurācijas organizēšana. T.i., pēdējo lapu diskusija ir nevis par to, kāpēc būtu jāizvēlas konkrētais FW, bet dažādas tehnikas, ko katrs pēc vajadzības piekopj. Protams, katrs, kurš seko līdzi, paņem kaut ko sev, bet es nedomāju, ka citiem FW ir būtiski ierobežota šī iespēja konfigurācijām. Pašsaprotami, piemēram, ka viss, kas nav PHP, tiek ģenerēts un kešots, gan templeiti, gan konfigi ne-PHP sintaksēs. Utml.

Link to comment
Share on other sites

@F3llony - symfony 3 defaultā parameters.yml ietilpst .gitignore sarakstā: https://github.com/symfony/symfony-standard/blob/master/.gitignore#L1

Un vēl:

app:
    resource: "@AppBundle/Controller/"
    type:     annotation

class DefaultController extends Controller
{
    /**
     * @Route("/{_locale}/", name="home", defaults={"_locale"="en"}, requirements={"_locale"="en|ru|lv"})
     */
    public function indexAction()
    {
        return $this->render('default/index.html.twig');
    }
}


php bin/console debug:router
-------------------------- -------- -------- ------ -----------------------------------
  Name                       Method   Scheme   Host   Path
 -------------------------- -------- -------- ------ -----------------------------------
  _wdt                       ANY      ANY      ANY    /_wdt/{token}
  _profiler_home             ANY      ANY      ANY    /_profiler/
  _profiler_search           ANY      ANY      ANY    /_profiler/search
  _profiler_search_bar       ANY      ANY      ANY    /_profiler/search_bar
  _profiler_info             ANY      ANY      ANY    /_profiler/info/{about}
  _profiler_phpinfo          ANY      ANY      ANY    /_profiler/phpinfo
  _profiler_search_results   ANY      ANY      ANY    /_profiler/{token}/search/results
  _profiler                  ANY      ANY      ANY    /_profiler/{token}
  _profiler_router           ANY      ANY      ANY    /_profiler/{token}/router
  _profiler_exception        ANY      ANY      ANY    /_profiler/{token}/exception
  _profiler_exception_css    ANY      ANY      ANY    /_profiler/{token}/exception.css
  _twig_error_test           ANY      ANY      ANY    /_error/{code}.{_format}
  home                       ANY      ANY      ANY    /{_locale}/
 -------------------------- -------- -------- ------ -----------------------------------

php bin/console server:run

http://127.0.0.1:8000/ -> No route found for "GET /"
404 Not Found - NotFoundHttpException
Nav man līkas rokas.

Un ignorē uz doto brīdi anotācijas, tas nav svarīgi, svarīgi ir pats fakts, ka norādot default _locale, tas vienalga ir obligāts.

 

Es pieļauju, ka Symfony developeri kaut ko ir sačakarējuši, gadās.

Edited by jurchiks
Link to comment
Share on other sites

Es zinu, ka .gitignore jo tas ir defaultais mehanisms. So?

 

Par to otro daļu, piedod bet...

> cat app/config/routing.yml 
app:
    resource: "@AppBundle/Controller/"
    type:     annotation

>cat src/AppBundle/Controller/DefaultController.php 
<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller
{
    /**
     * @Route("/{_locale}", name="homepage", defaults={"_locale"="lv"}, requirements={"_locale"="en|ru|lv"})
     */
    public function indexAction(Request $request)
    {
        return new Response($request->getLocale());
    }
}

> bin/console server:start                      
 [OK] Web server listening on http://127.0.0.1:8000
                                         
>curl http://localhost:8000
lv

>curl http://localhost:8000/en
en
Ja nu tev tik ļoti kāro to trailing slashu arī (nez kādu iemeslu dēļ):

@Route("/{_locale}{slash}", name="homepage", defaults={"_locale"="lv", "slash"="/"}, requirements={"_locale"="en|ru|lv", "slash"="[/]{0,1}"})
Link to comment
Share on other sites

Un tad vēl ir tādi brīnumi kā šis epic. Because fuck you and fuck your API stability. :D Un tādu ir vēl - tur visādi dīvaini versiju bumpi, pēkšņi kaut kur pazūd vai mainās publiskas API daļas, kaut kādas klases pēkšņi pārvācas velns zina kur etc.

 

Doctrine piemēram tieši pieder pie tām lietām, kas ir obviously laba un pie kuras jāpierod. Savukārt Eloquenta Modelī ar 3000+ sloc es gan neko labu īsti nesaskatu. Par to, ka value object entitijas vietā katra entitija ir full blown query buildereris es nekomentēšu... 

 

Par apakšistēmām - kam tev dependency menedžeris? Standard issue freimworkam ir jābūt vaniļai, nav jāsatur visa iespējamā tufta ko nu kāds kaut kur varētu izmantot - tā vietā ir jānodrošina iespēja to pielikt klāt pie nepiciešamības, bez sviedriem un asarām.

No kā tad, tavuprāt, FW ir jāsastāv? Vaniļa ir pliks PHP, manuprāt, bet no FW es tieši sagaidu, ka tur pilnīgi visas common/basic darbības, ko man varētu ienākt prātā veikt, jau ir atrisinātas.

 

Kamēr viss strādā, kā man vajag, un nav jālien iekšā, man pa lielam ir pie kājas, cik tur rindiņas vai cik smuks kods.

 

Principā vienīgo argumentu pret Laravel es te atzīstu čaļa sievišķīgo garastāvokli un ar to saistītās, bezjēdzīgās izmaiņas. Major versijas, tas būtu skaidrs, bet kāda hrena pēc pat minor ir tādas, ka atšķiras praktiski viss, izņemot nosaukumu - tas gan nav un nevar būt skaidrs.

 

Pirmo reizi Laravel es iemēģināju 5.0, jo mērķa hostinga īpatnības, ok, pabeidzu un pēc pāris dienām sāku citu projektu uz 5.1. Un WTF, praktiski viss ir jādara citādi. Kā var izturēt, ja tev ir projekts, kas n reizes gadā jāpārtaisa, es nezinu. Man zajebal vēlreiz taisīt to, kas jau ir lieliski darba kārtībā, pat, ja par to maksā. Es vienkārši atstātu to versiju, uz kuras sākts, pārējais pohuj. :D Ja tas ir kaut kāds brokastu recepšu blogs, tad vēl tā, bet, ja tev ir normāla apjoma projekts...

Link to comment
Share on other sites

Man domāt FW vajag konteineri or kko tamlīdzīgu, konfigurācijas menedžmentu, common cache, veidu kā organizēt requests/responses un veidu kā 1-3 sekundēs piekabināt projektam vajadzīgos moduļus. Viss. Un tad tu vari izvēlēties, šito queue, to ORM, šito IMAP klientu, to adapteri, šito librariju.

 

Savādāk sanāk milzīgs blobs ar visu iespējamo figņu ko kādam jebkad varētu vajadzēt. Un kā tu izvēlies ko tur īsti iekļaut tad? Kādam RabitMQ, kādam ASQS, kādam iron.io, vēl kādam phive-queue. Now which one? Man tīk Doktrīne, kādam tīk Propels, vēl kādam tīk idiorms/paris. Tad vēl atnāk kāds un pasaka, man lūdzu Handlebars.

 

Tiesa, ir lietas kas arī symfony ir standarta distribucijā, bet, jamas var nokabināt viena faila ietvaros. Tiem fw kam ir dziļas integrācijas ar kaut kādiem noteiktiem instrumentiem, oioi.

Link to comment
Share on other sites

Ja kaut kas ir sarežģīti uztaisīts, tad tas nav pareizi uztaisīts. Es par tiem symfony yml configiem. Pats esmu pietiekami čakarējies ar tiem jau kopš 2008. gada, lai saprastu, ka tas ir "overenginering"

 

Tās API braking changes par ko sašūt F3llony. Jūs apskatījāties kādas ir tās izmaiņas?

Šī te metode ir izmesta ārā

public function getRemote($path)
{
    return file_get_contents($path);
}
 
Te drīzāk ir jautājums pašiem programmētājiem. Kāpēc izmantot getRemote nevis file_get_contents? Tāpēc, ka pa tiešo izsaukt php funkciju nav stilīgi?
 
 
 
Laravel Cashier Phantom - phantom vajadzīgs, lai uzģenerētu pdf no html, tāpēc tas velkas līdzi. Nepatīk Cashier, raksti savu, kur problēma?

 

 

 

"continuous integration" un "rolling release"  - Tavi 100 developeri vendorus nekad neapdeito? Un par jaunākajām vendoru versijām uzzini tikai, kad produkcijas serveri tiek noapdeitoti? Ko tu darītu ja Laravel 5.2 būt pēdējā versija? Projekts apstātos vai rakstītu Otwelam, lai turpina izstrādi?

Link to comment
Share on other sites

Nu tas, ka tu 8 gadu laikā neesi spējis iebraukt kā darbojas viena freimworka konfigurācija nenorāda uz overengineering, tas norāda, ka tev nav lemts. Vispār. Neko. Nekad.

 

Symfony YML configi sastāv no 3 "konceptiem": parametri, servisi, routes. Visbiežāk lietotās lietas ir tik nenormāli tupi elementāras, ka šekspīru rakstošie mērkaķi validus servisu konteinerus gan jau ir kādas reizes 5 sarakstījuši. 

 

Tas, ka es ielinkoju vienu konkrētu piemēru, ko ātrumā varēju atrast? Te ir jautājums nevis pašiem programmētājiem, bet tizlenim kas iekļāva šo funkciju publiskā API, jo kurš ir tizlāks - core devs exposēt bezjēdzīgu publisku API vai users, kas jamo lieto īpaši neiedziļinoties iekšās? Izčeko VCS, palasi changelogs (kur tādi vispār ir), palasi komit logus. Vai man tev atreferēt visu to figņu tagad?

 

Cašiera fantoms - es zinu kam fantoms vajadzīgs, tvaju *****. Tikai nesaprotu, kāda velna pēc uz Unix boksiem, piemēram, velkas windows fantoma binaries...? Un tā pat izvāca ārā ar nu kuru te versiju, neatceros vairs. To, ka man personīgi nācās vēl uzbrēkt Otvelam par to, ka Fantoma licensi vajadzētu ievērot es nemaz nekomentēšu...

 

Pēdējais paragrāfs - es nesaprotu ko tu tur runā. Lasu, kaut kādi vārdi, bet loģikas nekādas. Moš izlasi vēlreiz ko es iepriekš uzrakstīju un šoreiz iedziļinies, a?

Link to comment
Share on other sites

Tiešām phantoms no cashier ir izvākts :) Phantom nemaz tik labi html -> pdf neģenerēja. Tabulas īpaši nesmuki zīmē.

 

Par pēdējo paragrāfu - ja nesaprati, tad pats izlasi vēlreiz. Ja tā pat nesaprati, tad atstāj kā ir.

 

 

Vispār jūtu, ka ar programmēšanu nenodarbojies. Esi pie devops darbiem pielikts?

Link to comment
Share on other sites

@F3llony - interesanti. Jo, piemēram, @Route('/foo/') pieņem gan /foo, gan /foo/. Tad kāpēc, ja ir parametrs, nav tāpat?

Nē, nepieņem. 

> @Route("/test/", name="homepage")
> curl -I localhost:8000/test/
HTTP/1.1 200 OK
> curl -I localhost:8000/test 
HTTP/1.1 301 Moved Permanently
Location: http://localhost:8000/test/

Vienkārši bez parametra rūteris var uzminēt, ka tev tur ir slash, bet ja tur ir parametrs, rūteris īsti nesaprot ko ar to darīt. Šis edge keiss ir zināms, bet jams ir tik "edge", ka neko viņa sakarā neviens negrib darīt jo risinājums būtu bloated routing tables vai fastroute pa virsu vēl 10 regeksi. 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...