Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 33

0
votes
answers
7 views
+10

從控制器的Symfony3控制檯運行控制檯命令

0

我想從我的控制器使用過程組件運行控制檯命令,但它不起作用。從控制器的Symfony3控制檯運行控制檯命令

這是我的代碼:

 $process = new Process('php bin/console mycommand:run'); 
    $process->setInput($myArg); 
    $process->start(); 

我也試過:

php bin/console mycommand:run my_argument 

你能告訴我什麼,我做錯了:

$process = new Process('php bin/console mycommand:run ' . $myArg) 
    $process->start(); 

我使用運行我的命令?

+0

「不起作用」是什麼意思?有沒有錯誤信息? –

沙发
0
1

我認爲問題是路徑。無論如何,你應該考慮不使用Process來調用Symfony命令。控制檯組件允許調用命令,例如在控制器中。從文檔

例子:

// src/Controller/SpoolController.php 
namespace AppController; 

use SymfonyBundleFrameworkBundleConsoleApplication; 
use SymfonyBundleFrameworkBundleControllerController; 
use SymfonyComponentConsoleInputArrayInput; 
use SymfonyComponentConsoleOutputBufferedOutput; 
use SymfonyComponentHttpFoundationResponse; 
use SymfonyComponentHttpKernelKernelInterface; 

class SpoolController extends Controller 
{ 
    public function sendSpoolAction($messages = 10, KernelInterface $kernel) 
    { 
     $application = new Application($kernel); 
     $application->setAutoExit(false); 

     $input = new ArrayInput(array(
      'command' => 'swiftmailer:spool:send', 
      // (optional) define the value of command arguments 
      'fooArgument' => 'barValue', 
      // (optional) pass options to the command 
      '--message-limit' => $messages, 
     )); 

     // You can use NullOutput() if you don't need the output 
     $output = new BufferedOutput(); 
     $application->run($input, $output); 

     // return the output, don't use if you used NullOutput() 
     $content = $output->fetch(); 

     // return new Response(""), if you used NullOutput() 
     return new Response($content); 
    } 
} 

使用這種方式你確定代碼將總是工作。當PHP處於安全模式時(exec等被關閉)Process組件是無用的。此外,您不需要關心路徑和其他事情,否則您所稱的「手動」命令就是命令。

你可以閱讀更多關於從控制器here調用命令。

+0

我之前嘗試過這種方法,並且解決了問題,但我也希望能夠在運行後停止該命令。通過Process,我可以在某個地方回收pid,然後殺死該進程。如果我能殺死命令,我可以用pcntl_signals獲得這個解決方案的選擇是什麼,但正如你可以在我之前的線程中看到的 - https://stackoverflow.com/questions/47941237/symfony3-command- pcntl-doesnt-works 它沒有爲我工作。 – SakuragiRokurota

+0

@SakuragiRokurota你最好的選擇是使用消息隊列。這樣你的控制器只向隊列發送消息,命令處理將從HTTP請求中分離出來。 – svgrafov

0
votes
answers
7 views
+10

與symfony的DI容器

0

問題總結與symfony的DI容器

功能測試存根外部服務請求是否有可能注入在我的測試情況下,存根/嘲笑symfony的DI容器來模擬不同的外部API響應?

  • 測試,如果API返回一個錯誤(我想注入一個存根返回一個HTTP 500我的HTTP客戶端類)
  • 測試我的應用程序返回使用2個正確的結果我的應用程序發送電子郵件不同的API作爲源(ⅰ要注入兩個HTTP客戶端作爲存根與特定結果體)

細節

我想要寫的硅石應用功能測試,美是symfony di容器。該應用程序使用多個API作爲後端來滿足客戶端請求。

該代碼注入一個抽象的http客戶端到api客戶端,我可以注入一個http api客戶端存根。

class AwesomeApiClient 
    __construct(MyHttpClient $httpClient); 

class MyApiHttpClient 

這對單元測試非常有用。

現在我想寫功能測試。 我擴展了silex WebTestCase並實現了應用程序初始化。 MyApiHttpClient注入symfony di容器。

現在我想做的事情是這樣的:

# symfony di container does not allow this 
$this->getDiContainer()->set('my_http_client', $myHttpClientStubInstance); 

我想我的配置在每個測試存根,以便我能夠在同一個請求測試不同(例如錯誤,成功)響應。

事情我已經嘗試:

使用setter注入在運行時

$his->getDiContainer()->get('MyApiClient')->setHttpClient($myMock);

的DiContainer返回每次一個新實例我調用get方法。這確實有意義。所以這是行不通的。

重寫HTTP客戶端在DI容器

$this->getDiContainer->set('MyHttpClient', $myHttpClientStub);

不起作用,因爲symfony中不允許在運行時更改的定義。此外,它似乎需要一個定義,而不是一個實例。

PHP-VCR

是否與我的生產代碼的一些變化工作,因爲它在我的捲曲頭回調攪亂HTTP標頭。不適用於其他服務(rabbitmq ...)

沙发
0
1

根據this,應該可以在DI容器中設置模擬。

$client = self::createClient(); 

$serviceA = $this->getMockBuilder('ServiceA') 
    ->disableOriginalConstructor() 
    ->getMock(); 

$client->getContainer()->set('my_bundle.service.a', $serviceA); 
0
votes
answers
6 views
+10

測試與具有動態地產生的場的形式的控制器

1

我有具有動態場的一種形式:測試與具有動態地產生的場的形式的控制器

<?php 

namespace AppBundleForm; 

//uses ... 
class AnnonceType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
     ->add('titre') 
     ->add('description') 
     ->add('groupeCompetence', EntityType::class, [ 
      'class'  => 'AppBundleEntityGroupeCompetences', 
      'choice_label' => 'nom', 
      'placeholder' => 'Sélectionnez votre type de service', 
      ]) 
     ->add('prix') 
     ->add('serviceADistance') 
     ->add('ajouter', SubmitType::class); 


     $formModifier = function (FormInterface $form, GroupeCompetences $groupeCompetences=null){ 
      $competences = null === $groupeCompetences ? array() : $groupeCompetences->getCompetences(); 

      $form->add('competence', EntityType::class, array(
       'class' => 'AppBundleEntityCompetence', 
       'choice_label' => 'nom', 
       'placeholder' => 'Choisir une compétence', 
       'choices' => $competences, 
       )); 
     }; 

     $builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function (FormEvent $event) use ($formModifier) { 

       // this would be your entity, i.e. CompetenceChoisie 
       $data = $event->getData(); 

       //var_dump($data); 
       //die(); 

       $formModifier($event->getForm(), $data->getGroupeCompetence()); 
      } 
      ); 

     $builder->get('groupeCompetence')->addEventListener(
      FormEvents::POST_SUBMIT, 
      function (FormEvent $event) use ($formModifier) { 

       $groupeCompetences = $event->getForm()->getData(); 

       $formModifier($event->getForm()->getParent(), $groupeCompetences); 

      } 
      ); 

    } 
} 

我有這樣的代碼在AJAX:

<script> 
    var $groupeCompetence = $('#requete_prestataire_groupeCompetence'); 
// When sport gets selected ... 
$groupeCompetence.change(function() { 
    // ... retrieve the corresponding form. 
    var $form = $(this).closest('form'); 
    // Simulate form data, but only include the selected sport value. 
    var data = {}; 
    data[$groupeCompetence.attr('name')] = $groupeCompetence.val(); 
    // Submit data via AJAX to the form's action path. 
    $.ajax({ 
    url : $form.attr('action'), 
    type: $form.attr('method'), 
    data : data, 
    success: function(html) { 
     // Replace current position field ... 
     $('#requete_prestataire_competence').replaceWith(
     // ... with the returned one from the AJAX response. 
     $(html).find('#requete_prestataire_competence') 
     ); 
     // Position field now displays the appropriate positions. 
    } 
    }); 
}); 
</script> 

事實上,能力是根據GroupeCompetence動態生成的。

我想在PHPUnit中測試它。

我嘗試這樣做:

public function testIndexRechercheUtilisateurNonConnecte() 
    { 
     $crawler = $this->client->request('GET', '/'); 

     $form = $crawler->selectButton('requete_prestataire_Rechercher')->form(); 
     $form['requete_prestataire[groupeCompetence]'] = 2; 
     $form['requete_prestataire[competence]'] = ""; 

     $crawler = $this->client->submit($form); 
     $this->assertTrue($this->client->getResponse()->isRedirect()); 
     $client->followRedirect(); 

     /*$this->assertEquals(3, $crawler->filter('a [class = "btn-sm btn-primary"]')->count());*/ 


    } 

的問題是:$形式[ 'requete_prestataire [能力]']如我說的是動態地生成的。

我希望能夠在測試中做ajax請求,然後測試輸出。

我該怎麼辦?

在此先感謝

沙发
0
0

我找到了解決辦法:

必須禁用驗證,併發送的形式,因爲它是產生:

$crawler = $this->client->request('GET', '/'); 

     $form = $crawler->selectButton('requete_prestataire_Rechercher')->form(); 
     $form['requete_prestataire[groupeCompetence]'] = 2; 
     $form['requete_prestataire[competence]']->disableValidation()->select(50); 

     $crawler = $this->client->submit($form); 
0
votes
answers
6 views
+10

FOSUserBundle窗體看起來很奇怪

0

我剛剛在我的Symfony項目上配置並準備了FOSUserBundle。但是,當我試圖表明寄存器觀點看起來像這樣:FOSUserBundle窗體看起來很奇怪

enter image description here

登記申請表(默認)應該是這樣的:

Blockquote

所有我配置的是Documentation,我不知道發生了什麼。

這是RegistrationFormType.html.twig從FOSUserBundle:

class RegistrationFormType extends AbstractType 
    { 
     ... 

     /** 
     * {@inheritdoc} 
     */ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->add('email', LegacyFormHelper::getType('SymfonyComponentFormExtensionCoreTypeEmailType'), array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle')) 
       ->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle')) 
       ->add('plainPassword', LegacyFormHelper::getType('SymfonyComponentFormExtensionCoreTypeRepeatedType'), array(
        'type' => LegacyFormHelper::getType('SymfonyComponentFormExtensionCoreTypePasswordType'), 
        'options' => array('translation_domain' => 'FOSUserBundle'), 
        'first_options' => array('label' => 'form.password'), 
        'second_options' => array('label' => 'form.password_confirmation'), 
        'invalid_message' => 'fos_user.password.mismatch', 
       )) 
      ; 
     } 
     ... 
    } 
+0

你需要看看https://symfony.com/doc/current/templating/overriding.html – zizoujab

+0

感謝您的回答,正如@ michal-g所說,我必須取消註釋該行。我之前做了壓倒一切的部分來找到這個問題。 – Mich

沙发
0
0

首先,你應該在config.yml 取消註釋行運行轉換組件


translator: { fallbacks: ["en"] }

和(就像在評論中說的)讀了關於壓倒性的意見

+0

就是這樣!它解決了我的問題。我沒有注意到該行,它的工作。謝謝Michal。 – Mich

+0

否 - 問題,但請 - 如果這anwser幫助你,標記anwser爲接受:) –

+0

當然,我剛剛接受它作爲解決方案,檢查它! ;-) – Mich

0
votes
answers
6 views
+10

自參照孩子不附

0

我有一個家譜這樣的:自參照孩子不附

class Family 
{ 
    /** 
    * @var integer 
    * 
    * @ORMColumn(type="integer", nullable=false) 
    * @ORMId 
    * @ORMGeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var Family 
    * 
    * @ORMManyToOne(targetEntity="Family", inversedBy="children") 
    */ 
    private $parent; 

    /** 
    * @var string 
    * 
    * @ORMColumn(name="name", type="string") 
    */ 
    private $name; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORMOneToMany(targetEntity="Family", mappedBy="parent") 
    */ 
    private $children; 

    // [...] 
} 

我試圖findAll(),並得到家長和孩子連接

$familyRepo = $this->em->getRepository(Family::class); 
$families = $familyRepo->findAll(); 
foreach ($families as $family) { 
    dump($family->getParent()->getName()); 
} 

我可以看到父母的名字甩並且只執行一個查詢,所以他們很好地連接。

但是,如果我試圖表明孩子:

dump($family->getChildren()->count()); 

我看到儘可能多的查詢,有家庭。

我怎樣才能讓父母親陪伴的孩子? (沒有更多疑問)

我忘了什麼?

沙发
0
0

在一個一對多的關係爲$children您可以指定如下,以預先抓取對象:

/** 
* @var ArrayCollection 
* 
* @ORMOneToMany(targetEntity="Family", mappedBy="parent", fetch="EAGER") 
*/ 
private $children; 

docs看到其他PARAMS。

+0

我希望孩子們不要一直熱切地提取。除此之外,我也嘗試過,但某些家庭仍然加載了額外的查詢。 –

+0

然後,在您的FamilyRepository中,您需要添加一個'findAllSomething'方法,您可以在其中添加連接「children」關係的查詢,以便在單個查詢中獲取它們。當你想要使用這種查找器而不是普通的'findAll'來保存查詢時。 – dlondero

+0

這是一個想法,我雖然沒有。我會試一試 –

板凳
0
0

按照@ dlondero的建議,我強制將深度提取放入存儲庫。

這裏是我做的事:

public function getRootNodes($eagerLevels = 5) 
{ 
    $qb = $this->createQueryBuilder('entity0') 
     ->select('partial entity0.{id, name, parent}') 
     ->where('entity0.parent IS NULL') 
    ; 
    for ($i = 0; $i < $eagerLevels; $i++) { 
     $qb 
      ->leftJoin('entity'.$i.'.children', 'entity'.($i+1)) 
      ->addSelect('partial entity'.($i+1).'.{id, name, parent}') 
     ; 
    } 

    return $qb->getQuery()->getResult(); 
} 

這部分提取正是我需要的所以沒有延遲加載發生。
我也做了深度配置的級別。

0
votes
answers
6 views
+10

bootstrap_3_layout.html.twig在Symfony3

-1

如何安裝「bootstrap_3_layout.html.twig,...爲我的項目在3個版本的Symfonybootstrap_3_layout.html.twig在Symfony3

當我將這些文件複製到項目中,我得到錯誤:

'Unexpected character "&"' (Twig_Error_Syntax).

沙发
0
0

不要複製或過去的這些文件,而是配置TwigBundle使用它們作爲表單模板,使這種配置在config.yml文件

twig: 
    form_themes: 
     - bootstrap_3_layout.html.twig 

確保bootst說唱應用程序中使用

使用此

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" /> 

或者下載它,當我創建新的項目Symfony3用它在你的應用程序

+0

當這些文件安裝在我的項目?附:我嘗試了這些步驟。我加載這些文件,但得到錯誤... –

+0

它們默認包含在項目中,在這裏檢查'vendor/symfony/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig'和告訴我,如果你發現他們 –

+0

沒關係。謝謝 –

0
votes
answers
6 views
+10

已登錄的用戶使用「FOSUser Bundle」而不先登出的「角色提升」

1

我正在使用FOSUser捆綁管理我爲我的同事在更大的Symfony項目之上創建的數據導出包的訪問我們公司的。 因此我創建了一個DataExportBundle,可以從Symfony項目中導出定義的數據部分。已登錄的用戶使用「FOSUser Bundle」而不先登出的「角色提升」

的DataexportBundle提供

  • 下載區爲我們的員工,他們可以選擇一個查詢和 在不同的格式,如JSON或CSV獲取數據。
  • 管理員可以管理(添加,編輯和刪除)員工下載區中可供選擇的數據庫查詢的管理區域。

必須保護「數據導出」下載區域,以便只有員工才能訪問它。匿名用戶不允許訪問此區域。 「數據導出」管理區域只能由一些具有額外管理角色的員工訪問。

因此,我啓用了一個角色層次在我的「security.yml」文件:

security: 
    role_hierarchy: 
     ROLE_USER:  [ROLE_USER] 
     ROLE_EDITORIAL: [ROLE_USER, ROLE_EDITORIAL] 
     ROLE_ADMIN:  [ROLE_USER, ROLE_EDITORIAL, ROLE_ADMIN] 
     ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_SUPER_ADMIN] 
    access_control: 
     - { path: ^/dataexport/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/dataexportadmin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/dataexport/, role: ROLE_EDITORIAL } 
     - { path: ^/dataexportadmin/, role: ROLE_ADMIN } 
     - { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    firewalls: 
     admin_secured: 
      context: site 
      pattern: ^/dataexportadmin/ 
      form_login: 
       provider: fos_userbundle 
       csrf_token_generator: security.csrf.token_manager 
       target_path_parameter: redirect_url 
       login_path: /dataexportadmin/login 
       check_path: /dataexportadmin/login_check 
      logout: 
       path: /dataexportadmin/logout 
      anonymous: true 
     main: 
      context: site 
      pattern: ^/dataexport/ 
      form_login: 
       provider: fos_userbundle 
       csrf_token_generator: security.csrf.token_manager 
       target_path_parameter: redirect_url 
       default_target_path: /dataexport/ 
       login_path: /dataexport/login 
       check_path: /dataexport/login_check 
      logout: 
       path: /dataexport/logout 
      anonymous: true 

正如你所看到的,我也定義了兩個防火牆。通過這樣做,我希望實現已登錄的具有「ROLE_EDITORIAL」角色(不具有「ROLE_ADMIN」角色)的用戶顯示的登錄表單,他可以作爲另一個用戶(必須具有「ROLE_ADMIN」角色集)。

我創建2個用戶:

sudo -u www-data bin/console fos:user:create employee_A 
sudo -u www-data bin/console fos:user:promote employee_A ROLE_EDITORIAL 

sudo -u www-data bin/console fos:user:create employee_B 
sudo -u www-data bin/console fos:user:promote employee_B ROLE_ADMIN 

我的問題是,這種「特權提升」是不行的;相反,當「employee_A」點擊指向「數據導出」管理區域的鏈接時,會顯示「403禁止訪問」頁面。我的計劃是在此處顯示登錄表單。如果登錄(並因此「特權提升」)失敗,則必須保留登錄用戶「employee_A」的角色「ROLE_EDITORIAL」。 我知道更常用的方式是用戶employee_A(ROLE_EDITORIAL)先註銷,然後以用戶employee_B(ROLE_ADMIN)登錄。這樣,捆綁包已經可以工作了,但是我想像我說的那樣實施一種「特權提升」。

我的問題是:如何使用「FOSUser bundle」或任何其他Symfony用戶管理包進行「特權提升」?

文件 「config.yml」:

fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: AppBundleEntityFosUser 
    from_email: 
     address: ... 
     sender_name: ... 

文件 「的routing.yml」:

dataexportadmin_login: 
    path: /dataexportadmin/login 
    defaults: { _controller: MyUserBundle:Security:login } 

dataexportadmin_login_check: 
    path: /dataexportadmin/login_check 
    defaults: { _controller: MyUserBundle:Security:check } 

dataexportadmin_logout: 
    path: /dataexportadmin/logout 
    defaults: { _controller: MyUserBundle:Security:logout } 

dataexport_login: 
    path: /dataexport/login 
    defaults: { _controller: MyUserBundle:Security:login } 

dataexport_login_check: 
    path: /dataexport/login_check 
    defaults: { _controller: MyUserBundle:Security:check } 

dataexport_logout: 
    path: /dataexport/logout 
    defaults: { _controller: MyUserBundle:Security:logout } 

dataexport_admin: 
    resource: "@DataexportBundle/Controller/QueryController.php" 
    type:  annotation 
    prefix: /dataexportadmin 
    options: 
     expose: true 

dataexport: 
    resource: "@DataexportBundle/Controller/DefaultController.php" 
    type:  annotation 
    prefix: /dataexport 
    options: 
     expose: true 

my_user: 
    resource: "@MyUserBundle/Controller/" 
    type:  annotation 
    prefix: /

文件 「我/ UserBundle /控制器/ SecurityController.php」

<?php 

namespace MyUserBundleController; 

use FOSUserBundleControllerSecurityController as BaseController; 

class SecurityController extends BaseController 
{ 
    public function renderLogin(array $data) 
    { 
     $requestAttributes = $this->container->get('request_stack')->getCurrentRequest(); 

     if ($requestAttributes->get('_route') === 'dataexportadmin_login') 
     { 
      $template = sprintf('MyUserBundle:Security:adminlogin.html.twig'); 
     } 
     else 
     { 
      $template = sprintf('MyUserBundle:Security:login.html.twig'); 
     } 

     return $this->container->get('templating')->renderResponse($template, $data); 
    } 
} 

兩個Twig模板之間的相關區別是表單標記的「action」屬性:

<form action="{{ path("dataexport_login_check") }}" method="post"> 

vs.

<form action="{{ path("dataexportadmin_login_check") }}" method="post"> 

感謝您的幫助!

沙发
0
0

使用FOS用戶軟件包只有用戶是否通過身份驗證或不是。 如果您登錄另一個用戶,您將更改登錄的用戶。

你可能想改變dataexportadmin安全:

  1. 低ACCESS_CONTROL水平
  2. 路線的形式在你捆綁
  3. 如果證書檢查,在$_SESSION['allowd_to_dataexportadmin_until']
  4. 設置截止日期行動
  5. 在您的導出包中爲每個動作分派一個事件,以檢查當前用戶是否具有AUTHORISED_ROLES(admin)或非空$_SESSION['allowd_to_dataexportadmin_until']或低於new DateTime()

希望這會有所幫助

0
votes
answers
6 views
+10

Symfony 4 AuthenticationUtils

2

我想創建一個基於symfony.com教程的symfony 4用戶登錄。Symfony 4 AuthenticationUtils

我用下面的代碼使用了基本的services.yaml文件。

https://symfony.com/doc/current/security/form_login_setup.html

public function loginAction(Request $request, Twig_Environment $twigRenderer,AuthenticationUtils $authUtils) 
{ 

    // get the login error if there is one 
    $error = $authUtils->getLastAuthenticationError(); 

    // last username entered by the user 
    $lastUsername = $authUtils->getLastUsername(); 


    return new response($twigRenderer->render('security/login.html.twig', array(
     'last_username' => $lastUsername, 
     'error'   => $error, 
     ) 
    )); 
} 

Errror:

控制器 「應用程序控制器 SecurityController ::在loginAction()」 要求您提供的 「$ authUtils」 參數的值。參數是可爲空的,並且沒有提供空值,沒有提供默認值,或者因爲在這之後有一個非可選參數。

我不知道如何解決這個問題。有人有建議嗎?

+0

我在4.0上遇到了同樣的問題,下面的兩條建議無效。我也嘗試注入構造函數(應該不重要),但結果相同。很奇怪,因爲我在測試3.4時遇到了同樣的問題,但最終得到了它的工作。這些修補程序是否適用於您@Erik –

沙发
0
2

我是同樣的問題..嘗試運行命令:

composer require security 
板凳
0
0

這些添加到您的services.yml解決這個錯誤:

AppBundleController: 
    resource: '../../src/AppBundle/Controller' 
    public: true 
    tags: ['controller.service_arguments'] 

退房這個問題: simple login form using symfony

希望得到這個幫助。

+0

這只是將控制器添加到依賴項注入中。這裏的問題是,'AuthenticationUtils'沒有被注入。可能是因爲安全組件(如@Guhh)建議缺失。 – wawa

地板
0
0

我有點晚了,但仍然在這裏添加其他引用。

請將autowire: true添加到您的控制器服務聲明中。 Symfony會自動爲你注入方法參數。

0
votes
answers
6 views
+10

用symfony

1

嗨下載計數器我想知道用symfony 3用symfony

下載計數器網/的.htaccess我:

RewriteRule ^/up/(.*).(jpg|zip|pdf)$ /download/counter/$1/$2 [R,L] 

在我的控制器的appbundle /控制器/ DefaultController.php我有:

/** 
    * @Route("/download/counter/{filename}/{ext}", name="downloadcounterfile") 
    */ 



    public function downloadcounterfileAction(Request $request) 
    { 
.... 
} 

但功能 「downloadcounterfileAction」 從不執行

+0

*但函數「downloadcounterfileAction」永遠不會執行* - 您可能有其他RewriteRules直接爲現有文件提供服務,而無需將其重寫到前端控制器。至少默認的Symfony'.htaccess'有這樣的規則。 – ccKep

+0

感謝您的建議。最後我找到了一個有效的解決方案:awstats !!!它給出了詳細的下載統計。我用它爲我的網站:sendeyo.com這是致力於文件託管;) – bestpostmaster

沙发
0
1

如果你想要去一個URL /up/xyz.jpg,實際上最終在/download/counter/xyz/jpg你可以只添加一個新的動作/端點/up/{filename},並解析文件名,分開擴展基名,檢查它們以確保它們在三有效的擴展。

也可能有三個別名路由到/up/路徑前綴:

/** 
* @Route("/download/counter/{filename}/{ext}", name="downloadcounterfile") 
* @Route("/up/{filename}.jpg", defaults={"ext"="jpg"}) 
* @Route("/up/{filename}.pdf", defaults={"ext"="pdf"}) 
* @Route("/up/{filename}.zip", defaults={"ext"="zip"}) 
*/ 
public function downloadcounterfileAction(Request $request, $filename, $ext) 
{ 
    echo "filename:$filename, ext:$ext
";die; 
} 

鑑於上述路線塊和方法,要的網址:/up/fred.zip顯示

filename:fred, ext:zip 

/download/counter/fred/zip與包含在列出的@Routes中的結果相同。

雖然如果在文件名中有一個完整的停止位置將會失敗 - No route found for "GET /up/fr.ed.zip"

+0

謝謝你的建議。最後我找到了一個有效的解決方案:awstats !!!它給出了詳細的下載統計。我將它用於我的網站:sendeyo.com,它專門用於文件託管 – bestpostmaster

0
votes
answers
6 views
+10

Symfony的:獲取實體radio_widget

0

隨着Symfony的,我有從實體無線電形式:Symfony的:獲取實體radio_widget

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('color', EntityType::class, [ 
      'class' => Color::class, 
      'expanded' => true, 
      'label_attr' => [ 
       'class' => 'radio-inline' 
      ], 
      'label' => 'label.color', 
      .... 

但是,當我轉儲()在radio_widget,我沒有實體:

array:28 [▼ 
    "value" => "1" 
    "attr" => [] 
    "form" => FormView {#975 ?} 
    "id" => "news_category_versions_0_color_1" 
    "name" => "1" 
    "full_name" => "news_category[versions][0][color]" 
    "disabled" => false 
    "label" => "Blue" 
    "label_format" => null 
    "multipart" => false 
    "block_prefixes" => array:4 [?] 
    "unique_block_prefix" => "_news_category_versions_entry_color_entry" 
    "translation_domain" => false 
    "cache_key" => "_news_category_versions_entry_color_entry_radio" 
    "errors" => FormErrorIterator {#1186 ?} 
    "valid" => true 
    "data" => false 
    "required" => true 
    "size" => null 
    "label_attr" => [] 
    "compound" => false 
    "method" => "POST" 
    "action" => "" 
    "submitted" => false 
    "help_translation_domain" => null 
    "checked" => false 
    "parent_label_class" => "radio-inline" 
    "app" => AppVariable {#1216 ?} 
] 

我可以在radio_widget中獲得實體嗎?每個收音機都有一個特定的顏色(藍色,紅色,綠色等)。

沙发
0
0

是的,它是可能的:

應用程序實體顏色:

namespace AppBundleForm; 


use AppBundleEntityColor; 
use AppBundleEntityColorProduct; 
use DoctrineORMEntityRepository; 
use SymfonyBridgeDoctrineFormTypeEntityType; 
use SymfonyComponentFormAbstractType; 
use SymfonyComponentFormFormBuilderInterface; 
use SymfonyComponentOptionsResolverOptionsResolver; 

class ColorProductType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('color', EntityType::class, array(
      'class'   => Color::class, 
      'choice_label' => 'name', 
      'query_builder' => function (EntityRepository $er) { 
       return $er->createQueryBuilder('c'); 
      }, 
      'expanded' => true, 
      'required' => true, 
     )); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => ColorProduct::class 
      ) 
     ); 
    } 
} 

namespace AppBundleEntity; 

use DoctrineORMMapping as ORM; 

/** 
* Class Color 
* 
* @package AppBundleEntity 
* 
* @ORMTable() 
* @ORMHasLifecycleCallbacks() 
* @ORMEntity(repositoryClass="AppBundleEntityColorRepository") 
*/ 
class Color 
{ 
    /** 
    * @var int $id 
    * @ORMId() 
    * @ORMColumn() 
    * @ORMGeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string $name 
    * @ORMColumn(type="string", length=255) 
    */ 
    protected $name; 

    /** 
    * @ORMOneToMany(targetEntity="ColorProduct", mappedBy="color", cascade={"all"}) 
    */ 
    protected $product; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->product = new DoctrineCommonCollectionsArrayCollection(); 
    } 

    /** 
    * Get id 
    * 
    * @return string 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * 
    * @return Color 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * Add product 
    * 
    * @param AppBundleEntityColorProduct $product 
    * 
    * @return Color 
    */ 
    public function addProduct(AppBundleEntityColorProduct $product) 
    { 
     $this->product[] = $product; 

     return $this; 
    } 

    /** 
    * Remove product 
    * 
    * @param AppBundleEntityColorProduct $product 
    */ 
    public function removeProduct(AppBundleEntityColorProduct $product) 
    { 
     $this->product->removeElement($product); 
    } 

    /** 
    * Get product 
    * 
    * @return DoctrineCommonCollectionsCollection 
    */ 
    public function getProduct() 
    { 
     return $this->product; 
    } 
} 

在ColorProductEntity

namespace AppBundleEntity; 

use SymfonyComponentValidatorConstraints as Assert; 
use DoctrineORMMapping as ORM; 

/** 
* @ORMTable() 
* @ORMHasLifecycleCallbacks() 
* @ORMEntity(repositoryClass="AppBundleEntityColorRepository") 
* 
*/ 
class ColorProduct 
{ 
    /** 
    * @var int $id 
    * @ORMId() 
    * @ORMColumn() 
    * @ORMGeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORMManyToOne(targetEntity="Color", inversedBy="product") 
    * @ORMJoinColumn(name="color_id", referencedColumnName="id") 
    */ 
    protected $color; 




    /** 
    * Get id 
    * 
    * @return string 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set color 
    * 
    * @param AppBundleEntityColor $color 
    * 
    * @return ColorProduct 
    */ 
    public function setColor(AppBundleEntityColor $color = null) 
    { 
     $this->color = $color; 

     return $this; 
    } 

    /** 
    * Get color 
    * 
    * @return AppBundleEntityColor 
    */ 
    public function getColor() 
    { 
     return $this->color; 
    } 
} 

爲colorProduct的formType與顏色實體一個關係

在控制器:

/** 
    * @Route("/product/color", name="product_color") 
    * @param SymfonyComponentHttpFoundationRequest $request 
    * 
    * @return SymfonyComponentHttpFoundationResponse 
    */ 
    public function addColorProduct(Request $request) { 
     $colorType = new ColorProduct(); 
     $form = $this->createForm(ColorProductType::class, $colorType); 

     $form->handleRequest($request); 

     if ($form->isSubmitted()) { 
      //......... 
     } 

     return $this->render('AppBundle:product:color.html.twig', array('form' => $form->createView())); 
    } 

嫩枝模板:

<h1>Color product</h1> 

{{ form_start(form) }} 
    {{ form_row(form.color) }} 
{{ form_end(form) }} 

其結果是:

enter image description here